diff options
| -rw-r--r-- | src/cc1111/ao_pins.h | 3 | ||||
| -rw-r--r-- | src/cc1111/ao_radio.c | 86 | 
2 files changed, 80 insertions, 9 deletions
| diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h index 2d524188..83a3c774 100644 --- a/src/cc1111/ao_pins.h +++ b/src/cc1111/ao_pins.h @@ -57,6 +57,7 @@  	#define HAS_IGNITE		1  	#define HAS_MONITOR		0  	#define HAS_TELEMETRY		1 +	#define HAS_RADIO_RATE		0	/* not enough space for this */  #endif  #if defined(TELEMETRUM_V_1_1) @@ -98,6 +99,7 @@  	#define HAS_IGNITE		1  	#define HAS_MONITOR		0  	#define HAS_TELEMETRY		1 +	#define HAS_RADIO_RATE		0	/* not enough space for this */  #endif  #if defined(TELEMETRUM_V_1_2) @@ -139,6 +141,7 @@  	#define HAS_IGNITE		1  	#define HAS_MONITOR		0  	#define HAS_TELEMETRY		1 +	#define HAS_RADIO_RATE		0	/* not enough space for this */  #endif  #if defined(TELEDONGLE_V_0_2) diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c index fbdf7762..8f519958 100644 --- a/src/cc1111/ao_radio.c +++ b/src/cc1111/ao_radio.c @@ -40,6 +40,42 @@  #define IF_FREQ_CONTROL	6  /* + *  http://www.ntia.doc.gov/files/ntia/publications/84-168.pdf + * + * Necessary bandwidth for a FSK modulated signal: + * + *	bw = 2.6d + 0.55b	1.5 < m < 5.5 + *	bw = 2.1d + 1.9b	5.5 < m < 20 + * + *	b is the modulation rate in bps + *	d is the peak deviation (from the center) + * + *	m = 2d / b + * + * 20.5 kHz deviation 38.4kbps signal: + * + *	m = 41 / 38.4, which is < 5.5: + * + *	bw = 2.6 * 20.5 + 0.55 * 38.4 = 74.42kHz + * + *	M = 1, E = 3, bw = 75kHz + * + * 20.5 kHz deviation, 9.6kbps signal + * + *	m = 41 / 9.6, which is < 5.5: + * + *	bw = 2.6 * 20.5 + 0.55 * 9.6 = 58.58kHz + * + *	M = 2, E = 3, bw = 62.5kHz + * + * 20.5kHz deviation, 2.4kbps signal + * + *	m = 41 / 2.4, which is > 5.5: + * + *	bw = 2.1 * 20.5 + 1.9 * 2.4 = 47.61kHz + * + *	M = 3, E = 3, bw = 53.6kHz + *   * For channel bandwidth of 93.75 kHz, the CHANBW_E and CHANBW_M values are   *   * BW = 24e6 / (8 * (4 + M) * 2 ** E) @@ -47,7 +83,9 @@   * So, M = 0 and E = 3   */ -#define CHANBW_M	0 +#define CHANBW_M_384	1 +#define CHANBW_M_96	2 +#define CHANBW_M_24	3  #define CHANBW_E	3  /* @@ -55,12 +93,23 @@   *   * R = (256 + M) * 2** E * 24e6 / 2**28   * - * So M is 163 and E is 10 + * So for 38360kBaud, M is 163 and E is 10   */ -#define DRATE_E		10  #define DRATE_M		163 +#define DRATE_E_384	10 + +/* For 9600 baud, M is 163 and E is 8 + */ + +#define DRATE_E_96	8 + +/* For 2400 baud, M is 163 and E is 6 + */ + +#define DRATE_E_24	6 +  /*   * For a channel deviation of 20.5kHz, the DEVIATION_E and DEVIATION_M values are:   * @@ -122,9 +171,6 @@ static __code uint8_t radio_setup[] = {  	RF_FSCTRL1_OFF,		(IF_FREQ_CONTROL << RF_FSCTRL1_FREQ_IF_SHIFT),  	RF_FSCTRL0_OFF,		(0 << RF_FSCTRL0_FREQOFF_SHIFT), -	RF_MDMCFG4_OFF,		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -				 (CHANBW_M << RF_MDMCFG4_CHANBW_M_SHIFT) | -				 (DRATE_E << RF_MDMCFG4_DRATE_E_SHIFT)),  	RF_MDMCFG3_OFF,		(DRATE_M << RF_MDMCFG3_DRATE_M_SHIFT),  	RF_MDMCFG2_OFF,		(RF_MDMCFG2_DEM_DCFILT_ON |  				 RF_MDMCFG2_MOD_FORMAT_GFSK | @@ -204,7 +250,7 @@ static __code uint8_t radio_setup[] = {  static __code uint8_t rdf_setup[] = {  	RF_MDMCFG4_OFF,		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -				 (CHANBW_M << RF_MDMCFG4_CHANBW_M_SHIFT) | +				 (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) |  				 (RDF_DRATE_E << RF_MDMCFG4_DRATE_E_SHIFT)),  	RF_MDMCFG3_OFF,		(RDF_DRATE_M << RF_MDMCFG3_DRATE_M_SHIFT),  	RF_MDMCFG2_OFF,		(RF_MDMCFG2_DEM_DCFILT_OFF | @@ -225,9 +271,11 @@ static __code uint8_t rdf_setup[] = {  };  static __code uint8_t fixed_pkt_setup[] = { +#if !HAS_RADIO_RATE  	RF_MDMCFG4_OFF,		((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | -				 (CHANBW_M << RF_MDMCFG4_CHANBW_M_SHIFT) | -				 (DRATE_E << RF_MDMCFG4_DRATE_E_SHIFT)), +				 (CHANBW_M_384 << RF_MDMCFG4_CHANBW_M_SHIFT) | +				 (DRATE_E_384 << RF_MDMCFG4_DRATE_E_SHIFT)), +#endif  	RF_MDMCFG3_OFF,		(DRATE_M << RF_MDMCFG3_DRATE_M_SHIFT),  	RF_MDMCFG2_OFF,		(RF_MDMCFG2_DEM_DCFILT_ON |  				 RF_MDMCFG2_MOD_FORMAT_GFSK | @@ -249,6 +297,23 @@ static __code uint8_t fixed_pkt_setup[] = {  				 RF_PKTCTRL0_LENGTH_CONFIG_FIXED),  }; +#if HAS_RADIO_RATE +static __code uint8_t 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)), +	/* 9600 */ +	((CHANBW_E << RF_MDMCFG4_CHANBW_E_SHIFT) | +	 (CHANBW_M_96 << RF_MDMCFG4_CHANBW_M_SHIFT) | +	 (DRATE_E_96 << RF_MDMCFG4_DRATE_E_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)), +}; +#endif +  __xdata uint8_t	ao_radio_dma;  __xdata uint8_t ao_radio_dma_done;  __xdata uint8_t ao_radio_done; @@ -314,6 +379,9 @@ ao_radio_get(uint8_t len)  	RF_FREQ1 = (uint8_t) (ao_config.radio_setting >> 8);  	RF_FREQ0 = (uint8_t) (ao_config.radio_setting);  	RF_PKTLEN = len; +#if HAS_RADIO_RATE +	RF_MDMCFG4 = packet_rate_setup[ao_config.radio_rate]; +#endif  } | 
