HelloWorld_IDS01A4 mbed application for Spirit1 P2P demo.

Dependencies:   mbed

Fork of HelloWorld_IDS01A5_Program by rosarium pila

mbed 2.0 (a.k.a classic) HelloWorld example for Spirit1 to transfer data from one node to another.
To send the predefined data packet from the sender to the receiver, user needs to press User Button on the board. The LED on the receiver expansion board will toggle on reception of data successfully.
Data packets sent and received can be seen on USB serial terminal.

EVALUATION BOARDS RF FREQUENCY DESCRIPTION :
X-NUCLEO-IDS01A4 868 MHz 868 MHz RF expansion board based on SPIRIT1

Committer:
rosarium
Date:
Thu May 25 16:38:55 2017 +0000
Revision:
0:2ddc0583bcec
First draft version of HelloWorld_IDS01A5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:2ddc0583bcec 1 /*** Mbed Includes ***/
rosarium 0:2ddc0583bcec 2 #include "SimpleSpirit1.h"
rosarium 0:2ddc0583bcec 3 #include "radio_spi.h"
rosarium 0:2ddc0583bcec 4
rosarium 0:2ddc0583bcec 5 #define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_3)
rosarium 0:2ddc0583bcec 6
rosarium 0:2ddc0583bcec 7 static uint16_t last_state;
rosarium 0:2ddc0583bcec 8 #define SPIRIT1_STATUS() ((last_state = (uint16_t)refresh_state()) & SPIRIT1_STATE_STATEBITS)
rosarium 0:2ddc0583bcec 9
rosarium 0:2ddc0583bcec 10 #define XO_ON (0x1)
rosarium 0:2ddc0583bcec 11
rosarium 0:2ddc0583bcec 12 #define BUSYWAIT_UNTIL(cond, millisecs) \
rosarium 0:2ddc0583bcec 13 do { \
rosarium 0:2ddc0583bcec 14 uint32_t start = us_ticker_read(); \
rosarium 0:2ddc0583bcec 15 while (!(cond) && ((us_ticker_read() - start) < ((uint32_t)millisecs)*1000U)); \
rosarium 0:2ddc0583bcec 16 } while(0)
rosarium 0:2ddc0583bcec 17
rosarium 0:2ddc0583bcec 18 #define st_lib_spirit_irqs SpiritIrqs
rosarium 0:2ddc0583bcec 19
rosarium 0:2ddc0583bcec 20 #define STATE_TIMEOUT (100)
rosarium 0:2ddc0583bcec 21
rosarium 0:2ddc0583bcec 22 // betzw: switching force & back from standby is on some devices quite unstable
rosarium 0:2ddc0583bcec 23 #define USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 24
rosarium 0:2ddc0583bcec 25 /*** Class Implementation ***/
rosarium 0:2ddc0583bcec 26 /** Static Class Variables **/
rosarium 0:2ddc0583bcec 27 SimpleSpirit1 *SimpleSpirit1::_singleton = NULL;
rosarium 0:2ddc0583bcec 28
rosarium 0:2ddc0583bcec 29 /** Constructor **/
rosarium 0:2ddc0583bcec 30 SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
rosarium 0:2ddc0583bcec 31 PinName irq, PinName cs, PinName sdn,
rosarium 0:2ddc0583bcec 32 PinName led) :
rosarium 0:2ddc0583bcec 33 _spi(mosi, miso, sclk),
rosarium 0:2ddc0583bcec 34 _irq(irq),
rosarium 0:2ddc0583bcec 35 _chip_select(cs),
rosarium 0:2ddc0583bcec 36 _shut_down(sdn),
rosarium 0:2ddc0583bcec 37 _led(led),
rosarium 0:2ddc0583bcec 38 _current_irq_callback(),
rosarium 0:2ddc0583bcec 39 _rx_receiving_timeout()
rosarium 0:2ddc0583bcec 40 {
rosarium 0:2ddc0583bcec 41 }
rosarium 0:2ddc0583bcec 42
rosarium 0:2ddc0583bcec 43 /** Init Function **/
rosarium 0:2ddc0583bcec 44 void SimpleSpirit1::init() {
rosarium 0:2ddc0583bcec 45 /* reset irq disable counter and irq callback & disable irq */
rosarium 0:2ddc0583bcec 46 _nr_of_irq_disables = 0;
rosarium 0:2ddc0583bcec 47 disable_spirit_irq();
rosarium 0:2ddc0583bcec 48
rosarium 0:2ddc0583bcec 49 /* unselect chip */
rosarium 0:2ddc0583bcec 50 chip_unselect();
rosarium 0:2ddc0583bcec 51
rosarium 0:2ddc0583bcec 52 /* configure spi */
rosarium 0:2ddc0583bcec 53 _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */
rosarium 0:2ddc0583bcec 54 _spi.frequency(1000000); // 1MHz // betzw: heuristic value // betzw - NOTE: high frequencies lead to instability of Spirit1
rosarium 0:2ddc0583bcec 55
rosarium 0:2ddc0583bcec 56 /* install irq handler */
rosarium 0:2ddc0583bcec 57 _irq.mode(PullUp);
rosarium 0:2ddc0583bcec 58 _irq.fall(Callback<void()>(this, &SimpleSpirit1::IrqHandler));
rosarium 0:2ddc0583bcec 59
rosarium 0:2ddc0583bcec 60 /* init cube vars */
rosarium 0:2ddc0583bcec 61 spirit_on = OFF;
rosarium 0:2ddc0583bcec 62 last_rssi = 0 ; //MGR
rosarium 0:2ddc0583bcec 63 last_sqi = 0 ; //MGR
rosarium 0:2ddc0583bcec 64
rosarium 0:2ddc0583bcec 65 /* set frequencies */
rosarium 0:2ddc0583bcec 66 radio_set_xtal_freq(XTAL_FREQUENCY);
rosarium 0:2ddc0583bcec 67 mgmt_set_freq_base((uint32_t)BASE_FREQUENCY);
rosarium 0:2ddc0583bcec 68
rosarium 0:2ddc0583bcec 69 /* restart board */
rosarium 0:2ddc0583bcec 70 enter_shutdown();
rosarium 0:2ddc0583bcec 71 exit_shutdown();
rosarium 0:2ddc0583bcec 72
rosarium 0:2ddc0583bcec 73 /* soft core reset */
rosarium 0:2ddc0583bcec 74 cmd_strobe(SPIRIT1_STROBE_SRES);
rosarium 0:2ddc0583bcec 75
rosarium 0:2ddc0583bcec 76 /* Configures the SPIRIT1 radio part */
rosarium 0:2ddc0583bcec 77 SRadioInit x_radio_init = {
rosarium 0:2ddc0583bcec 78 XTAL_OFFSET_PPM,
rosarium 0:2ddc0583bcec 79 (uint32_t)BASE_FREQUENCY,
rosarium 0:2ddc0583bcec 80 (uint32_t)CHANNEL_SPACE,
rosarium 0:2ddc0583bcec 81 CHANNEL_NUMBER,
rosarium 0:2ddc0583bcec 82 MODULATION_SELECT,
rosarium 0:2ddc0583bcec 83 DATARATE,
rosarium 0:2ddc0583bcec 84 (uint32_t)FREQ_DEVIATION,
rosarium 0:2ddc0583bcec 85 (uint32_t)BANDWIDTH
rosarium 0:2ddc0583bcec 86 };
rosarium 0:2ddc0583bcec 87 radio_init(&x_radio_init);
rosarium 0:2ddc0583bcec 88 radio_set_pa_level_dbm(0,POWER_DBM);
rosarium 0:2ddc0583bcec 89 radio_set_pa_level_max_index(0);
rosarium 0:2ddc0583bcec 90
rosarium 0:2ddc0583bcec 91 /* Configures the SPIRIT1 packet handler part*/
rosarium 0:2ddc0583bcec 92 PktBasicInit x_basic_init = {
rosarium 0:2ddc0583bcec 93 PREAMBLE_LENGTH,
rosarium 0:2ddc0583bcec 94 SYNC_LENGTH,
rosarium 0:2ddc0583bcec 95 SYNC_WORD,
rosarium 0:2ddc0583bcec 96 LENGTH_TYPE,
rosarium 0:2ddc0583bcec 97 LENGTH_WIDTH,
rosarium 0:2ddc0583bcec 98 CRC_MODE,
rosarium 0:2ddc0583bcec 99 CONTROL_LENGTH,
rosarium 0:2ddc0583bcec 100 EN_ADDRESS,
rosarium 0:2ddc0583bcec 101 EN_FEC,
rosarium 0:2ddc0583bcec 102 EN_WHITENING
rosarium 0:2ddc0583bcec 103 };
rosarium 0:2ddc0583bcec 104 pkt_basic_init(&x_basic_init);
rosarium 0:2ddc0583bcec 105
rosarium 0:2ddc0583bcec 106 /* Enable the following interrupt sources, routed to GPIO */
rosarium 0:2ddc0583bcec 107 irq_de_init(NULL);
rosarium 0:2ddc0583bcec 108 irq_clear_status();
rosarium 0:2ddc0583bcec 109 irq_set_status(TX_DATA_SENT, S_ENABLE);
rosarium 0:2ddc0583bcec 110 irq_set_status(RX_DATA_READY,S_ENABLE);
rosarium 0:2ddc0583bcec 111 irq_set_status(RX_DATA_DISC, S_ENABLE);
rosarium 0:2ddc0583bcec 112 irq_set_status(VALID_SYNC, S_ENABLE);
rosarium 0:2ddc0583bcec 113 irq_set_status(TX_FIFO_ERROR, S_ENABLE);
rosarium 0:2ddc0583bcec 114 irq_set_status(RX_FIFO_ERROR, S_ENABLE);
rosarium 0:2ddc0583bcec 115 #ifndef RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 116 irq_set_status(TX_FIFO_ALMOST_EMPTY, S_ENABLE);
rosarium 0:2ddc0583bcec 117 irq_set_status(RX_FIFO_ALMOST_FULL, S_ENABLE);
rosarium 0:2ddc0583bcec 118 #endif // !RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 119
rosarium 0:2ddc0583bcec 120 /* Configure Spirit1 */
rosarium 0:2ddc0583bcec 121 radio_persistent_rx(S_ENABLE);
rosarium 0:2ddc0583bcec 122 qi_set_sqi_threshold(SQI_TH_0);
rosarium 0:2ddc0583bcec 123 qi_sqi_check(S_ENABLE);
rosarium 0:2ddc0583bcec 124 qi_set_rssi_threshold_dbm(CCA_THRESHOLD);
rosarium 0:2ddc0583bcec 125 timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD);
rosarium 0:2ddc0583bcec 126 timer_set_infinite_rx_timeout();
rosarium 0:2ddc0583bcec 127 radio_afc_freeze_on_sync(S_ENABLE);
rosarium 0:2ddc0583bcec 128 calibration_rco(S_ENABLE);
rosarium 0:2ddc0583bcec 129
rosarium 0:2ddc0583bcec 130 spirit_on = OFF;
rosarium 0:2ddc0583bcec 131 CLEAR_TXBUF();
rosarium 0:2ddc0583bcec 132 CLEAR_RXBUF();
rosarium 0:2ddc0583bcec 133 _spirit_tx_started = false;
rosarium 0:2ddc0583bcec 134 _is_receiving = false;
rosarium 0:2ddc0583bcec 135
rosarium 0:2ddc0583bcec 136 /* Configure the radio to route the IRQ signal to its GPIO 3 */
rosarium 0:2ddc0583bcec 137 SGpioInit x_gpio_init = {
rosarium 0:2ddc0583bcec 138 SPIRIT_GPIO_IRQ,
rosarium 0:2ddc0583bcec 139 SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,
rosarium 0:2ddc0583bcec 140 SPIRIT_GPIO_DIG_OUT_IRQ
rosarium 0:2ddc0583bcec 141 };
rosarium 0:2ddc0583bcec 142 spirit_gpio_init(&x_gpio_init);
rosarium 0:2ddc0583bcec 143
rosarium 0:2ddc0583bcec 144 /* Setup CSMA/CA */
rosarium 0:2ddc0583bcec 145 CsmaInit x_csma_init = {
rosarium 0:2ddc0583bcec 146 S_ENABLE, // enable persistent mode
rosarium 0:2ddc0583bcec 147 TBIT_TIME_64, // Tcca time
rosarium 0:2ddc0583bcec 148 TCCA_TIME_3, // Lcca length
rosarium 0:2ddc0583bcec 149 3, // max nr of backoffs (<8)
rosarium 0:2ddc0583bcec 150 1, // BU counter seed
rosarium 0:2ddc0583bcec 151 8 // BU prescaler
rosarium 0:2ddc0583bcec 152 };
rosarium 0:2ddc0583bcec 153 csma_ca_init(&x_csma_init);
rosarium 0:2ddc0583bcec 154
rosarium 0:2ddc0583bcec 155 #ifdef USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 156 /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */
rosarium 0:2ddc0583bcec 157 cmd_strobe(SPIRIT1_STROBE_STANDBY);
rosarium 0:2ddc0583bcec 158 #endif // USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 159 }
rosarium 0:2ddc0583bcec 160
rosarium 0:2ddc0583bcec 161 static volatile int tx_fifo_remaining = 0; // to be used in irq handler
rosarium 0:2ddc0583bcec 162 static volatile int tx_buffer_pos = 0; // to be used in irq handler
rosarium 0:2ddc0583bcec 163 const volatile uint8_t *tx_fifo_buffer = NULL; // to be used in irq handler
rosarium 0:2ddc0583bcec 164 int SimpleSpirit1::send(const void *payload, unsigned int payload_len) {
rosarium 0:2ddc0583bcec 165 /* Checks if the payload length is supported */
rosarium 0:2ddc0583bcec 166 if(payload_len > MAX_PACKET_LEN) {
rosarium 0:2ddc0583bcec 167 return RADIO_TX_ERR;
rosarium 0:2ddc0583bcec 168 }
rosarium 0:2ddc0583bcec 169
rosarium 0:2ddc0583bcec 170 disable_spirit_irq();
rosarium 0:2ddc0583bcec 171
rosarium 0:2ddc0583bcec 172 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 173 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 174 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 175 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, last_state>>1);
rosarium 0:2ddc0583bcec 176 }
rosarium 0:2ddc0583bcec 177 #endif
rosarium 0:2ddc0583bcec 178
rosarium 0:2ddc0583bcec 179 /* Reset State to Ready */
rosarium 0:2ddc0583bcec 180 set_ready_state();
rosarium 0:2ddc0583bcec 181
rosarium 0:2ddc0583bcec 182 cmd_strobe(SPIRIT1_STROBE_FTX); // flush TX FIFO buffer
rosarium 0:2ddc0583bcec 183
rosarium 0:2ddc0583bcec 184 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 185 debug_if(!(linear_fifo_read_num_elements_tx_fifo() == 0), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 186 #endif
rosarium 0:2ddc0583bcec 187
rosarium 0:2ddc0583bcec 188 pkt_basic_set_payload_length(payload_len); // set desired payload len
rosarium 0:2ddc0583bcec 189
rosarium 0:2ddc0583bcec 190 csma_ca_state(S_ENABLE); // enable CSMA/CA
rosarium 0:2ddc0583bcec 191
rosarium 0:2ddc0583bcec 192 /* Init buffer & number of bytes to be send */
rosarium 0:2ddc0583bcec 193 tx_fifo_remaining = payload_len;
rosarium 0:2ddc0583bcec 194 tx_fifo_buffer = (const uint8_t*)payload;
rosarium 0:2ddc0583bcec 195
rosarium 0:2ddc0583bcec 196 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN; // fill-up whole fifo
rosarium 0:2ddc0583bcec 197 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
rosarium 0:2ddc0583bcec 198
rosarium 0:2ddc0583bcec 199 tx_fifo_remaining -= to_send;
rosarium 0:2ddc0583bcec 200
rosarium 0:2ddc0583bcec 201 /* Fill FIFO Buffer */
rosarium 0:2ddc0583bcec 202 if(to_send > 0) {
rosarium 0:2ddc0583bcec 203 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[0]);
rosarium 0:2ddc0583bcec 204 }
rosarium 0:2ddc0583bcec 205
rosarium 0:2ddc0583bcec 206 tx_buffer_pos = to_send;
rosarium 0:2ddc0583bcec 207 _spirit_tx_started = true;
rosarium 0:2ddc0583bcec 208
rosarium 0:2ddc0583bcec 209 enable_spirit_irq();
rosarium 0:2ddc0583bcec 210
rosarium 0:2ddc0583bcec 211 /* Start transmitting */
rosarium 0:2ddc0583bcec 212 cmd_strobe(SPIRIT1_STROBE_TX);
rosarium 0:2ddc0583bcec 213
rosarium 0:2ddc0583bcec 214 while(tx_fifo_remaining != 0); // wait until not everything is yet send (evtl. by irq handler)
rosarium 0:2ddc0583bcec 215
rosarium 0:2ddc0583bcec 216 BUSYWAIT_UNTIL(!_spirit_tx_started, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 217 #ifdef HEAVY_DEBUG
rosarium 0:2ddc0583bcec 218 debug("\n\r%s (%d): state=%x, _spirit_tx_started=%d\n\r", __func__, __LINE__, SPIRIT1_STATUS()>>1, _spirit_tx_started);
rosarium 0:2ddc0583bcec 219 #endif
rosarium 0:2ddc0583bcec 220
rosarium 0:2ddc0583bcec 221 _spirit_tx_started = false; // in case of state timeout
rosarium 0:2ddc0583bcec 222
rosarium 0:2ddc0583bcec 223 csma_ca_state(S_DISABLE); // disable CSMA/CA
rosarium 0:2ddc0583bcec 224
rosarium 0:2ddc0583bcec 225 cmd_strobe(SPIRIT1_STROBE_RX); // Return to RX state
rosarium 0:2ddc0583bcec 226
rosarium 0:2ddc0583bcec 227 return RADIO_TX_OK;
rosarium 0:2ddc0583bcec 228 }
rosarium 0:2ddc0583bcec 229
rosarium 0:2ddc0583bcec 230 /** Set Ready State **/
rosarium 0:2ddc0583bcec 231 void SimpleSpirit1::set_ready_state(void) {
rosarium 0:2ddc0583bcec 232 uint16_t state;
rosarium 0:2ddc0583bcec 233
rosarium 0:2ddc0583bcec 234 disable_spirit_irq();
rosarium 0:2ddc0583bcec 235
rosarium 0:2ddc0583bcec 236 _spirit_tx_started = false;
rosarium 0:2ddc0583bcec 237 _is_receiving = false;
rosarium 0:2ddc0583bcec 238 stop_rx_timeout();
rosarium 0:2ddc0583bcec 239
rosarium 0:2ddc0583bcec 240 cmd_strobe(SPIRIT1_STROBE_FRX);
rosarium 0:2ddc0583bcec 241 CLEAR_RXBUF();
rosarium 0:2ddc0583bcec 242 CLEAR_TXBUF();
rosarium 0:2ddc0583bcec 243
rosarium 0:2ddc0583bcec 244 state = SPIRIT1_STATUS();
rosarium 0:2ddc0583bcec 245 if(state == SPIRIT1_STATE_STANDBY) {
rosarium 0:2ddc0583bcec 246 cmd_strobe(SPIRIT1_STROBE_READY);
rosarium 0:2ddc0583bcec 247 } else if(state == SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 248 cmd_strobe(SPIRIT1_STROBE_SABORT);
rosarium 0:2ddc0583bcec 249 } else if(state != SPIRIT1_STATE_READY) {
rosarium 0:2ddc0583bcec 250 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 251 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, state>>1);
rosarium 0:2ddc0583bcec 252 #endif
rosarium 0:2ddc0583bcec 253 }
rosarium 0:2ddc0583bcec 254
rosarium 0:2ddc0583bcec 255 BUSYWAIT_UNTIL((SPIRIT1_STATUS() == SPIRIT1_STATE_READY) && ((last_state & XO_ON) == XO_ON), STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 256 if(last_state != (SPIRIT1_STATE_READY | XO_ON)) {
rosarium 0:2ddc0583bcec 257 error("\n\rSpirit1: failed to become ready (%x) => pls. reset!\n\r", last_state);
rosarium 0:2ddc0583bcec 258 enable_spirit_irq();
rosarium 0:2ddc0583bcec 259 return;
rosarium 0:2ddc0583bcec 260 }
rosarium 0:2ddc0583bcec 261
rosarium 0:2ddc0583bcec 262 irq_clear_status();
rosarium 0:2ddc0583bcec 263
rosarium 0:2ddc0583bcec 264 enable_spirit_irq();
rosarium 0:2ddc0583bcec 265 }
rosarium 0:2ddc0583bcec 266
rosarium 0:2ddc0583bcec 267 int SimpleSpirit1::off(void) {
rosarium 0:2ddc0583bcec 268 if(spirit_on == ON) {
rosarium 0:2ddc0583bcec 269 /* Disables the mcu to get IRQ from the SPIRIT1 */
rosarium 0:2ddc0583bcec 270 disable_spirit_irq();
rosarium 0:2ddc0583bcec 271
rosarium 0:2ddc0583bcec 272 /* first stop rx/tx */
rosarium 0:2ddc0583bcec 273 set_ready_state();
rosarium 0:2ddc0583bcec 274
rosarium 0:2ddc0583bcec 275 #ifdef USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 276 /* Puts the SPIRIT1 in STANDBY */
rosarium 0:2ddc0583bcec 277 cmd_strobe(SPIRIT1_STROBE_STANDBY);
rosarium 0:2ddc0583bcec 278 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 279 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_STANDBY) {
rosarium 0:2ddc0583bcec 280 error("\n\rSpirit1: failed to enter standby (%x)\n\r", last_state>>1);
rosarium 0:2ddc0583bcec 281 return 1;
rosarium 0:2ddc0583bcec 282 }
rosarium 0:2ddc0583bcec 283 #endif // USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 284
rosarium 0:2ddc0583bcec 285 spirit_on = OFF;
rosarium 0:2ddc0583bcec 286 _nr_of_irq_disables = 1;
rosarium 0:2ddc0583bcec 287 }
rosarium 0:2ddc0583bcec 288 return 0;
rosarium 0:2ddc0583bcec 289 }
rosarium 0:2ddc0583bcec 290
rosarium 0:2ddc0583bcec 291 int SimpleSpirit1::on(void) {
rosarium 0:2ddc0583bcec 292 if(spirit_on == OFF) {
rosarium 0:2ddc0583bcec 293 set_ready_state();
rosarium 0:2ddc0583bcec 294
rosarium 0:2ddc0583bcec 295 /* now we go to Rx */
rosarium 0:2ddc0583bcec 296 cmd_strobe(SPIRIT1_STROBE_RX);
rosarium 0:2ddc0583bcec 297
rosarium 0:2ddc0583bcec 298 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 299 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 300 error("\n\rSpirit1: failed to enter rx (%x) => retry\n\r", last_state>>1);
rosarium 0:2ddc0583bcec 301 }
rosarium 0:2ddc0583bcec 302
rosarium 0:2ddc0583bcec 303 /* Enables the mcu to get IRQ from the SPIRIT1 */
rosarium 0:2ddc0583bcec 304 spirit_on = ON;
rosarium 0:2ddc0583bcec 305 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 306 debug_if(!(_nr_of_irq_disables == 1), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 307 #endif
rosarium 0:2ddc0583bcec 308 enable_spirit_irq();
rosarium 0:2ddc0583bcec 309 }
rosarium 0:2ddc0583bcec 310
rosarium 0:2ddc0583bcec 311 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 312 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 313 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, last_state>>1);
rosarium 0:2ddc0583bcec 314 }
rosarium 0:2ddc0583bcec 315 #endif
rosarium 0:2ddc0583bcec 316
rosarium 0:2ddc0583bcec 317 return 0;
rosarium 0:2ddc0583bcec 318 }
rosarium 0:2ddc0583bcec 319
rosarium 0:2ddc0583bcec 320 uint8_t SimpleSpirit1::refresh_state(void) {
rosarium 0:2ddc0583bcec 321 uint8_t mcstate;
rosarium 0:2ddc0583bcec 322
rosarium 0:2ddc0583bcec 323 SpiritSpiReadRegisters(MC_STATE0_BASE, 1, &mcstate);
rosarium 0:2ddc0583bcec 324
rosarium 0:2ddc0583bcec 325 return mcstate;
rosarium 0:2ddc0583bcec 326 }
rosarium 0:2ddc0583bcec 327
rosarium 0:2ddc0583bcec 328 int SimpleSpirit1::read(void *buf, unsigned int bufsize)
rosarium 0:2ddc0583bcec 329 {
rosarium 0:2ddc0583bcec 330 disable_spirit_irq();
rosarium 0:2ddc0583bcec 331
rosarium 0:2ddc0583bcec 332 /* Checks if the RX buffer is empty */
rosarium 0:2ddc0583bcec 333 if(IS_RXBUF_EMPTY()) {
rosarium 0:2ddc0583bcec 334 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 335 debug("\n\rBuffer is empty\n\r");
rosarium 0:2ddc0583bcec 336 #endif
rosarium 0:2ddc0583bcec 337 set_ready_state();
rosarium 0:2ddc0583bcec 338
rosarium 0:2ddc0583bcec 339 cmd_strobe(SPIRIT1_STROBE_RX);
rosarium 0:2ddc0583bcec 340 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 341 enable_spirit_irq();
rosarium 0:2ddc0583bcec 342 return 0;
rosarium 0:2ddc0583bcec 343 }
rosarium 0:2ddc0583bcec 344
rosarium 0:2ddc0583bcec 345 if(bufsize < spirit_rx_len) {
rosarium 0:2ddc0583bcec 346 enable_spirit_irq();
rosarium 0:2ddc0583bcec 347
rosarium 0:2ddc0583bcec 348 /* If buf has the correct size */
rosarium 0:2ddc0583bcec 349 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 350 debug("\n\rTOO SMALL BUF\n\r");
rosarium 0:2ddc0583bcec 351 #endif
rosarium 0:2ddc0583bcec 352 return 0;
rosarium 0:2ddc0583bcec 353 } else {
rosarium 0:2ddc0583bcec 354 /* Copies the packet received */
rosarium 0:2ddc0583bcec 355 memcpy(buf, spirit_rx_buf, spirit_rx_len);
rosarium 0:2ddc0583bcec 356
rosarium 0:2ddc0583bcec 357 bufsize = spirit_rx_len;
rosarium 0:2ddc0583bcec 358 CLEAR_RXBUF();
rosarium 0:2ddc0583bcec 359
rosarium 0:2ddc0583bcec 360 enable_spirit_irq();
rosarium 0:2ddc0583bcec 361
rosarium 0:2ddc0583bcec 362 return bufsize;
rosarium 0:2ddc0583bcec 363 }
rosarium 0:2ddc0583bcec 364
rosarium 0:2ddc0583bcec 365 }
rosarium 0:2ddc0583bcec 366
rosarium 0:2ddc0583bcec 367 int SimpleSpirit1::channel_clear(void)
rosarium 0:2ddc0583bcec 368 {
rosarium 0:2ddc0583bcec 369 float rssi_value;
rosarium 0:2ddc0583bcec 370 /* Local variable used to memorize the SPIRIT1 state */
rosarium 0:2ddc0583bcec 371 uint8_t spirit_state = ON;
rosarium 0:2ddc0583bcec 372
rosarium 0:2ddc0583bcec 373 if(spirit_on == OFF) {
rosarium 0:2ddc0583bcec 374 /* Wakes up the SPIRIT1 */
rosarium 0:2ddc0583bcec 375 on();
rosarium 0:2ddc0583bcec 376 spirit_state = OFF;
rosarium 0:2ddc0583bcec 377 }
rosarium 0:2ddc0583bcec 378
rosarium 0:2ddc0583bcec 379 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 380 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 381 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, last_state>>1);
rosarium 0:2ddc0583bcec 382 }
rosarium 0:2ddc0583bcec 383 #endif
rosarium 0:2ddc0583bcec 384
rosarium 0:2ddc0583bcec 385 disable_spirit_irq();
rosarium 0:2ddc0583bcec 386
rosarium 0:2ddc0583bcec 387 /* Reset State to Ready */
rosarium 0:2ddc0583bcec 388 set_ready_state();
rosarium 0:2ddc0583bcec 389
rosarium 0:2ddc0583bcec 390 /* Stores the RSSI value */
rosarium 0:2ddc0583bcec 391 rssi_value = qi_get_rssi_dbm();
rosarium 0:2ddc0583bcec 392
rosarium 0:2ddc0583bcec 393 enable_spirit_irq();
rosarium 0:2ddc0583bcec 394
rosarium 0:2ddc0583bcec 395 /* Puts the SPIRIT1 in its previous state */
rosarium 0:2ddc0583bcec 396 if(spirit_state==OFF) {
rosarium 0:2ddc0583bcec 397 off();
rosarium 0:2ddc0583bcec 398 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 399 #ifdef USE_STANDBY_STATE
rosarium 0:2ddc0583bcec 400 if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) {
rosarium 0:2ddc0583bcec 401 #else
rosarium 0:2ddc0583bcec 402 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
rosarium 0:2ddc0583bcec 403 #endif
rosarium 0:2ddc0583bcec 404 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, last_state>>1);
rosarium 0:2ddc0583bcec 405 }
rosarium 0:2ddc0583bcec 406 #endif
rosarium 0:2ddc0583bcec 407 } else {
rosarium 0:2ddc0583bcec 408 disable_spirit_irq();
rosarium 0:2ddc0583bcec 409
rosarium 0:2ddc0583bcec 410 set_ready_state();
rosarium 0:2ddc0583bcec 411
rosarium 0:2ddc0583bcec 412 cmd_strobe(SPIRIT1_STROBE_RX);
rosarium 0:2ddc0583bcec 413 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
rosarium 0:2ddc0583bcec 414 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 415 error("\n\rSpirit1: (#2) failed to enter rx (%x) => retry\n\r", last_state>>1);
rosarium 0:2ddc0583bcec 416 }
rosarium 0:2ddc0583bcec 417
rosarium 0:2ddc0583bcec 418 enable_spirit_irq();
rosarium 0:2ddc0583bcec 419
rosarium 0:2ddc0583bcec 420 #ifndef NDEBUG
rosarium 0:2ddc0583bcec 421 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
rosarium 0:2ddc0583bcec 422 debug("\n\rAssert failed in: %s (%d): state=%x\n\r", __func__, __LINE__, last_state>>1);
rosarium 0:2ddc0583bcec 423 }
rosarium 0:2ddc0583bcec 424 #endif
rosarium 0:2ddc0583bcec 425 }
rosarium 0:2ddc0583bcec 426
rosarium 0:2ddc0583bcec 427 /* Checks the RSSI value with the threshold */
rosarium 0:2ddc0583bcec 428 if(rssi_value<CCA_THRESHOLD) {
rosarium 0:2ddc0583bcec 429 return 0;
rosarium 0:2ddc0583bcec 430 } else {
rosarium 0:2ddc0583bcec 431 return 1;
rosarium 0:2ddc0583bcec 432 }
rosarium 0:2ddc0583bcec 433 }
rosarium 0:2ddc0583bcec 434
rosarium 0:2ddc0583bcec 435 int SimpleSpirit1::get_pending_packet(void)
rosarium 0:2ddc0583bcec 436 {
rosarium 0:2ddc0583bcec 437 return !IS_RXBUF_EMPTY();
rosarium 0:2ddc0583bcec 438 }
rosarium 0:2ddc0583bcec 439
rosarium 0:2ddc0583bcec 440 /** Spirit Irq Callback **/
rosarium 0:2ddc0583bcec 441 void SimpleSpirit1::IrqHandler() {
rosarium 0:2ddc0583bcec 442 st_lib_spirit_irqs x_irq_status;
rosarium 0:2ddc0583bcec 443
rosarium 0:2ddc0583bcec 444 /* get interrupt source from radio */
rosarium 0:2ddc0583bcec 445 irq_get_status(&x_irq_status);
rosarium 0:2ddc0583bcec 446
rosarium 0:2ddc0583bcec 447 /* The IRQ_TX_DATA_SENT notifies the packet received. Puts the SPIRIT1 in RX */
rosarium 0:2ddc0583bcec 448 if(x_irq_status.IRQ_TX_DATA_SENT) {
rosarium 0:2ddc0583bcec 449 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 450 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 451 debug_if(!_spirit_tx_started, "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 452 debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 453 debug_if(tx_fifo_remaining != 0, "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 454 #endif
rosarium 0:2ddc0583bcec 455
rosarium 0:2ddc0583bcec 456 tx_fifo_buffer = NULL;
rosarium 0:2ddc0583bcec 457 _spirit_tx_started = false;
rosarium 0:2ddc0583bcec 458
rosarium 0:2ddc0583bcec 459 /* call user callback */
rosarium 0:2ddc0583bcec 460 if(_current_irq_callback) {
rosarium 0:2ddc0583bcec 461 _current_irq_callback(TX_DONE);
rosarium 0:2ddc0583bcec 462 }
rosarium 0:2ddc0583bcec 463
rosarium 0:2ddc0583bcec 464 /* Disable handling of other TX flags */
rosarium 0:2ddc0583bcec 465 x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET;
rosarium 0:2ddc0583bcec 466 }
rosarium 0:2ddc0583bcec 467
rosarium 0:2ddc0583bcec 468 #ifndef RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 469 /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */
rosarium 0:2ddc0583bcec 470 if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) {
rosarium 0:2ddc0583bcec 471 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 472 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 473 debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 474 debug_if(!_spirit_tx_started, "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 475 debug_if(tx_fifo_buffer == NULL, "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 476 #endif
rosarium 0:2ddc0583bcec 477
rosarium 0:2ddc0583bcec 478 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo
rosarium 0:2ddc0583bcec 479 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
rosarium 0:2ddc0583bcec 480
rosarium 0:2ddc0583bcec 481 tx_fifo_remaining -= to_send;
rosarium 0:2ddc0583bcec 482
rosarium 0:2ddc0583bcec 483 /* Fill FIFO Buffer */
rosarium 0:2ddc0583bcec 484 if(to_send > 0) {
rosarium 0:2ddc0583bcec 485 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]);
rosarium 0:2ddc0583bcec 486 }
rosarium 0:2ddc0583bcec 487 tx_buffer_pos += to_send;
rosarium 0:2ddc0583bcec 488 }
rosarium 0:2ddc0583bcec 489 #endif // !RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 490
rosarium 0:2ddc0583bcec 491 /* Transmission error */
rosarium 0:2ddc0583bcec 492 if(x_irq_status.IRQ_TX_FIFO_ERROR) {
rosarium 0:2ddc0583bcec 493 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 494 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 495 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 496 debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 497 #endif
rosarium 0:2ddc0583bcec 498 if(_spirit_tx_started) {
rosarium 0:2ddc0583bcec 499 _spirit_tx_started = false;
rosarium 0:2ddc0583bcec 500 /* call user callback */
rosarium 0:2ddc0583bcec 501 if(_current_irq_callback) {
rosarium 0:2ddc0583bcec 502 _current_irq_callback(TX_ERR);
rosarium 0:2ddc0583bcec 503 }
rosarium 0:2ddc0583bcec 504 }
rosarium 0:2ddc0583bcec 505
rosarium 0:2ddc0583bcec 506 /* reset data still to be sent */
rosarium 0:2ddc0583bcec 507 tx_fifo_remaining = 0;
rosarium 0:2ddc0583bcec 508 }
rosarium 0:2ddc0583bcec 509
rosarium 0:2ddc0583bcec 510 /* The IRQ_RX_DATA_READY notifies a new packet arrived */
rosarium 0:2ddc0583bcec 511 if(x_irq_status.IRQ_RX_DATA_READY) {
rosarium 0:2ddc0583bcec 512 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 513 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 514 debug_if(!((*tmp) & IRQ_RX_DATA_READY_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 515 #endif
rosarium 0:2ddc0583bcec 516
rosarium 0:2ddc0583bcec 517 if(!_is_receiving) { // spurious irq?!? (betzw: see comments on macro 'RX_FIFO_THR_WA'!)
rosarium 0:2ddc0583bcec 518 #ifdef HEAVY_DEBUG
rosarium 0:2ddc0583bcec 519 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 520 #endif
rosarium 0:2ddc0583bcec 521 } else {
rosarium 0:2ddc0583bcec 522 _is_receiving = false; // Finished receiving
rosarium 0:2ddc0583bcec 523 stop_rx_timeout();
rosarium 0:2ddc0583bcec 524
rosarium 0:2ddc0583bcec 525 spirit_rx_len = pkt_basic_get_received_pkt_length();
rosarium 0:2ddc0583bcec 526
rosarium 0:2ddc0583bcec 527 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 528 debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 529 #endif
rosarium 0:2ddc0583bcec 530
rosarium 0:2ddc0583bcec 531 if(spirit_rx_len <= MAX_PACKET_LEN) {
rosarium 0:2ddc0583bcec 532 uint8_t to_receive = spirit_rx_len - _spirit_rx_pos;
rosarium 0:2ddc0583bcec 533 if(to_receive > 0) {
rosarium 0:2ddc0583bcec 534 spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
rosarium 0:2ddc0583bcec 535 _spirit_rx_pos += to_receive;
rosarium 0:2ddc0583bcec 536 }
rosarium 0:2ddc0583bcec 537 }
rosarium 0:2ddc0583bcec 538
rosarium 0:2ddc0583bcec 539 cmd_strobe(SPIRIT1_STROBE_FRX);
rosarium 0:2ddc0583bcec 540
rosarium 0:2ddc0583bcec 541 last_rssi = qi_get_rssi(); //MGR
rosarium 0:2ddc0583bcec 542 last_sqi = qi_get_sqi(); //MGR
rosarium 0:2ddc0583bcec 543
rosarium 0:2ddc0583bcec 544 /* call user callback */
rosarium 0:2ddc0583bcec 545 if((_spirit_rx_pos == spirit_rx_len) && _current_irq_callback) {
rosarium 0:2ddc0583bcec 546 _current_irq_callback(RX_DONE);
rosarium 0:2ddc0583bcec 547 }
rosarium 0:2ddc0583bcec 548
rosarium 0:2ddc0583bcec 549 /* Disable handling of other RX flags */
rosarium 0:2ddc0583bcec 550 x_irq_status.IRQ_RX_FIFO_ALMOST_FULL = S_RESET;
rosarium 0:2ddc0583bcec 551 }
rosarium 0:2ddc0583bcec 552 }
rosarium 0:2ddc0583bcec 553
rosarium 0:2ddc0583bcec 554 #ifndef RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 555 /* RX FIFO almost full */
rosarium 0:2ddc0583bcec 556 if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) {
rosarium 0:2ddc0583bcec 557 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 558 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 559 debug_if(!((*tmp) & IRQ_RX_FIFO_ALMOST_FULL_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 560 #endif
rosarium 0:2ddc0583bcec 561 if(!_is_receiving) { // spurious irq?!?
rosarium 0:2ddc0583bcec 562 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 563 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 564 #endif
rosarium 0:2ddc0583bcec 565 } else {
rosarium 0:2ddc0583bcec 566 uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
rosarium 0:2ddc0583bcec 567 if((fifo_available + _spirit_rx_pos) <= MAX_PACKET_LEN) {
rosarium 0:2ddc0583bcec 568 spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
rosarium 0:2ddc0583bcec 569 _spirit_rx_pos += fifo_available;
rosarium 0:2ddc0583bcec 570 } else {
rosarium 0:2ddc0583bcec 571 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 572 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 573 #endif
rosarium 0:2ddc0583bcec 574 }
rosarium 0:2ddc0583bcec 575 }
rosarium 0:2ddc0583bcec 576 }
rosarium 0:2ddc0583bcec 577 #endif // !RX_FIFO_THR_WA
rosarium 0:2ddc0583bcec 578
rosarium 0:2ddc0583bcec 579 /* Reception errors */
rosarium 0:2ddc0583bcec 580 if((x_irq_status.IRQ_RX_FIFO_ERROR) || (x_irq_status.IRQ_RX_DATA_DISC)) {
rosarium 0:2ddc0583bcec 581 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 582 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 583 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 584 debug_if(!((*tmp) & (IRQ_RX_FIFO_ERROR_MASK | IRQ_RX_DATA_DISC_MASK)), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 585 #endif
rosarium 0:2ddc0583bcec 586 rx_timeout_handler();
rosarium 0:2ddc0583bcec 587 if(_spirit_tx_started) {
rosarium 0:2ddc0583bcec 588 _spirit_tx_started = false;
rosarium 0:2ddc0583bcec 589 /* call user callback */
rosarium 0:2ddc0583bcec 590 if(_current_irq_callback) {
rosarium 0:2ddc0583bcec 591 _current_irq_callback(TX_ERR);
rosarium 0:2ddc0583bcec 592 }
rosarium 0:2ddc0583bcec 593 }
rosarium 0:2ddc0583bcec 594 }
rosarium 0:2ddc0583bcec 595
rosarium 0:2ddc0583bcec 596 /* The IRQ_VALID_SYNC is used to notify a new packet is coming */
rosarium 0:2ddc0583bcec 597 if(x_irq_status.IRQ_VALID_SYNC) {
rosarium 0:2ddc0583bcec 598 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 599 uint32_t *tmp = (uint32_t*)&x_irq_status;
rosarium 0:2ddc0583bcec 600 debug_if(!((*tmp) & IRQ_VALID_SYNC_MASK), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
rosarium 0:2ddc0583bcec 601 #endif
rosarium 0:2ddc0583bcec 602 /* betzw - NOTE: there is a race condition between Spirit1 receiving packets and
rosarium 0:2ddc0583bcec 603 * the MCU trying to send a packet, which gets resolved in favor of
rosarium 0:2ddc0583bcec 604 * sending.
rosarium 0:2ddc0583bcec 605 */
rosarium 0:2ddc0583bcec 606 if(_spirit_tx_started) {
rosarium 0:2ddc0583bcec 607 #ifdef DEBUG_IRQ
rosarium 0:2ddc0583bcec 608 debug("\n\r%s (%d): irq=%x\n\r", __func__, __LINE__, *tmp);
rosarium 0:2ddc0583bcec 609 #endif
rosarium 0:2ddc0583bcec 610 } else {
rosarium 0:2ddc0583bcec 611 _is_receiving = true;
rosarium 0:2ddc0583bcec 612 start_rx_timeout();
rosarium 0:2ddc0583bcec 613 }
rosarium 0:2ddc0583bcec 614 }
rosarium 0:2ddc0583bcec 615 }