altos: Reset interrupt flags before TX in CC1200 driver
[fw/altos] / src / drivers / ao_cc1200.c
index 39d3d522b8770ccc5313e74ea805f9706cd1f8cb..930680b286722ec7bf96c0eb6a0faa886d3b515f 100644 (file)
@@ -28,8 +28,14 @@ static uint8_t ao_radio_abort;               /* radio operation should abort */
 
 int8_t ao_radio_rssi;                  /* Last received RSSI value */
 
+#ifndef CC1200_DEBUG
 #define CC1200_DEBUG           0
+#endif
+
+#ifndef CC1200_LOW_LEVEL_DEBUG
 #define CC1200_LOW_LEVEL_DEBUG 0
+#endif
+
 #define CC1200_TRACE           0
 #define CC1200_APRS_TRACE      0
 
@@ -37,7 +43,7 @@ extern const uint32_t ao_radio_cal;
 
 #define FOSC   40000000
 
-#define ao_radio_select()      ao_spi_get_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS,AO_SPI_SPEED_125kHz)
+#define ao_radio_select()      ao_spi_get_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS,AO_SPI_SPEED_FAST)
 #define ao_radio_deselect()    ao_spi_put_mask(AO_CC1200_SPI_CS_PORT,(1 << AO_CC1200_SPI_CS_PIN),AO_CC1200_SPI_BUS)
 #define ao_radio_spi_send(d,l) ao_spi_send((d), (l), AO_CC1200_SPI_BUS)
 #define ao_radio_spi_send_fixed(d,l) ao_spi_send_fixed((d), (l), AO_CC1200_SPI_BUS)
@@ -219,18 +225,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 +641,8 @@ ao_radio_setup(void)
 
        ao_radio_mode = 0;
 
+       ao_radio_idle();
+
        ao_config_get();
 
        ao_radio_configured = 1;
@@ -666,6 +674,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;
@@ -739,6 +748,8 @@ ao_rdf_start(uint8_t len)
 static void
 ao_radio_run(void)
 {
+       ao_radio_wake = 0;
+       ao_radio_abort = 0;
        ao_radio_start_tx();
        ao_radio_wait_isr(0);
        if (!ao_radio_wake)
@@ -855,6 +866,7 @@ ao_radio_send_aprs(ao_radio_fill_func fill)
        uint8_t started = 0;
        uint8_t fifo_space;
 
+       ao_radio_abort = 0;
        ao_radio_get(0xff);
        fifo_space = CC1200_FIFO_SIZE;
        while (!done) {
@@ -994,9 +1006,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();