diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cc1111/ao_radio.c | 77 | ||||
| -rw-r--r-- | src/drivers/ao_cc1120.c | 69 | ||||
| -rw-r--r-- | src/drivers/ao_cc1120.h | 6 | ||||
| -rw-r--r-- | src/drivers/ao_cc115l.c | 64 | 
4 files changed, 160 insertions, 56 deletions
| diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c index 8f519958..b9821a42 100644 --- a/src/cc1111/ao_radio.c +++ b/src/cc1111/ao_radio.c @@ -60,19 +60,19 @@   *   *	M = 1, E = 3, bw = 75kHz   * - * 20.5 kHz deviation, 9.6kbps signal + * 5.125 kHz deviation, 9.6kbps signal   * - *	m = 41 / 9.6, which is < 5.5: + *	m = 10.25 / 9.6, which is < 5.5:   * - *	bw = 2.6 * 20.5 + 0.55 * 9.6 = 58.58kHz + *	bw = 2.6 * 5.125 + 0.55 * 9.6 = 18.6kHz   * - *	M = 2, E = 3, bw = 62.5kHz + *	M = 2, E = 3, bw = 53.6kHz   * - * 20.5kHz deviation, 2.4kbps signal + * 1.28125kHz deviation, 2.4kbps signal   * - *	m = 41 / 2.4, which is > 5.5: + *	m = 2.565 / 2.4, which is < 5.5:   * - *	bw = 2.1 * 20.5 + 1.9 * 2.4 = 47.61kHz + *	bw = 2.6 * 20.5 + 1.9 * 2.4 = 47.61kHz   *   *	M = 3, E = 3, bw = 53.6kHz   * @@ -84,7 +84,7 @@   */  #define CHANBW_M_384	1 -#define CHANBW_M_96	2 +#define CHANBW_M_96	3  #define CHANBW_M_24	3  #define CHANBW_E	3 @@ -115,11 +115,19 @@   *   * F = 24e6/2**17 * (8 + DEVIATION_M) * 2**DEVIATION_E   * - * So M is 6 and E is 3 + * For 20.5kHz deviation, M is 6 and E is 3 + * For 5.125kHz deviation, M is 6 and E is 1 + * For 1.28125kHz deviation, M is 0 and E is 0   */ -#define DEVIATION_M	6 -#define DEVIATION_E	3 +#define DEVIATION_M_384	6 +#define DEVIATION_E_384	3 + +#define DEVIATION_M_96	6 +#define DEVIATION_E_96	1 + +#define DEVIATION_M_24	0 +#define DEVIATION_E_24	0  /*   * For our RDF beacon, set the symbol rate to 2kBaud (for a 1kHz tone), @@ -182,9 +190,6 @@ static __code uint8_t radio_setup[] = {  	RF_CHANNR_OFF,		0, -	RF_DEVIATN_OFF,		((DEVIATION_E << RF_DEVIATN_DEVIATION_E_SHIFT) | -				 (DEVIATION_M << RF_DEVIATN_DEVIATION_M_SHIFT)), -  	/* SmartRF says set LODIV_BUF_CURRENT_TX to 0  	 * And, we're not using power ramping, so use PA_POWER 0  	 */ @@ -284,8 +289,10 @@ static __code uint8_t fixed_pkt_setup[] = {  				 RF_MDMCFG1_NUM_PREAMBLE_4 |  				 (2 << RF_MDMCFG1_CHANSPC_E_SHIFT)), -	RF_DEVIATN_OFF,		((DEVIATION_E << RF_DEVIATN_DEVIATION_E_SHIFT) | -				 (DEVIATION_M << RF_DEVIATN_DEVIATION_M_SHIFT)), +#if !HAS_RADIO_RATE +	RF_DEVIATN_OFF,		((DEVIATION_E_384 << RF_DEVIATN_DEVIATION_E_SHIFT) | +				 (DEVIATION_M_384 << RF_DEVIATN_DEVIATION_M_SHIFT)), +#endif  	/* max packet length -- now set inline */  	RF_PKTCTRL1_OFF,	((1 << PKTCTRL1_PQT_SHIFT)| @@ -298,19 +305,34 @@ static __code uint8_t fixed_pkt_setup[] = {  };  #if HAS_RADIO_RATE -static __code uint8_t packet_rate_setup[] = { +static __code struct { +	uint8_t		mdmcfg4; +	uint8_t		deviatn; +} packet_rate_setup[] = {  	/* 38400 */ -	((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -	 (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) | -	 (DRATE_E_384 << RF_MDMCFG4_DRATE_E_SHIFT)), +	{ +		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | +		 (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) | +		 (DRATE_E_384 << RF_MDMCFG4_DRATE_E_SHIFT)), +		((DEVIATION_E_384 << RF_DEVIATN_DEVIATION_E_SHIFT) | +		 (DEVIATION_M_384 << RF_DEVIATN_DEVIATION_M_SHIFT)), +	},  	/* 9600 */ -	((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -	 (CHANBW_M_96 << RF_MDMCFG4_CHANBW_M_SHIFT) | -	 (DRATE_E_96 << RF_MDMCFG4_DRATE_E_SHIFT)), +	{ +		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | +		 (CHANBW_M_96 << RF_MDMCFG4_CHANBW_M_SHIFT) | +		 (DRATE_E_96 << RF_MDMCFG4_DRATE_E_SHIFT)), +		((DEVIATION_E_96 << RF_DEVIATN_DEVIATION_E_SHIFT) | +		 (DEVIATION_M_96 << RF_DEVIATN_DEVIATION_M_SHIFT)), +	},  	/* 2400 */ -	((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -	 (CHANBW_M_24 << RF_MDMCFG4_CHANBW_M_SHIFT) | -	 (DRATE_E_24 << RF_MDMCFG4_DRATE_E_SHIFT)), +	{ +		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | +		 (CHANBW_M_24 << RF_MDMCFG4_CHANBW_M_SHIFT) | +		 (DRATE_E_24 << RF_MDMCFG4_DRATE_E_SHIFT)), +		((DEVIATION_E_24 << RF_DEVIATN_DEVIATION_E_SHIFT) | +		 (DEVIATION_M_24 << RF_DEVIATN_DEVIATION_M_SHIFT)), +	},  };  #endif @@ -380,7 +402,8 @@ ao_radio_get(uint8_t len)  	RF_FREQ0 = (uint8_t) (ao_config.radio_setting);  	RF_PKTLEN = len;  #if HAS_RADIO_RATE -	RF_MDMCFG4 = packet_rate_setup[ao_config.radio_rate]; +	RF_MDMCFG4 = packet_rate_setup[ao_config.radio_rate].mdmcfg4; +	RF_DEVIATN = packet_rate_setup[ao_config.radio_rate].deviatn;  #endif  } diff --git a/src/drivers/ao_cc1120.c b/src/drivers/ao_cc1120.c index 1b907940..3ea8b704 100644 --- a/src/drivers/ao_cc1120.c +++ b/src/drivers/ao_cc1120.c @@ -290,15 +290,32 @@ ao_radio_idle(void)  }  /* - * Packet deviation is 20.5kHz + * Packet deviation   *   *	fdev = fosc >> 24 * (256 + dev_m) << dev_e   * + * Deviation for 38400 baud should be 20.5kHz: + *   *     	32e6Hz / (2 ** 24) * (256 + 80) * (2 ** 5) = 20508Hz + * + * Deviation for 9600 baud should be 5.125kHz: + * + *     	32e6Hz / (2 ** 24) * (256 + 80) * (2 ** 3) = 5127Hz + * + * Deviation for 2400 baud should be 1.28125kHz, but cc1111 and + * cc115l can't do that, so we'll use 1.5kHz instead: + * + *     	32e6Hz / (2 ** 24) * (256 + 137) * (2 ** 1) = 1499Hz   */ -#define PACKET_DEV_E	5 -#define PACKET_DEV_M	80 +#define PACKET_DEV_M_384	80 +#define PACKET_DEV_E_384	5 + +#define PACKET_DEV_M_96		80 +#define PACKET_DEV_E_96		3 + +#define PACKET_DEV_M_24		137 +#define PACKET_DEV_E_24		1  /*   * For our packet data @@ -307,41 +324,55 @@ ao_radio_idle(void)   *	Rdata = -------------------------------------- * fosc   *		             2 ** 39   * + * Given the bit period of the baseband, T, the bandwidth of the + * baseband signal is B = 1/(2T).  The overall bandwidth of the + * modulated signal is then Channel bandwidth = 2Δf + 2B. + * + * 38400 -- 2 * 20500 + 38400 = 79.4 kHz + *  9600 -- 2 * 5.125 +  9600 = 19.9 kHz + *  2400 -- 2 * 1.5   +  2400 =  5.4 khz + *   * Symbol rate 38400 Baud:   *   *	DATARATE_M = 239914   *	DATARATE_E = 9 - *	CHANBW = 74.42 (round to 100) + *	CHANBW = 79.4 (round to 100)   *   * Symbol rate 9600 Baud:   *   *	DATARATE_M = 239914   *	DATARATE_E = 7 - *	CHANBW = 58.58 (round to 62.5) + *	CHANBW = 19.9 (round to 20)   *   * Symbol rate 2400 Baud:   *   *	DATARATE_M = 239914   *	DATARATE_E = 5 - *	CHANBW = 47.61 (round to 50) + *	CHANBW = 5.0 (round to 8.0)   */  #define PACKET_DRATE_M	239914  #define PACKET_DRATE_E_384	9 -#define PACKET_CHAN_BW_384	0x02	/* 200 / 2 = 100 */ + +/* 200 / 2 = 100 */ +#define PACKET_CHAN_BW_384	((0 << CC1120_CHAN_BW_CHFILT_BYPASS) | \ +				 (CC1120_CHAN_BW_ADC_CIC_DECFACT_20 << CC1120_CHAN_BW_ADC_CIC_DECFACT) | \ +				 (2 << CC1120_CHAN_BW_BB_CIC_DECFACT))  #define PACKET_DRATE_E_96	7 -#define PACKET_CHAN_BW_96	0x42	/* 125 / 2 = 62.5 */ +/* 200 / 10 = 20 */ +#define PACKET_CHAN_BW_96	((0 << CC1120_CHAN_BW_CHFILT_BYPASS) | \ +				 (CC1120_CHAN_BW_ADC_CIC_DECFACT_20 << CC1120_CHAN_BW_ADC_CIC_DECFACT) | \ +				 (10 << CC1120_CHAN_BW_BB_CIC_DECFACT))  #define PACKET_DRATE_E_24	5 -#define PACKET_CHAN_BW_24	0x04	/* 200 / 4 = 50 */ +/* 200 / 25 = 8 */ +#define PACKET_CHAN_BW_24	((0 << CC1120_CHAN_BW_CHFILT_BYPASS) | \ +				 (CC1120_CHAN_BW_ADC_CIC_DECFACT_20 << CC1120_CHAN_BW_ADC_CIC_DECFACT) | \ +				 (25 << CC1120_CHAN_BW_BB_CIC_DECFACT))  static const uint16_t packet_setup[] = { -	CC1120_DEVIATION_M,	PACKET_DEV_M, -	CC1120_MODCFG_DEV_E,	((CC1120_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1120_MODCFG_DEV_E_MODEM_MODE) | -				 (CC1120_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1120_MODCFG_DEV_E_MOD_FORMAT) | -				 (PACKET_DEV_E << CC1120_MODCFG_DEV_E_DEV_E)),  	CC1120_DRATE1,		((PACKET_DRATE_M >> 8) & 0xff),  	CC1120_DRATE0,		((PACKET_DRATE_M >> 0) & 0xff),  	CC1120_PKT_CFG2,	((CC1120_PKT_CFG2_CCA_MODE_ALWAYS_CLEAR << CC1120_PKT_CFG2_CCA_MODE) | @@ -361,6 +392,10 @@ static const uint16_t packet_setup[] = {  };  static const uint16_t packet_setup_384[] = { +	CC1120_DEVIATION_M,	PACKET_DEV_M_384, +	CC1120_MODCFG_DEV_E,	((CC1120_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1120_MODCFG_DEV_E_MODEM_MODE) | +				 (CC1120_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1120_MODCFG_DEV_E_MOD_FORMAT) | +				 (PACKET_DEV_E_384 << CC1120_MODCFG_DEV_E_DEV_E)),  	CC1120_DRATE2,		((PACKET_DRATE_E_384 << CC1120_DRATE2_DATARATE_E) |  				 (((PACKET_DRATE_M >> 16) & CC1120_DRATE2_DATARATE_M_19_16_MASK) << CC1120_DRATE2_DATARATE_M_19_16)),  	CC1120_CHAN_BW,		PACKET_CHAN_BW_384, @@ -368,6 +403,10 @@ static const uint16_t packet_setup_384[] = {  };  static const uint16_t packet_setup_96[] = { +	CC1120_DEVIATION_M,	PACKET_DEV_M_96, +	CC1120_MODCFG_DEV_E,	((CC1120_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1120_MODCFG_DEV_E_MODEM_MODE) | +				 (CC1120_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1120_MODCFG_DEV_E_MOD_FORMAT) | +				 (PACKET_DEV_E_96 << CC1120_MODCFG_DEV_E_DEV_E)),  	CC1120_DRATE2,		((PACKET_DRATE_E_96 << CC1120_DRATE2_DATARATE_E) |  				 (((PACKET_DRATE_M >> 16) & CC1120_DRATE2_DATARATE_M_19_16_MASK) << CC1120_DRATE2_DATARATE_M_19_16)),  	CC1120_CHAN_BW,		PACKET_CHAN_BW_96, @@ -375,6 +414,10 @@ static const uint16_t packet_setup_96[] = {  };  static const uint16_t packet_setup_24[] = { +	CC1120_DEVIATION_M,	PACKET_DEV_M_24, +	CC1120_MODCFG_DEV_E,	((CC1120_MODCFG_DEV_E_MODEM_MODE_NORMAL << CC1120_MODCFG_DEV_E_MODEM_MODE) | +				 (CC1120_MODCFG_DEV_E_MOD_FORMAT_2_GFSK << CC1120_MODCFG_DEV_E_MOD_FORMAT) | +				 (PACKET_DEV_E_24 << CC1120_MODCFG_DEV_E_DEV_E)),  	CC1120_DRATE2,		((PACKET_DRATE_E_24 << CC1120_DRATE2_DATARATE_E) |  				 (((PACKET_DRATE_M >> 16) & CC1120_DRATE2_DATARATE_M_19_16_MASK) << CC1120_DRATE2_DATARATE_M_19_16)),  	CC1120_CHAN_BW,		PACKET_CHAN_BW_24, diff --git a/src/drivers/ao_cc1120.h b/src/drivers/ao_cc1120.h index 5d24c49a..943f3449 100644 --- a/src/drivers/ao_cc1120.h +++ b/src/drivers/ao_cc1120.h @@ -189,6 +189,12 @@  #define CC1120_FREQ_IF_CFG	0x0f  #define CC1120_IQIC		0x10  #define CC1120_CHAN_BW		0x11 +#define  CC1120_CHAN_BW_CHFILT_BYPASS		7 +#define  CC1120_CHAN_BW_ADC_CIC_DECFACT		6 +#define  CC1120_CHAN_BW_ADC_CIC_DECFACT_20		0 +#define  CC1120_CHAN_BW_ADC_CIC_DECFACT_32		1 +#define  CC1120_CHAN_BW_BB_CIC_DECFACT		0 +  #define CC1120_MDMCFG1		0x12  #define  CC1120_MDMCFG1_CARRIER_SENSE_GATE	7  #define  CC1120_MDMCFG1_FIFO_EN			6 diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c index b5103f9b..cf61acfe 100644 --- a/src/drivers/ao_cc115l.c +++ b/src/drivers/ao_cc115l.c @@ -249,23 +249,41 @@ ao_radio_idle(void)  }  /* - * Packet deviation is 20.5kHz + * Packet deviation   *   *	fdev = fosc >> 17 * (8 + dev_m) << dev_e   * + * For 38400 baud, use 20.5kHz: + *   *     	26e6 / (2 ** 17) * (8 + 5) * (2 ** 3) = 20630Hz + * + * For 9600 baud, use 5.125kHz: + * + *     	26e6 / (2 ** 17) * (8 + 5) * (2 ** 1) = 5157Hz + * + * For 2400 baud, use 1.5kHz: + * + *     	26e6 / (2 ** 17) * (8 + 0) * (2 ** 0) = 1587Hz   */ -#define PACKET_DEV_E	3 -#define PACKET_DEV_M	5 +#define PACKET_DEV_E_384	3 +#define PACKET_DEV_M_384	5 + +#define PACKET_DEV_E_96		1 +#define PACKET_DEV_M_96		5 + +#define PACKET_DEV_E_24		0 +#define PACKET_DEV_M_24		0  /* - * For our packet data, set the symbol rate to 38400 Baud + * For our packet data:   *   *              (256 + DATARATE_M) * 2 ** DATARATE_E   *	Rdata = -------------------------------------- * fosc   *		             2 ** 28   * + * For 38400 baud: + *   *		(256 + 131) * (2 ** 10) / (2**28) * 26e6 = 38383   *   *	DATARATE_M = 131 @@ -279,20 +297,33 @@ ao_radio_idle(void)  #define PACKET_DRATE_E_96	8  #define PACKET_DRATE_E_24	6 -static const uint16_t packet_rate_setup[] = { -	[AO_RADIO_RATE_38400] = ((0xf << 4) | -				 (PACKET_DRATE_E_384 << CC115L_MDMCFG4_DRATE_E)), - -	[AO_RADIO_RATE_9600] = ((0xf << 4) | -				(PACKET_DRATE_E_96 << CC115L_MDMCFG4_DRATE_E)), - -	[AO_RADIO_RATE_2400] = ((0xf << 4) | -				(PACKET_DRATE_E_24 << CC115L_MDMCFG4_DRATE_E)), +static const struct { +	uint8_t		mdmcfg4; +	uint8_t		deviatn; +} packet_rate_setup[] = { +	[AO_RADIO_RATE_38400] = { +		.mdmcfg4 = ((0xf << 4) | +			    (PACKET_DRATE_E_384 << CC115L_MDMCFG4_DRATE_E)), +		.deviatn = ((PACKET_DEV_E_384 << CC115L_DEVIATN_DEVIATION_E) | +			    (PACKET_DEV_M_384 << CC115L_DEVIATN_DEVIATION_M)), +	}, + +	[AO_RADIO_RATE_9600] = { +		.mdmcfg4 = ((0xf << 4) | +			    (PACKET_DRATE_E_96 << CC115L_MDMCFG4_DRATE_E)), +		.deviatn = ((PACKET_DEV_E_96 << CC115L_DEVIATN_DEVIATION_E) | +			    (PACKET_DEV_M_96 << CC115L_DEVIATN_DEVIATION_M)), +	}, + +	[AO_RADIO_RATE_2400] = { +		.mdmcfg4 = ((0xf << 4) | +			    (PACKET_DRATE_E_24 << CC115L_MDMCFG4_DRATE_E)), +		.deviatn = ((PACKET_DEV_E_24 << CC115L_DEVIATN_DEVIATION_E) | +			    (PACKET_DEV_M_24 << CC115L_DEVIATN_DEVIATION_M)), +	},  };  static const uint16_t packet_setup[] = { -	CC115L_DEVIATN,		((PACKET_DEV_E << CC115L_DEVIATN_DEVIATION_E) | -				 (PACKET_DEV_M << CC115L_DEVIATN_DEVIATION_M)),  	CC115L_MDMCFG3,		(PACKET_DRATE_M),  	CC115L_MDMCFG2,		(0x00 |  				 (CC115L_MDMCFG2_MOD_FORMAT_GFSK << CC115L_MDMCFG2_MOD_FORMAT) | @@ -418,7 +449,8 @@ ao_radio_set_mode(uint16_t new_mode)  	changes = new_mode & (~ao_radio_mode);  	if (changes & AO_RADIO_MODE_BITS_PACKET_TX) { -		ao_radio_reg_write(CC115L_MDMCFG4, packet_rate_setup[ao_config.radio_rate]); +		ao_radio_reg_write(CC115L_MDMCFG4, packet_rate_setup[ao_config.radio_rate].mdmcfg4); +		ao_radio_reg_write(CC115L_DEVIATN, packet_rate_setup[ao_config.radio_rate].deviatn);  		for (i = 0; i < sizeof (packet_setup) / sizeof (packet_setup[0]); i += 2)  			ao_radio_reg_write(packet_setup[i], packet_setup[i+1]); | 
