altos: Reduce deviation at 2400/9600 baud
authorKeith Packard <keithp@keithp.com>
Sun, 7 Sep 2014 03:39:37 +0000 (20:39 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 7 Sep 2014 03:39:37 +0000 (20:39 -0700)
There's no reason to use 20.5kHz deviation at 2400 and 9600 baud, and
if we get a better receiver, we'll want to use narrower deviation to
have less bandwidth sucking noise into the radio. The new values are
(nominally) 5.125kHz deviation for 9600 baud and 1.5kHz deviation for
2400 baud.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_radio.c
src/drivers/ao_cc1120.c
src/drivers/ao_cc1120.h
src/drivers/ao_cc115l.c

index 8f519958ad350013671f0018fa0abae185ea7b6b..b9821a4237ab950caecebb6bac85defb30ccbff2 100644 (file)
  *
  *     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
 
  *
  * 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
 }
 
index 1b907940f6f1d5104c13fa43da120f9dfc1b882e..3ea8b7044b4cecb25f1880f5be5a3b1bbfb066cd 100644 (file)
@@ -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,
index 5d24c49a4be946d84d1dfede605d07e827bda57f..943f344958fcf9337dc1daa6033d48c3733e55d4 100644 (file)
 #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
index b5103f9bec5edb5692f758062f37ce740eea7cc2..cf61acfe9c4ae45a6def0d88caf05c8d3d0dac96 100644 (file)
@@ -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]);