altos: Perform cc1200 calibration less often. Tweak radio params
authorKeith Packard <keithp@keithp.com>
Sun, 26 Oct 2014 00:44:48 +0000 (17:44 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 26 Oct 2014 00:44:48 +0000 (17:44 -0700)
This performs calibration after every 4 operations, or when the
frequency changes. This reduces the time it takes to get to receive
mode.

This also makes the sync and preamble qualifiers more strict to reject
bad packets.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_cc1200.c
src/drivers/ao_cc1200_CC1200.h

index 39d3d522b8770ccc5313e74ea805f9706cd1f8cb..a3c1cbd4f92d390d556da7e43bdf86e2bdffe1ac 100644 (file)
@@ -219,18 +219,18 @@ ao_radio_idle(void)
 {
        for (;;) {
                uint8_t state = (ao_radio_strobe(CC1200_SIDLE) >> CC1200_STATUS_STATE) & CC1200_STATUS_STATE_MASK;
-               if (state == CC1200_STATUS_STATE_IDLE) {
-                       ao_radio_strobe(CC1200_SFTX);
-                       ao_radio_strobe(CC1200_SFRX);
+               if (state == CC1200_STATUS_STATE_IDLE)
                        break;
-               }
                if (state == CC1200_STATUS_STATE_TX_FIFO_ERROR)
                        ao_radio_strobe(CC1200_SFTX);
                if (state == CC1200_STATUS_STATE_RX_FIFO_ERROR)
                        ao_radio_strobe(CC1200_SFRX);
        }
-       /* Flush any pending TX bytes */
+       /* Flush any pending data in the fifos */
        ao_radio_strobe(CC1200_SFTX);
+       ao_radio_strobe(CC1200_SFRX);
+       /* Make sure the RF calibration is current */
+       ao_radio_strobe(CC1200_SCAL);
 }
 
 /*
@@ -635,6 +635,8 @@ ao_radio_setup(void)
 
        ao_radio_mode = 0;
 
+       ao_radio_idle();
+
        ao_config_get();
 
        ao_radio_configured = 1;
@@ -666,6 +668,7 @@ ao_radio_get(uint8_t len)
                ao_radio_reg_write(CC1200_FREQ1, ao_config.radio_setting >> 8);
                ao_radio_reg_write(CC1200_FREQ0, ao_config.radio_setting);
                last_radio_setting = ao_config.radio_setting;
+               ao_radio_strobe(CC1200_SCAL);
        }
        if (ao_config.radio_rate != last_radio_rate) {
                ao_radio_mode &= ~AO_RADIO_MODE_BITS_PACKET;
@@ -994,9 +997,8 @@ uint8_t
 ao_radio_recv(__xdata void *d, uint8_t size, uint8_t timeout)
 {
        ao_radio_abort = 0;
-       ao_radio_wake = 0;
+
        ao_radio_get(size - 2);
-       ao_radio_idle();
        ao_radio_set_mode(AO_RADIO_MODE_PACKET_RX);
        ao_radio_wake = 0;
        ao_radio_start_rx();
index ab642f70878a167d983b3f8c7412178a892ee582..c078c09d3a628795b1fd9ab65fe9d419b688cc21 100644 (file)
@@ -34,7 +34,7 @@
         CC1200_SYNC0,                        0x91,       /* Sync Word Configuration [7:0] */
         CC1200_SYNC_CFG1,                                /* Sync Word Detection Configuration Reg. 1 */
                ((CC1200_SYNC_CFG1_SYNC_MODE_16_BITS << CC1200_SYNC_CFG1_SYNC_MODE) |
-                (12 << CC1200_SYNC_CFG1_SYNC_THR)),
+                (11 << CC1200_SYNC_CFG1_SYNC_THR)),
         CC1200_SYNC_CFG0,                                /* Sync Word Detection Configuration Reg. 0 */
                ((1 << CC1200_SYNC_CFG0_AUTO_CLEAR) |
                 (0 << CC1200_SYNC_CFG0_RX_CONFIG_LIMITATION) |
@@ -46,7 +46,7 @@
         CC1200_PREAMBLE_CFG0,                           /* Preamble Detection Configuration Reg. 0 */
                ((1 << CC1200_PREAMBLE_CFG0_PQT_EN) |
                 (CC1200_PREAMBLE_CFG0_PQT_VALID_TIMEOUT_11 << CC1200_PREAMBLE_CFG0_PQT_VALID_TIMEOUT) |
-                (12 << CC1200_PREAMBLE_CFG0_PQT)),
+                (6 << CC1200_PREAMBLE_CFG0_PQT)),
         CC1200_IQIC,                         0xcb,       /* Digital Image Channel Compensation Configuration */
         CC1200_CHAN_BW,                      0x11,       /* Channel Filter Configuration */
         CC1200_MDMCFG1,                      0x40,       /* General Modem Parameter Configuration Reg. 1 */
@@ -60,7 +60,7 @@
         CC1200_AGC_CFG0,                     0x87,       /* Automatic Gain Control Configuration Reg. 0 */
         CC1200_FIFO_CFG,                     0x40,       /* FIFO Configuration */
        CC1200_SETTLING_CFG,                             /* Frequency Synthesizer Calibration and Settling Configuration */
-               ((CC1200_SETTLING_CFG_FS_AUTOCAL_IDLE_TO_ON << CC1200_SETTLING_CFG_FS_AUTOCAL) |
+               ((CC1200_SETTLING_CFG_FS_AUTOCAL_EVERY_4TH_TIME << CC1200_SETTLING_CFG_FS_AUTOCAL) |
                 (CC1200_SETTLING_CFG_LOCK_TIME_75_30 << CC1200_SETTLING_CFG_LOCK_TIME) |
                 (CC1200_SETTLING_CFG_FSREG_TIME_60 << CC1200_SETTLING_CFG_FSREG_TIME)),
         CC1200_FS_CFG,                                   /* Frequency Synthesizer Configuration */