180718 HJM : 8 Count sensing data RF send, certTest, temp(cold)Test

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
jmhong
Date:
Wed Mar 21 05:06:08 2018 +0000
Revision:
83:54b207156a91
Parent:
82:a18c22d2b83a
Child:
84:45b9ff78a066
HJM : EV COG AD3029LZ test;

Who changed what in which revision?

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