altos: Clear any broken cc1120 TX fifo bits before transmitting
authorKeith Packard <keithp@keithp.com>
Mon, 29 Apr 2013 06:05:18 +0000 (23:05 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 03:07:52 +0000 (20:07 -0700)
This just goes and clears the transmitter before using it, just in
case it got wedged somehow. It also clears the bits while waiting for
the radio to go idle, otherwise it'd never make it.

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

index bad0c856288112dcd7653f81795b250f5844cf8c..07ebf8356cf5f3e108d4eaa202fd64e19d840d03 100644 (file)
@@ -272,6 +272,8 @@ ao_radio_idle(void)
                uint8_t state = ao_radio_strobe(CC1120_SIDLE);
                if ((state >> CC1120_STATUS_STATE) == CC1120_STATUS_STATE_IDLE)
                        break;
+               if ((state >> CC1120_STATUS_STATE) == CC1120_STATUS_STATE_TX_FIFO_ERROR)
+                       ao_radio_strobe(CC1120_SFTX);
        }
        /* Flush any pending TX bytes */
        ao_radio_strobe(CC1120_SFTX);
@@ -715,11 +717,17 @@ ao_radio_send(const void *d, uint8_t size)
        uint8_t         this_len;
        uint8_t         started = 0;
        uint8_t         fifo_space;
+       uint8_t         q;
 
        encode_len = ao_fec_encode(d, size, tx_data);
 
        ao_radio_get(encode_len);
 
+       ao_radio_abort = 0;
+
+       /* Flush any pending TX bytes */
+       ao_radio_strobe(CC1120_SFTX);
+
        started = 0;
        fifo_space = CC1120_FIFO_SIZE;
        while (encode_len) {