*
* 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
*
*/
#define CHANBW_M_384 1
-#define CHANBW_M_96 2
+#define CHANBW_M_96 3
#define CHANBW_M_24 3
#define CHANBW_E 3
*
* 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),
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
*/
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)|
};
#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
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
}
}
/*
- * 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
* 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) |
};
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,
};
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,
};
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,
#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
}
/*
- * 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
#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) |
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]);