JunMo Hong / stm-spirit1-rf-driver_for_cubebite

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
Wolfgang Betz
Date:
Wed Nov 09 11:21:55 2016 +0100
Revision:
22:9165bd73c61e
Parent:
21:d5c10e5742f6
Child:
23:4192649f35da
Substitute 'MBED_ASSERT' with debug messages

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:4fb29d9ee571 1 /*** Mbed Includes ***/
Wolfgang Betz 0:4fb29d9ee571 2 #include "SimpleSpirit1.h"
Wolfgang Betz 3:0df38cfb1e53 3 #include "radio_spi.h"
Wolfgang Betz 0:4fb29d9ee571 4
Wolfgang Betz 3:0df38cfb1e53 5 #if NULLRDC_CONF_802154_AUTOACK
Wolfgang Betz 3:0df38cfb1e53 6 #define ACK_LEN 3
Wolfgang Betz 3:0df38cfb1e53 7 static int wants_an_ack = 0; /* The packet sent expects an ack */
Wolfgang Betz 3:0df38cfb1e53 8 //#define ACKPRINTF printf
Wolfgang Betz 3:0df38cfb1e53 9 #define ACKPRINTF(...)
Wolfgang Betz 3:0df38cfb1e53 10 #endif /* NULLRDC_CONF_802154_AUTOACK */
Wolfgang Betz 3:0df38cfb1e53 11
Wolfgang Betz 4:07537ca85c66 12 #define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_3)
Wolfgang Betz 3:0df38cfb1e53 13
Wolfgang Betz 4:07537ca85c66 14 #define SPIRIT1_STATUS() (arch_refresh_status() & SPIRIT1_STATE_STATEBITS)
Wolfgang Betz 3:0df38cfb1e53 15
Wolfgang Betz 4:07537ca85c66 16 #define SABORT_WAIT_US (400)
Wolfgang Betz 3:0df38cfb1e53 17
Wolfgang Betz 3:0df38cfb1e53 18 #define BUSYWAIT_UNTIL(cond, millisecs) \
Wolfgang Betz 16:25dc4b811ad3 19 do { \
Wolfgang Betz 16:25dc4b811ad3 20 uint32_t start = us_ticker_read(); \
Wolfgang Betz 16:25dc4b811ad3 21 while (!(cond) && ((us_ticker_read() - start) < ((uint32_t)millisecs)*1000U)); \
Wolfgang Betz 16:25dc4b811ad3 22 } while(0)
Wolfgang Betz 3:0df38cfb1e53 23
Wolfgang Betz 4:07537ca85c66 24 extern volatile SpiritStatus g_xStatus;
Wolfgang Betz 4:07537ca85c66 25 #define st_lib_g_x_status (g_xStatus)
Wolfgang Betz 4:07537ca85c66 26
Wolfgang Betz 4:07537ca85c66 27 #define st_lib_spirit_irqs SpiritIrqs
Wolfgang Betz 4:07537ca85c66 28
Wolfgang Betz 0:4fb29d9ee571 29
Wolfgang Betz 0:4fb29d9ee571 30 /*** Class Implementation ***/
Wolfgang Betz 3:0df38cfb1e53 31 /** Static Class Variables **/
Wolfgang Betz 3:0df38cfb1e53 32 SimpleSpirit1 *SimpleSpirit1::_singleton = NULL;
Wolfgang Betz 3:0df38cfb1e53 33
Wolfgang Betz 3:0df38cfb1e53 34 /** Constructor **/
Wolfgang Betz 0:4fb29d9ee571 35 SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
Wolfgang Betz 16:25dc4b811ad3 36 PinName irq, PinName cs, PinName sdn,
Wolfgang Betz 16:25dc4b811ad3 37 PinName led) :
Wolfgang Betz 16:25dc4b811ad3 38 _spi(mosi, miso, sclk),
Wolfgang Betz 16:25dc4b811ad3 39 _irq(irq),
Wolfgang Betz 16:25dc4b811ad3 40 _chip_select(cs),
Wolfgang Betz 16:25dc4b811ad3 41 _shut_down(sdn),
Wolfgang Betz 16:25dc4b811ad3 42 _led(led),
Wolfgang Betz 16:25dc4b811ad3 43 _current_irq_callback(),
Wolfgang Betz 16:25dc4b811ad3 44 _rx_receiving_timeout()
Wolfgang Betz 0:4fb29d9ee571 45 {
Wolfgang Betz 9:3db68ab23070 46 }
Wolfgang Betz 9:3db68ab23070 47
Wolfgang Betz 9:3db68ab23070 48 /** Init Function **/
Wolfgang Betz 9:3db68ab23070 49 void SimpleSpirit1::init() {
Wolfgang Betz 16:25dc4b811ad3 50 /* reset irq disable counter and irq callback & disable irq */
Wolfgang Betz 3:0df38cfb1e53 51 _nr_of_irq_disables = 0;
Wolfgang Betz 16:25dc4b811ad3 52 disable_spirit_irq();
Wolfgang Betz 0:4fb29d9ee571 53
Wolfgang Betz 16:25dc4b811ad3 54 /* unselect chip */
Wolfgang Betz 16:25dc4b811ad3 55 chip_unselect();
Wolfgang Betz 0:4fb29d9ee571 56
Wolfgang Betz 16:25dc4b811ad3 57 /* configure spi */
Wolfgang Betz 16:25dc4b811ad3 58 _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */
Wolfgang Betz 16:25dc4b811ad3 59 _spi.frequency(5000000); // 5MHz
Wolfgang Betz 3:0df38cfb1e53 60
Wolfgang Betz 16:25dc4b811ad3 61 /* install irq handler */
Wolfgang Betz 16:25dc4b811ad3 62 _irq.mode(PullUp);
Wolfgang Betz 16:25dc4b811ad3 63 _irq.fall(Callback<void()>(this, &SimpleSpirit1::IrqHandler));
Wolfgang Betz 5:c9c5bc673c64 64
Wolfgang Betz 16:25dc4b811ad3 65 /* init cube vars */
Wolfgang Betz 16:25dc4b811ad3 66 spirit_on = OFF;
Wolfgang Betz 16:25dc4b811ad3 67 last_rssi = 0 ; //MGR
Wolfgang Betz 16:25dc4b811ad3 68 last_lqi = 0 ; //MGR
Wolfgang Betz 0:4fb29d9ee571 69
Wolfgang Betz 16:25dc4b811ad3 70 /* set frequencies */
Wolfgang Betz 16:25dc4b811ad3 71 radio_set_xtal_freq(XTAL_FREQUENCY);
Wolfgang Betz 16:25dc4b811ad3 72 mgmt_set_freq_base((uint32_t)BASE_FREQUENCY);
Wolfgang Betz 0:4fb29d9ee571 73
Wolfgang Betz 16:25dc4b811ad3 74 /* restart board */
Wolfgang Betz 16:25dc4b811ad3 75 enter_shutdown();
Wolfgang Betz 16:25dc4b811ad3 76 exit_shutdown();
Wolfgang Betz 0:4fb29d9ee571 77
Wolfgang Betz 16:25dc4b811ad3 78 /* soft core reset */
Wolfgang Betz 16:25dc4b811ad3 79 cmd_strobe(SPIRIT1_STROBE_SRES);
Wolfgang Betz 15:852b92eed64a 80
Wolfgang Betz 16:25dc4b811ad3 81 /* Configures the SPIRIT1 radio part */
Wolfgang Betz 16:25dc4b811ad3 82 SRadioInit x_radio_init = {
Wolfgang Betz 16:25dc4b811ad3 83 XTAL_OFFSET_PPM,
Wolfgang Betz 16:25dc4b811ad3 84 (uint32_t)BASE_FREQUENCY,
Wolfgang Betz 16:25dc4b811ad3 85 (uint32_t)CHANNEL_SPACE,
Wolfgang Betz 16:25dc4b811ad3 86 CHANNEL_NUMBER,
Wolfgang Betz 16:25dc4b811ad3 87 MODULATION_SELECT,
Wolfgang Betz 16:25dc4b811ad3 88 DATARATE,
Wolfgang Betz 16:25dc4b811ad3 89 (uint32_t)FREQ_DEVIATION,
Wolfgang Betz 16:25dc4b811ad3 90 (uint32_t)BANDWIDTH
Wolfgang Betz 16:25dc4b811ad3 91 };
Wolfgang Betz 16:25dc4b811ad3 92 radio_init(&x_radio_init);
Wolfgang Betz 16:25dc4b811ad3 93 radio_set_pa_level_dbm(0,POWER_DBM);
Wolfgang Betz 16:25dc4b811ad3 94 radio_set_pa_level_max_index(0);
Wolfgang Betz 0:4fb29d9ee571 95
Wolfgang Betz 16:25dc4b811ad3 96 /* Configures the SPIRIT1 packet handler part*/
Wolfgang Betz 16:25dc4b811ad3 97 PktBasicInit x_basic_init = {
Wolfgang Betz 16:25dc4b811ad3 98 PREAMBLE_LENGTH,
Wolfgang Betz 16:25dc4b811ad3 99 SYNC_LENGTH,
Wolfgang Betz 16:25dc4b811ad3 100 SYNC_WORD,
Wolfgang Betz 16:25dc4b811ad3 101 LENGTH_TYPE,
Wolfgang Betz 16:25dc4b811ad3 102 LENGTH_WIDTH,
Wolfgang Betz 16:25dc4b811ad3 103 CRC_MODE,
Wolfgang Betz 16:25dc4b811ad3 104 CONTROL_LENGTH,
Wolfgang Betz 16:25dc4b811ad3 105 EN_ADDRESS,
Wolfgang Betz 16:25dc4b811ad3 106 EN_FEC,
Wolfgang Betz 16:25dc4b811ad3 107 EN_WHITENING
Wolfgang Betz 16:25dc4b811ad3 108 };
Wolfgang Betz 16:25dc4b811ad3 109 pkt_basic_init(&x_basic_init);
Wolfgang Betz 0:4fb29d9ee571 110
Wolfgang Betz 16:25dc4b811ad3 111 /* Enable the following interrupt sources, routed to GPIO */
Wolfgang Betz 16:25dc4b811ad3 112 irq_de_init(NULL);
Wolfgang Betz 16:25dc4b811ad3 113 irq_clear_status();
Wolfgang Betz 16:25dc4b811ad3 114 irq_set_status(TX_DATA_SENT, S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 115 irq_set_status(RX_DATA_READY,S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 116 irq_set_status(RX_DATA_DISC, S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 117 irq_set_status(TX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 118 irq_set_status(RX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 119 irq_set_status(RX_FIFO_ALMOST_FULL, S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 120 irq_set_status(VALID_SYNC, S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 121
Wolfgang Betz 16:25dc4b811ad3 122 /* Configure Spirit1 */
Wolfgang Betz 16:25dc4b811ad3 123 radio_persisten_rx(S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 124 qi_set_sqi_threshold(SQI_TH_0);
Wolfgang Betz 16:25dc4b811ad3 125 qi_sqi_check(S_ENABLE);
Wolfgang Betz 16:25dc4b811ad3 126 qi_set_rssi_threshold_dbm(CCA_THRESHOLD);
Wolfgang Betz 16:25dc4b811ad3 127 timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD);
Wolfgang Betz 16:25dc4b811ad3 128 timer_set_infinite_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 129 radio_afc_freeze_on_sync(S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 130
Wolfgang Betz 16:25dc4b811ad3 131 /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */
Wolfgang Betz 16:25dc4b811ad3 132 cmd_strobe(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 16:25dc4b811ad3 133 spirit_on = OFF;
Wolfgang Betz 16:25dc4b811ad3 134 CLEAR_TXBUF();
Wolfgang Betz 16:25dc4b811ad3 135 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 136 _spirit_tx_started = false;
Wolfgang Betz 16:25dc4b811ad3 137 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 138 _is_receiving = false;
Wolfgang Betz 0:4fb29d9ee571 139
Wolfgang Betz 16:25dc4b811ad3 140 /* Configure the radio to route the IRQ signal to its GPIO 3 */
Wolfgang Betz 16:25dc4b811ad3 141 SGpioInit x_gpio_init = {
Wolfgang Betz 16:25dc4b811ad3 142 SPIRIT_GPIO_IRQ,
Wolfgang Betz 16:25dc4b811ad3 143 SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,
Wolfgang Betz 16:25dc4b811ad3 144 SPIRIT_GPIO_DIG_OUT_IRQ
Wolfgang Betz 16:25dc4b811ad3 145 };
Wolfgang Betz 16:25dc4b811ad3 146 spirit_gpio_init(&x_gpio_init);
Wolfgang Betz 18:d6f789f6f4c9 147
Wolfgang Betz 18:d6f789f6f4c9 148 #ifdef RX_FIFO_THR_WA
Wolfgang Betz 18:d6f789f6f4c9 149 linear_fifo_set_almost_full_thr_rx(SPIRIT_MAX_FIFO_LEN-(MAX_PACKET_LEN+1));
Wolfgang Betz 18:d6f789f6f4c9 150 #endif
Wolfgang Betz 0:4fb29d9ee571 151 }
Wolfgang Betz 3:0df38cfb1e53 152
Wolfgang Betz 6:f5d01793bf86 153 int SimpleSpirit1::send(const void *payload, unsigned int payload_len) {
Wolfgang Betz 5:c9c5bc673c64 154 /* Checks if the payload length is supported */
Wolfgang Betz 5:c9c5bc673c64 155 if(payload_len > MAX_PACKET_LEN) {
Wolfgang Betz 5:c9c5bc673c64 156 return RADIO_TX_ERR;
Wolfgang Betz 5:c9c5bc673c64 157 }
Wolfgang Betz 5:c9c5bc673c64 158
Wolfgang Betz 5:c9c5bc673c64 159 disable_spirit_irq();
Wolfgang Betz 5:c9c5bc673c64 160
Wolfgang Betz 5:c9c5bc673c64 161 /* Reset State to Ready */
Wolfgang Betz 5:c9c5bc673c64 162 set_ready_state();
Wolfgang Betz 5:c9c5bc673c64 163
Wolfgang Betz 5:c9c5bc673c64 164 cmd_strobe(SPIRIT1_STROBE_FTX); // flush TX FIFO buffer
Wolfgang Betz 22:9165bd73c61e 165 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 166 debug_if(!(linear_fifo_read_num_elements_tx_fifo() == 0), "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 167 #endif
Wolfgang Betz 5:c9c5bc673c64 168
Wolfgang Betz 5:c9c5bc673c64 169 pkt_basic_set_payload_length(payload_len); // set desired payload len
Wolfgang Betz 5:c9c5bc673c64 170
Wolfgang Betz 5:c9c5bc673c64 171 int i = 0;
Wolfgang Betz 5:c9c5bc673c64 172 int remaining = payload_len;
Wolfgang Betz 5:c9c5bc673c64 173 bool trigger_tx = true;
Wolfgang Betz 5:c9c5bc673c64 174 do {
Wolfgang Betz 5:c9c5bc673c64 175 uint8_t fifo_available = SPIRIT_MAX_FIFO_LEN - linear_fifo_read_num_elements_tx_fifo();
Wolfgang Betz 5:c9c5bc673c64 176 uint8_t to_send = (remaining > fifo_available) ? fifo_available : remaining;
Wolfgang Betz 5:c9c5bc673c64 177 const uint8_t *buffer = (const uint8_t*)payload;
Wolfgang Betz 5:c9c5bc673c64 178
Wolfgang Betz 5:c9c5bc673c64 179 /* Fill FIFO Buffer */
Wolfgang Betz 5:c9c5bc673c64 180 spi_write_linear_fifo(to_send, (uint8_t*)&buffer[i]);
Wolfgang Betz 5:c9c5bc673c64 181
Wolfgang Betz 5:c9c5bc673c64 182 /* Start Transmit FIFO Buffer */
Wolfgang Betz 5:c9c5bc673c64 183 if(trigger_tx) {
Wolfgang Betz 22:9165bd73c61e 184 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 185 debug_if(!(linear_fifo_read_num_elements_tx_fifo() == to_send), "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 186 #endif
Wolfgang Betz 5:c9c5bc673c64 187 cmd_strobe(SPIRIT1_STROBE_TX);
Wolfgang Betz 5:c9c5bc673c64 188 trigger_tx = false;
Wolfgang Betz 5:c9c5bc673c64 189 }
Wolfgang Betz 5:c9c5bc673c64 190
Wolfgang Betz 5:c9c5bc673c64 191 i += to_send;
Wolfgang Betz 5:c9c5bc673c64 192 remaining -= to_send;
Wolfgang Betz 5:c9c5bc673c64 193 } while(remaining != 0);
Wolfgang Betz 5:c9c5bc673c64 194
Wolfgang Betz 7:e90fa8f6bc6c 195 _spirit_tx_started = true;
Wolfgang Betz 7:e90fa8f6bc6c 196
Wolfgang Betz 7:e90fa8f6bc6c 197 enable_spirit_irq();
Wolfgang Betz 7:e90fa8f6bc6c 198
Wolfgang Betz 5:c9c5bc673c64 199 BUSYWAIT_UNTIL(SPIRIT1_STATUS() != SPIRIT1_STATE_TX, 50);
Wolfgang Betz 22:9165bd73c61e 200 // debug_if(!(linear_fifo_read_num_elements_tx_fifo() == 0), "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 5:c9c5bc673c64 201
Wolfgang Betz 5:c9c5bc673c64 202 return RADIO_TX_OK;
Wolfgang Betz 5:c9c5bc673c64 203 }
Wolfgang Betz 5:c9c5bc673c64 204
Wolfgang Betz 3:0df38cfb1e53 205 /** Set Ready State **/
Wolfgang Betz 3:0df38cfb1e53 206 void SimpleSpirit1::set_ready_state(void) {
Wolfgang Betz 16:25dc4b811ad3 207 disable_spirit_irq();
Wolfgang Betz 3:0df38cfb1e53 208
Wolfgang Betz 16:25dc4b811ad3 209 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 210 stop_rx_timeout();
Wolfgang Betz 12:b8056eda4028 211
Wolfgang Betz 16:25dc4b811ad3 212 if(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 16:25dc4b811ad3 213 cmd_strobe(SPIRIT1_STROBE_READY);
Wolfgang Betz 16:25dc4b811ad3 214 } else if(SPIRIT1_STATUS() == SPIRIT1_STATE_RX) {
Wolfgang Betz 16:25dc4b811ad3 215 cmd_strobe(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 16:25dc4b811ad3 216 }
Wolfgang Betz 16:25dc4b811ad3 217 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 218
Wolfgang Betz 16:25dc4b811ad3 219 enable_spirit_irq();
Wolfgang Betz 3:0df38cfb1e53 220 }
Wolfgang Betz 3:0df38cfb1e53 221
Wolfgang Betz 4:07537ca85c66 222 int SimpleSpirit1::off(void) {
Wolfgang Betz 16:25dc4b811ad3 223 if(spirit_on == ON) {
Wolfgang Betz 16:25dc4b811ad3 224 /* Disables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 16:25dc4b811ad3 225 disable_spirit_irq();
Wolfgang Betz 3:0df38cfb1e53 226
Wolfgang Betz 16:25dc4b811ad3 227 /* first stop rx/tx */
Wolfgang Betz 16:25dc4b811ad3 228 cmd_strobe(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 3:0df38cfb1e53 229
Wolfgang Betz 16:25dc4b811ad3 230 /* Clear any pending irqs */
Wolfgang Betz 16:25dc4b811ad3 231 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 232
Wolfgang Betz 22:9165bd73c61e 233 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 10);
Wolfgang Betz 16:25dc4b811ad3 234 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
Wolfgang Betz 22:9165bd73c61e 235 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 236 debug("\n\rSpirit1: failed off->ready\n\r");
Wolfgang Betz 22:9165bd73c61e 237 #endif
Wolfgang Betz 16:25dc4b811ad3 238 return 1;
Wolfgang Betz 16:25dc4b811ad3 239 }
Wolfgang Betz 3:0df38cfb1e53 240
Wolfgang Betz 16:25dc4b811ad3 241 /* Puts the SPIRIT1 in STANDBY */
Wolfgang Betz 16:25dc4b811ad3 242 cmd_strobe(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 22:9165bd73c61e 243 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, 10);
Wolfgang Betz 16:25dc4b811ad3 244 if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 22:9165bd73c61e 245 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 246 debug("\n\rSpirit1: failed off->standby\n\r");
Wolfgang Betz 22:9165bd73c61e 247 #endif
Wolfgang Betz 16:25dc4b811ad3 248 return 1;
Wolfgang Betz 16:25dc4b811ad3 249 }
Wolfgang Betz 3:0df38cfb1e53 250
Wolfgang Betz 16:25dc4b811ad3 251 spirit_on = OFF;
Wolfgang Betz 16:25dc4b811ad3 252 _nr_of_irq_disables = 1;
Wolfgang Betz 16:25dc4b811ad3 253 _spirit_tx_started = false;
Wolfgang Betz 16:25dc4b811ad3 254 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 255 stop_rx_timeout();
Wolfgang Betz 12:b8056eda4028 256
Wolfgang Betz 16:25dc4b811ad3 257 CLEAR_TXBUF();
Wolfgang Betz 16:25dc4b811ad3 258 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 259 }
Wolfgang Betz 16:25dc4b811ad3 260 return 0;
Wolfgang Betz 3:0df38cfb1e53 261 }
Wolfgang Betz 3:0df38cfb1e53 262
Wolfgang Betz 4:07537ca85c66 263 int SimpleSpirit1::on(void) {
Wolfgang Betz 16:25dc4b811ad3 264 cmd_strobe(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 16:25dc4b811ad3 265 wait_us(SABORT_WAIT_US);
Wolfgang Betz 16:25dc4b811ad3 266 if(spirit_on == OFF) {
Wolfgang Betz 16:25dc4b811ad3 267 /* ensure we are in READY state as we go from there to Rx */
Wolfgang Betz 16:25dc4b811ad3 268 cmd_strobe(SPIRIT1_STROBE_READY);
Wolfgang Betz 22:9165bd73c61e 269 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 10);
Wolfgang Betz 16:25dc4b811ad3 270 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
Wolfgang Betz 22:9165bd73c61e 271 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 272 debug("\n\rSpirit1: failed to turn on\n\r");
Wolfgang Betz 22:9165bd73c61e 273 #endif
Wolfgang Betz 22:9165bd73c61e 274 return 1;
Wolfgang Betz 16:25dc4b811ad3 275 }
Wolfgang Betz 3:0df38cfb1e53 276
Wolfgang Betz 16:25dc4b811ad3 277 /* now we go to Rx */
Wolfgang Betz 16:25dc4b811ad3 278 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 279 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 22:9165bd73c61e 280 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 10);
Wolfgang Betz 16:25dc4b811ad3 281 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 22:9165bd73c61e 282 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 283 debug("\n\rSpirit1: failed to enter rx\n\r");
Wolfgang Betz 22:9165bd73c61e 284 #endif
Wolfgang Betz 22:9165bd73c61e 285 return 1;
Wolfgang Betz 16:25dc4b811ad3 286 }
Wolfgang Betz 16:25dc4b811ad3 287 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 288 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 289 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 290 stop_rx_timeout();
Wolfgang Betz 3:0df38cfb1e53 291
Wolfgang Betz 16:25dc4b811ad3 292 /* Enables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 16:25dc4b811ad3 293 spirit_on = ON;
Wolfgang Betz 22:9165bd73c61e 294 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 295 debug_if(!(_nr_of_irq_disables == 1), "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 296 #endif
Wolfgang Betz 16:25dc4b811ad3 297 enable_spirit_irq();
Wolfgang Betz 16:25dc4b811ad3 298 }
Wolfgang Betz 3:0df38cfb1e53 299
Wolfgang Betz 16:25dc4b811ad3 300 return 0;
Wolfgang Betz 3:0df38cfb1e53 301 }
Wolfgang Betz 3:0df38cfb1e53 302
Wolfgang Betz 3:0df38cfb1e53 303 uint16_t SimpleSpirit1::arch_refresh_status(void) {
Wolfgang Betz 16:25dc4b811ad3 304 uint16_t mcstate;
Wolfgang Betz 16:25dc4b811ad3 305 uint8_t header[2];
Wolfgang Betz 16:25dc4b811ad3 306 header[0]=READ_HEADER;
Wolfgang Betz 16:25dc4b811ad3 307 header[1]=MC_STATE1_BASE;
Wolfgang Betz 3:0df38cfb1e53 308
Wolfgang Betz 16:25dc4b811ad3 309 /* Puts the SPI chip select low to start the transaction */
Wolfgang Betz 16:25dc4b811ad3 310 chip_sync_select();
Wolfgang Betz 3:0df38cfb1e53 311
Wolfgang Betz 16:25dc4b811ad3 312 /* Write the aHeader bytes and read the SPIRIT1 status bytes */
Wolfgang Betz 16:25dc4b811ad3 313 mcstate = _spi.write(header[0]);
Wolfgang Betz 16:25dc4b811ad3 314 mcstate = mcstate<<8;
Wolfgang Betz 3:0df38cfb1e53 315
Wolfgang Betz 16:25dc4b811ad3 316 /* Write the aHeader bytes and read the SPIRIT1 status bytes */
Wolfgang Betz 16:25dc4b811ad3 317 mcstate |= _spi.write(header[1]);
Wolfgang Betz 3:0df38cfb1e53 318
Wolfgang Betz 16:25dc4b811ad3 319 /* Puts the SPI chip select high to end the transaction */
Wolfgang Betz 16:25dc4b811ad3 320 chip_sync_unselect();
Wolfgang Betz 3:0df38cfb1e53 321
Wolfgang Betz 16:25dc4b811ad3 322 return mcstate;
Wolfgang Betz 3:0df38cfb1e53 323 }
Wolfgang Betz 3:0df38cfb1e53 324
Wolfgang Betz 6:f5d01793bf86 325 int SimpleSpirit1::read(void *buf, unsigned int bufsize)
Wolfgang Betz 4:07537ca85c66 326 {
Wolfgang Betz 16:25dc4b811ad3 327 disable_spirit_irq();
Wolfgang Betz 6:f5d01793bf86 328
Wolfgang Betz 16:25dc4b811ad3 329 /* Checks if the RX buffer is empty */
Wolfgang Betz 16:25dc4b811ad3 330 if(IS_RXBUF_EMPTY()) {
Wolfgang Betz 16:25dc4b811ad3 331 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 332 cmd_strobe(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 16:25dc4b811ad3 333 wait_us(SABORT_WAIT_US);
Wolfgang Betz 16:25dc4b811ad3 334 cmd_strobe(SPIRIT1_STROBE_READY);
Wolfgang Betz 16:25dc4b811ad3 335 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 1);
Wolfgang Betz 16:25dc4b811ad3 336 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 337 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 16:25dc4b811ad3 338 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 1);
Wolfgang Betz 16:25dc4b811ad3 339 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 340 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 341 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 342 enable_spirit_irq();
Wolfgang Betz 16:25dc4b811ad3 343 return 0;
Wolfgang Betz 16:25dc4b811ad3 344 }
Wolfgang Betz 4:07537ca85c66 345
Wolfgang Betz 16:25dc4b811ad3 346 if(bufsize < spirit_rx_len) {
Wolfgang Betz 16:25dc4b811ad3 347 enable_spirit_irq();
Wolfgang Betz 6:f5d01793bf86 348
Wolfgang Betz 16:25dc4b811ad3 349 /* If buf has the correct size */
Wolfgang Betz 22:9165bd73c61e 350 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 351 debug("\n\rTOO SMALL BUF\n\r");
Wolfgang Betz 22:9165bd73c61e 352 #endif
Wolfgang Betz 16:25dc4b811ad3 353 return 0;
Wolfgang Betz 16:25dc4b811ad3 354 } else {
Wolfgang Betz 16:25dc4b811ad3 355 /* Copies the packet received */
Wolfgang Betz 16:25dc4b811ad3 356 memcpy(buf, spirit_rx_buf, spirit_rx_len);
Wolfgang Betz 4:07537ca85c66 357
Wolfgang Betz 16:25dc4b811ad3 358 bufsize = spirit_rx_len;
Wolfgang Betz 16:25dc4b811ad3 359 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 360 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 361 CLEAR_RXBUF();
Wolfgang Betz 4:07537ca85c66 362
Wolfgang Betz 16:25dc4b811ad3 363 enable_spirit_irq();
Wolfgang Betz 6:f5d01793bf86 364
Wolfgang Betz 16:25dc4b811ad3 365 return bufsize;
Wolfgang Betz 16:25dc4b811ad3 366 }
Wolfgang Betz 4:07537ca85c66 367
Wolfgang Betz 4:07537ca85c66 368 }
Wolfgang Betz 4:07537ca85c66 369
Wolfgang Betz 4:07537ca85c66 370 int SimpleSpirit1::channel_clear(void)
Wolfgang Betz 4:07537ca85c66 371 {
Wolfgang Betz 16:25dc4b811ad3 372 float rssi_value;
Wolfgang Betz 16:25dc4b811ad3 373 /* Local variable used to memorize the SPIRIT1 state */
Wolfgang Betz 16:25dc4b811ad3 374 uint8_t spirit_state = ON;
Wolfgang Betz 4:07537ca85c66 375
Wolfgang Betz 16:25dc4b811ad3 376 if(spirit_on == OFF) {
Wolfgang Betz 16:25dc4b811ad3 377 /* Wakes up the SPIRIT1 */
Wolfgang Betz 16:25dc4b811ad3 378 on();
Wolfgang Betz 16:25dc4b811ad3 379 spirit_state = OFF;
Wolfgang Betz 16:25dc4b811ad3 380 }
Wolfgang Betz 4:07537ca85c66 381
Wolfgang Betz 16:25dc4b811ad3 382 disable_spirit_irq();
Wolfgang Betz 7:e90fa8f6bc6c 383
Wolfgang Betz 16:25dc4b811ad3 384 /* Reset State to Ready */
Wolfgang Betz 16:25dc4b811ad3 385 set_ready_state();
Wolfgang Betz 16:25dc4b811ad3 386 {
Wolfgang Betz 16:25dc4b811ad3 387 uint32_t timeout = us_ticker_read() + 5000;
Wolfgang Betz 16:25dc4b811ad3 388 do {
Wolfgang Betz 16:25dc4b811ad3 389 mgmt_refresh_status();
Wolfgang Betz 16:25dc4b811ad3 390 } while((st_lib_g_x_status.MC_STATE != MC_STATE_READY) && (us_ticker_read() < timeout));
Wolfgang Betz 16:25dc4b811ad3 391 if(st_lib_g_x_status.MC_STATE != MC_STATE_READY) {
Wolfgang Betz 16:25dc4b811ad3 392 enable_spirit_irq();
Wolfgang Betz 16:25dc4b811ad3 393 return 1;
Wolfgang Betz 16:25dc4b811ad3 394 }
Wolfgang Betz 16:25dc4b811ad3 395 }
Wolfgang Betz 4:07537ca85c66 396
Wolfgang Betz 16:25dc4b811ad3 397 /* Stores the RSSI value */
Wolfgang Betz 16:25dc4b811ad3 398 rssi_value = qi_get_rssi_dbm();
Wolfgang Betz 4:07537ca85c66 399
Wolfgang Betz 16:25dc4b811ad3 400 enable_spirit_irq();
Wolfgang Betz 7:e90fa8f6bc6c 401
Wolfgang Betz 16:25dc4b811ad3 402 /* Puts the SPIRIT1 in its previous state */
Wolfgang Betz 16:25dc4b811ad3 403 if(spirit_state==OFF) {
Wolfgang Betz 16:25dc4b811ad3 404 off();
Wolfgang Betz 16:25dc4b811ad3 405 } else {
Wolfgang Betz 16:25dc4b811ad3 406 disable_spirit_irq();
Wolfgang Betz 16:25dc4b811ad3 407 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 408 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 16:25dc4b811ad3 409 /* SpiritCmdStrobeRx();*/
Wolfgang Betz 22:9165bd73c61e 410 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 10);
Wolfgang Betz 16:25dc4b811ad3 411 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 412 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 413 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 414 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 415 enable_spirit_irq();
Wolfgang Betz 16:25dc4b811ad3 416 }
Wolfgang Betz 4:07537ca85c66 417
Wolfgang Betz 16:25dc4b811ad3 418 /* Checks the RSSI value with the threshold */
Wolfgang Betz 16:25dc4b811ad3 419 if(rssi_value<CCA_THRESHOLD) {
Wolfgang Betz 16:25dc4b811ad3 420 return 0;
Wolfgang Betz 16:25dc4b811ad3 421 } else {
Wolfgang Betz 16:25dc4b811ad3 422 return 1;
Wolfgang Betz 16:25dc4b811ad3 423 }
Wolfgang Betz 4:07537ca85c66 424 }
Wolfgang Betz 4:07537ca85c66 425
Wolfgang Betz 7:e90fa8f6bc6c 426 int SimpleSpirit1::get_pending_packet(void)
Wolfgang Betz 4:07537ca85c66 427 {
Wolfgang Betz 16:25dc4b811ad3 428 return !IS_RXBUF_EMPTY();
Wolfgang Betz 4:07537ca85c66 429 }
Wolfgang Betz 4:07537ca85c66 430
Wolfgang Betz 5:c9c5bc673c64 431 /** Spirit Irq Callback **/
Wolfgang Betz 5:c9c5bc673c64 432 void SimpleSpirit1::IrqHandler() {
Wolfgang Betz 16:25dc4b811ad3 433 st_lib_spirit_irqs x_irq_status;
Wolfgang Betz 4:07537ca85c66 434
Wolfgang Betz 16:25dc4b811ad3 435 /* get interrupt source from radio */
Wolfgang Betz 16:25dc4b811ad3 436 irq_get_status(&x_irq_status);
Wolfgang Betz 16:25dc4b811ad3 437 // betzw - WAS: irq_clear_status(); BUT already cleared by get status!
Wolfgang Betz 4:07537ca85c66 438
Wolfgang Betz 16:25dc4b811ad3 439 /* Reception errors */
Wolfgang Betz 16:25dc4b811ad3 440 if((x_irq_status.IRQ_RX_FIFO_ERROR) || (x_irq_status.IRQ_RX_DATA_DISC) || (x_irq_status.IRQ_RX_TIMEOUT)) {
Wolfgang Betz 16:25dc4b811ad3 441 _spirit_rx_err = true;
Wolfgang Betz 16:25dc4b811ad3 442 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 443 CLEAR_RXBUF();
Wolfgang Betz 6:f5d01793bf86 444 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 445 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 446 if(_spirit_tx_started) {
Wolfgang Betz 16:25dc4b811ad3 447 _spirit_tx_started = false;
Wolfgang Betz 16:25dc4b811ad3 448 CLEAR_TXBUF();
Wolfgang Betz 16:25dc4b811ad3 449 /* call user callback */
Wolfgang Betz 16:25dc4b811ad3 450 if(_current_irq_callback) {
Wolfgang Betz 16:25dc4b811ad3 451 _current_irq_callback(TX_ERR);
Wolfgang Betz 6:f5d01793bf86 452 }
Wolfgang Betz 6:f5d01793bf86 453 }
Wolfgang Betz 16:25dc4b811ad3 454 }
Wolfgang Betz 16:25dc4b811ad3 455
Wolfgang Betz 16:25dc4b811ad3 456 /* Transmission error */
Wolfgang Betz 16:25dc4b811ad3 457 if(x_irq_status.IRQ_TX_FIFO_ERROR) {
Wolfgang Betz 22:9165bd73c61e 458 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 459 debug("\n\r%s (%d)", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 460 #endif
Wolfgang Betz 16:25dc4b811ad3 461 cmd_strobe(SPIRIT1_STROBE_FTX);
Wolfgang Betz 16:25dc4b811ad3 462 if(_spirit_tx_started) {
Wolfgang Betz 16:25dc4b811ad3 463 _spirit_tx_started = false;
Wolfgang Betz 16:25dc4b811ad3 464 CLEAR_TXBUF();
Wolfgang Betz 16:25dc4b811ad3 465 /* call user callback */
Wolfgang Betz 16:25dc4b811ad3 466 if(_current_irq_callback) {
Wolfgang Betz 16:25dc4b811ad3 467 _current_irq_callback(TX_ERR);
Wolfgang Betz 16:25dc4b811ad3 468 }
Wolfgang Betz 16:25dc4b811ad3 469 }
Wolfgang Betz 16:25dc4b811ad3 470 }
Wolfgang Betz 16:25dc4b811ad3 471
Wolfgang Betz 16:25dc4b811ad3 472 /* The IRQ_VALID_SYNC is used to notify a new packet is coming */
Wolfgang Betz 16:25dc4b811ad3 473 if(x_irq_status.IRQ_VALID_SYNC) {
Wolfgang Betz 16:25dc4b811ad3 474 _is_receiving = true;
Wolfgang Betz 16:25dc4b811ad3 475 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 476 CLEAR_RXBUF();
Wolfgang Betz 22:9165bd73c61e 477 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 478 debug_if(_spirit_tx_started, "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 479 #endif
Wolfgang Betz 16:25dc4b811ad3 480 start_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 481 }
Wolfgang Betz 16:25dc4b811ad3 482
Wolfgang Betz 16:25dc4b811ad3 483 /* The IRQ_TX_DATA_SENT notifies the packet received. Puts the SPIRIT1 in RX */
Wolfgang Betz 16:25dc4b811ad3 484 if(x_irq_status.IRQ_TX_DATA_SENT) {
Wolfgang Betz 22:9165bd73c61e 485 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 486 debug_if(!_spirit_tx_started, "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 487 #endif
Wolfgang Betz 5:c9c5bc673c64 488
Wolfgang Betz 6:f5d01793bf86 489 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 490 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 16:25dc4b811ad3 491 /* SpiritCmdStrobeRx();*/
Wolfgang Betz 16:25dc4b811ad3 492 CLEAR_TXBUF();
Wolfgang Betz 16:25dc4b811ad3 493 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 494 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 495 _spirit_tx_started = false;
Wolfgang Betz 4:07537ca85c66 496
Wolfgang Betz 6:f5d01793bf86 497 /* call user callback */
Wolfgang Betz 6:f5d01793bf86 498 if(_current_irq_callback) {
Wolfgang Betz 16:25dc4b811ad3 499 _current_irq_callback(TX_DONE); // betzw - TODO: define enums for callback values
Wolfgang Betz 6:f5d01793bf86 500 }
Wolfgang Betz 16:25dc4b811ad3 501 }
Wolfgang Betz 15:852b92eed64a 502
Wolfgang Betz 16:25dc4b811ad3 503 /* RX FIFO almost full */
Wolfgang Betz 16:25dc4b811ad3 504 if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) {
Wolfgang Betz 16:25dc4b811ad3 505 if(_spirit_rx_err) {
Wolfgang Betz 16:25dc4b811ad3 506 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 507 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 508 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 509 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 510 } else {
Wolfgang Betz 16:25dc4b811ad3 511 uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
Wolfgang Betz 16:25dc4b811ad3 512 unsigned int remaining = MAX_PACKET_LEN - _spirit_rx_pos;
Wolfgang Betz 16:25dc4b811ad3 513 if(fifo_available > remaining) {
Wolfgang Betz 16:25dc4b811ad3 514 _spirit_rx_err = true;
Wolfgang Betz 16:25dc4b811ad3 515 _is_receiving = false;
Wolfgang Betz 16:25dc4b811ad3 516 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 517 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 518 stop_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 519 } else {
Wolfgang Betz 16:25dc4b811ad3 520 spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
Wolfgang Betz 16:25dc4b811ad3 521 _spirit_rx_pos += fifo_available;
Wolfgang Betz 16:25dc4b811ad3 522 if(!_is_receiving) {
Wolfgang Betz 16:25dc4b811ad3 523 _is_receiving = true;
Wolfgang Betz 16:25dc4b811ad3 524 start_rx_timeout();
Wolfgang Betz 16:25dc4b811ad3 525 }
Wolfgang Betz 16:25dc4b811ad3 526 }
Wolfgang Betz 16:25dc4b811ad3 527 }
Wolfgang Betz 16:25dc4b811ad3 528 }
Wolfgang Betz 15:852b92eed64a 529
Wolfgang Betz 16:25dc4b811ad3 530 /* The IRQ_RX_DATA_READY notifies a new packet arrived */
Wolfgang Betz 16:25dc4b811ad3 531 if(x_irq_status.IRQ_RX_DATA_READY) {
Wolfgang Betz 16:25dc4b811ad3 532 _is_receiving = false; // Finished receiving
Wolfgang Betz 16:25dc4b811ad3 533 stop_rx_timeout();
Wolfgang Betz 15:852b92eed64a 534
Wolfgang Betz 16:25dc4b811ad3 535 if(_spirit_rx_err) {
Wolfgang Betz 16:25dc4b811ad3 536 _spirit_rx_err = false;
Wolfgang Betz 16:25dc4b811ad3 537 CLEAR_RXBUF();
Wolfgang Betz 16:25dc4b811ad3 538 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 539 } else {
Wolfgang Betz 16:25dc4b811ad3 540 spirit_rx_len = pkt_basic_get_received_pkt_length();
Wolfgang Betz 16:25dc4b811ad3 541 unsigned int remaining = 0;
Wolfgang Betz 16:25dc4b811ad3 542 // uint8_t fifo_available = 0; // betzw: optimized out in favor of a request less to SPIRIT device
Wolfgang Betz 16:25dc4b811ad3 543 uint8_t to_receive = 0;
Wolfgang Betz 16:25dc4b811ad3 544
Wolfgang Betz 22:9165bd73c61e 545 #ifndef NDEBUG
Wolfgang Betz 22:9165bd73c61e 546 debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\n\rassert failed in: %s (%d)\n\r", __func__, __LINE__);
Wolfgang Betz 22:9165bd73c61e 547 #endif
Wolfgang Betz 16:25dc4b811ad3 548
Wolfgang Betz 16:25dc4b811ad3 549 for(; _spirit_rx_pos < spirit_rx_len;) {
Wolfgang Betz 16:25dc4b811ad3 550 remaining = spirit_rx_len - _spirit_rx_pos;
Wolfgang Betz 16:25dc4b811ad3 551 // fifo_available = linear_fifo_read_num_elements_rx_fifo(); // betzw: optimized out in favor of a request less to SPIRIT device
Wolfgang Betz 16:25dc4b811ad3 552 to_receive = remaining; // betzw - WAS: (remaining < fifo_available) ? remaining : fifo_available;
Wolfgang Betz 16:25dc4b811ad3 553 if(to_receive > 0) {
Wolfgang Betz 16:25dc4b811ad3 554 spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
Wolfgang Betz 16:25dc4b811ad3 555 _spirit_rx_pos += to_receive;
Wolfgang Betz 16:25dc4b811ad3 556 }
Wolfgang Betz 16:25dc4b811ad3 557 }
Wolfgang Betz 16:25dc4b811ad3 558
Wolfgang Betz 16:25dc4b811ad3 559 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 16:25dc4b811ad3 560
Wolfgang Betz 16:25dc4b811ad3 561 last_rssi = qi_get_rssi(); //MGR
Wolfgang Betz 16:25dc4b811ad3 562 last_lqi = qi_get_lqi(); //MGR
Wolfgang Betz 16:25dc4b811ad3 563
Wolfgang Betz 16:25dc4b811ad3 564 #if NULLRDC_CONF_802154_AUTOACK
Wolfgang Betz 16:25dc4b811ad3 565 if (spirit_rxbuf[0] == ACK_LEN) {
Wolfgang Betz 16:25dc4b811ad3 566 /* For debugging purposes we assume this is an ack for us */
Wolfgang Betz 16:25dc4b811ad3 567 just_got_an_ack = 1;
Wolfgang Betz 16:25dc4b811ad3 568 }
Wolfgang Betz 16:25dc4b811ad3 569 #endif /* NULLRDC_CONF_802154_AUTOACK */
Wolfgang Betz 16:25dc4b811ad3 570
Wolfgang Betz 16:25dc4b811ad3 571 /* call user callback */
Wolfgang Betz 16:25dc4b811ad3 572 if(_current_irq_callback) {
Wolfgang Betz 16:25dc4b811ad3 573 _current_irq_callback(RX_DONE); // betzw - TODO: define enums for callback values
Wolfgang Betz 16:25dc4b811ad3 574 }
Wolfgang Betz 16:25dc4b811ad3 575 }
Wolfgang Betz 16:25dc4b811ad3 576 }
Wolfgang Betz 4:07537ca85c66 577 }