센서보드 RF IRQ 테스트 중

Fork of stm-spirit1-rf-driver by ST

Committer:
jmhong
Date:
Thu Sep 20 04:46:49 2018 +0000
Revision:
85:4ca74d007fe7
Parent:
84:45b9ff78a066
Environmental test.. temp, etc...

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 84:45b9ff78a066 6
jmhong 84:45b9ff78a066 7 //180327 HJM : 디버그 라인
jmhong 84:45b9ff78a066 8 //180619 HJM : 디버그는 전부 중지.
jmhong 84:45b9ff78a066 9 //#define CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 10 //#define NDEBUG
jmhong 84:45b9ff78a066 11 //#define DEBUG_IRQ
jmhong 84:45b9ff78a066 12 //#define HEAVY_DEBUG
jmhong 84:45b9ff78a066 13
jmhong 84:45b9ff78a066 14
jmhong 84:45b9ff78a066 15 //180619 HJM : init 재시작을 위한 카운팅 변수
jmhong 84:45b9ff78a066 16 static int iErrorCounting = 0;
jmhong 85:4ca74d007fe7 17 #define MAX_ERROR_COUNTING 3
jmhong 84:45b9ff78a066 18 #define RETURN_ERROR_NUMBER 100
jmhong 84:45b9ff78a066 19
jmhong 84:45b9ff78a066 20
jmhong 84:45b9ff78a066 21 #define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_0)
jmhong 84:45b9ff78a066 22 //#define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_2)
jmhong 84:45b9ff78a066 23 //#define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_1) //EV-COG-AD3029LZ -> GPIO 8 -> P0_08
Wolfgang Betz 34:edda6a7238ec 24
Wolfgang Betz 34:edda6a7238ec 25 static uint16_t last_state;
Wolfgang Betz 34:edda6a7238ec 26 #define SPIRIT1_STATUS() ((last_state = (uint16_t)refresh_state()) & SPIRIT1_STATE_STATEBITS)
Wolfgang Betz 34:edda6a7238ec 27
Wolfgang Betz 34:edda6a7238ec 28 #define XO_ON (0x1)
Wolfgang Betz 34:edda6a7238ec 29
Wolfgang Betz 70:19b5f9b9ba80 30 #define BUSYWAIT_UNTIL(cond, millisecs) \
Wolfgang Betz 70:19b5f9b9ba80 31 do { \
Wolfgang Betz 70:19b5f9b9ba80 32 uint32_t start = us_ticker_read(); \
Wolfgang Betz 70:19b5f9b9ba80 33 uint32_t limit = (uint32_t)millisecs*1000U; \
Wolfgang Betz 70:19b5f9b9ba80 34 while (!(cond)) { \
Wolfgang Betz 70:19b5f9b9ba80 35 uint32_t now = us_ticker_read(); \
Wolfgang Betz 71:4a7772415d9c 36 if((now - start) > limit) break; \
Wolfgang Betz 70:19b5f9b9ba80 37 } \
Wolfgang Betz 69:22e9b407effa 38 } while(0)
Wolfgang Betz 34:edda6a7238ec 39
Wolfgang Betz 34:edda6a7238ec 40 #define st_lib_spirit_irqs SpiritIrqs
Wolfgang Betz 34:edda6a7238ec 41
Wolfgang Betz 37:bc043030b55a 42 #define STATE_TIMEOUT (100)
Wolfgang Betz 34:edda6a7238ec 43
jmhong 84:45b9ff78a066 44
jmhong 84:45b9ff78a066 45 #define CUBEBITE_OUTPUT_POWER_DBM_TEST 0
jmhong 84:45b9ff78a066 46
jmhong 84:45b9ff78a066 47
Wolfgang Betz 34:edda6a7238ec 48 // betzw: switching force & back from standby is on some devices quite unstable
Wolfgang Betz 34:edda6a7238ec 49 #define USE_STANDBY_STATE
Wolfgang Betz 34:edda6a7238ec 50
Wolfgang Betz 34:edda6a7238ec 51 /*** Class Implementation ***/
Wolfgang Betz 34:edda6a7238ec 52 /** Static Class Variables **/
Wolfgang Betz 34:edda6a7238ec 53 SimpleSpirit1 *SimpleSpirit1::_singleton = NULL;
Wolfgang Betz 34:edda6a7238ec 54
jmhong 84:45b9ff78a066 55
jmhong 84:45b9ff78a066 56
jmhong 84:45b9ff78a066 57
jmhong 84:45b9ff78a066 58
jmhong 84:45b9ff78a066 59
Wolfgang Betz 34:edda6a7238ec 60 /** Constructor **/
Wolfgang Betz 34:edda6a7238ec 61 SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
Wolfgang Betz 69:22e9b407effa 62 PinName irq, PinName cs, PinName sdn,
jmhong 84:45b9ff78a066 63 PinName led, uint32_t uint32SClkSettingValue) :
jmhong 84:45b9ff78a066 64 _spi(mosi, miso, sclk),
jmhong 84:45b9ff78a066 65 _irq(irq),
jmhong 84:45b9ff78a066 66 _chip_select(cs),
jmhong 84:45b9ff78a066 67 _shut_down(sdn),
jmhong 84:45b9ff78a066 68 _led(led),
jmhong 84:45b9ff78a066 69 _current_irq_callback(),
jmhong 84:45b9ff78a066 70 _rx_receiving_timeout(),
jmhong 84:45b9ff78a066 71 _uint32SpiClkSettingValue(uint32SClkSettingValue)
Wolfgang Betz 34:edda6a7238ec 72 {
Wolfgang Betz 34:edda6a7238ec 73 }
Wolfgang Betz 34:edda6a7238ec 74
jmhong 84:45b9ff78a066 75
jmhong 84:45b9ff78a066 76
jmhong 84:45b9ff78a066 77
jmhong 84:45b9ff78a066 78
jmhong 84:45b9ff78a066 79
jmhong 84:45b9ff78a066 80 //180619 HJM : 굳이 spi init을 한 번 더한다고 문제가 없는 거라면 ?? 테스트 해보자.
Wolfgang Betz 34:edda6a7238ec 81 /** Init Function **/
jmhong 84:45b9ff78a066 82 void SimpleSpirit1::init()
jmhong 84:45b9ff78a066 83 {
jmhong 84:45b9ff78a066 84 printf("[INIT_REVISE]init start...\n");
jmhong 84:45b9ff78a066 85 //if (false == isItDoItSPIInit)
jmhong 84:45b9ff78a066 86 // {
jmhong 84:45b9ff78a066 87 // isItDoItSPIInit = true;
jmhong 84:45b9ff78a066 88
jmhong 84:45b9ff78a066 89 /*cubebite HJM, reset irq disable counter and irq callback & disable irq */
jmhong 83:54b207156a91 90 _nr_of_irq_disables = 0; // @@
jmhong 85:4ca74d007fe7 91 // disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 92
jmhong 83:54b207156a91 93 /*cubebite HJM, unselect chip */
Wolfgang Betz 69:22e9b407effa 94 chip_unselect();
Wolfgang Betz 34:edda6a7238ec 95
jmhong 83:54b207156a91 96 /*cubebite HJM, configure spi */
Wolfgang Betz 69:22e9b407effa 97 _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */
jmhong 83:54b207156a91 98
jmhong 84:45b9ff78a066 99 _spi.frequency(_uint32SpiClkSettingValue); //HJM 초기 값, 6500000
jmhong 84:45b9ff78a066 100 printf("Setting spi clk : [%d]\r\n", _uint32SpiClkSettingValue);
Wolfgang Betz 34:edda6a7238ec 101
jmhong 84:45b9ff78a066 102 // _spi.frequency(13000000); // 13MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 103 // _spi.frequency(6500000); // 6.5MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 104 // _spi.frequency(4333333); // 4.3333...MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 105 // _spi.frequency(2600000); // 2.6MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 106 // _spi.frequency(1444444); // 1.4444...MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 107 // _spi.frequency(764705); // 0.6470...MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 108 // _spi.frequency(393939); // 0.3939...MHz (i.e. max speed allowed for Spirit1)
jmhong 84:45b9ff78a066 109 // }
jmhong 83:54b207156a91 110
jmhong 84:45b9ff78a066 111 //if (false == isItDoItRFInit)
jmhong 84:45b9ff78a066 112 // {
jmhong 84:45b9ff78a066 113 // isItDoItRFInit = true;
jmhong 83:54b207156a91 114
jmhong 84:45b9ff78a066 115 //180619 HJM : 여기서 부터 sprit1 init 부분
jmhong 83:54b207156a91 116 /*cubebite HJM, install irq handler */
Wolfgang Betz 69:22e9b407effa 117 _irq.mode(PullUp);
Wolfgang Betz 69:22e9b407effa 118 _irq.fall(Callback<void()>(this, &SimpleSpirit1::IrqHandler));
Wolfgang Betz 34:edda6a7238ec 119
jmhong 84:45b9ff78a066 120
jmhong 84:45b9ff78a066 121
jmhong 83:54b207156a91 122 /*cubebite HJM, init cube vars */
Wolfgang Betz 69:22e9b407effa 123 spirit_on = OFF;
Wolfgang Betz 69:22e9b407effa 124 last_rssi = 0 ; //MGR
Wolfgang Betz 69:22e9b407effa 125 last_sqi = 0 ; //MGR
Wolfgang Betz 34:edda6a7238ec 126
Wolfgang Betz 34:edda6a7238ec 127
jmhong 84:45b9ff78a066 128 /*cubebite HJM, set frequencies */
jmhong 84:45b9ff78a066 129 printf("[INIT_REVISE]set frequencies...");
jmhong 84:45b9ff78a066 130 radio_set_xtal_freq(XTAL_FREQUENCY); //cubebite HJM, 50MHz, 180619 HJM : 단순히 변수 셋팅
jmhong 84:45b9ff78a066 131 mgmt_set_freq_base((uint32_t)BASE_FREQUENCY); // @@
jmhong 84:45b9ff78a066 132 printf("OK\n");
jmhong 84:45b9ff78a066 133
jmhong 83:54b207156a91 134 /*cubebite HJM , restart board */
jmhong 84:45b9ff78a066 135 enter_shutdown();
jmhong 84:45b9ff78a066 136 exit_shutdown();
Wolfgang Betz 34:edda6a7238ec 137
jmhong 83:54b207156a91 138 /*cubebite HJM, soft core reset */
Wolfgang Betz 69:22e9b407effa 139 cmd_strobe(SPIRIT1_STROBE_SRES);
Wolfgang Betz 34:edda6a7238ec 140
jmhong 84:45b9ff78a066 141
jmhong 84:45b9ff78a066 142
jmhong 84:45b9ff78a066 143
jmhong 84:45b9ff78a066 144
jmhong 84:45b9ff78a066 145
jmhong 84:45b9ff78a066 146
jmhong 84:45b9ff78a066 147 //180619 HJM : 여기서 부터는 init while문이 들어감.
jmhong 83:54b207156a91 148 /*cubebite HJM, Configures the SPIRIT1 radio part */
jmhong 83:54b207156a91 149 //180119 HJM : 433MHz 설정으로 변경 후 테스트.
jmhong 84:45b9ff78a066 150 printf("[INIT_REVISE]set SPIRIT1 radio...\n");
jmhong 84:45b9ff78a066 151 SRadioInit x_radio_init = {
jmhong 84:45b9ff78a066 152 XTAL_OFFSET_PPM, // Xtal offset in ppm
jmhong 84:45b9ff78a066 153 (uint32_t)BASE_FREQUENCY, // HJM 수정 후 테스트 중 base frequency
jmhong 84:45b9ff78a066 154 (uint32_t)CHANNEL_SPACE, // channel space
jmhong 84:45b9ff78a066 155 CHANNEL_NUMBER, // channel number, HJM : 뭐지 0 인줄 알았더니 1로 셋팅되어있네/
jmhong 84:45b9ff78a066 156 MODULATION_SELECT, // modulation select
jmhong 84:45b9ff78a066 157 DATARATE, // HJM 수정 후 테스트 중
jmhong 84:45b9ff78a066 158 (uint32_t)FREQ_DEVIATION, // frequency deviation
jmhong 84:45b9ff78a066 159 (uint32_t)BANDWIDTH // channel filter bandwidth
jmhong 84:45b9ff78a066 160 };
jmhong 84:45b9ff78a066 161
jmhong 84:45b9ff78a066 162
jmhong 84:45b9ff78a066 163
jmhong 84:45b9ff78a066 164
jmhong 84:45b9ff78a066 165
jmhong 84:45b9ff78a066 166 uint8_t ui8Return;
jmhong 83:54b207156a91 167 ui8Return = radio_init(&x_radio_init);
jmhong 84:45b9ff78a066 168 if (RETURN_ERROR_NUMBER == ui8Return)
jmhong 85:4ca74d007fe7 169 {
jmhong 84:45b9ff78a066 170 reset_board();
jmhong 84:45b9ff78a066 171 return;
jmhong 84:45b9ff78a066 172 }
jmhong 83:54b207156a91 173 printf("test 9, ui8Return : [%d]\n", ui8Return);
jmhong 84:45b9ff78a066 174
jmhong 84:45b9ff78a066 175
jmhong 84:45b9ff78a066 176
jmhong 84:45b9ff78a066 177
jmhong 83:54b207156a91 178 /*180117 HJM : 송신 신호 세기 */
jmhong 84:45b9ff78a066 179 radio_set_pa_level_dbm(0,POWER_DBM); ///hjm test
jmhong 85:4ca74d007fe7 180 // radio_set_pa_level_dbm(0,10.0);
jmhong 84:45b9ff78a066 181 // radio_set_pa_level_dbm(0,CUBEBITE_OUTPUT_POWER_DBM_TEST);
Wolfgang Betz 69:22e9b407effa 182 radio_set_pa_level_max_index(0);
Wolfgang Betz 34:edda6a7238ec 183
jmhong 84:45b9ff78a066 184
jmhong 84:45b9ff78a066 185
jmhong 84:45b9ff78a066 186
Wolfgang Betz 69:22e9b407effa 187 /* Configures the SPIRIT1 packet handler part*/
Wolfgang Betz 69:22e9b407effa 188 PktBasicInit x_basic_init = {
jmhong 84:45b9ff78a066 189 PREAMBLE_LENGTH,
jmhong 84:45b9ff78a066 190 SYNC_LENGTH,
jmhong 84:45b9ff78a066 191 SYNC_WORD,
jmhong 84:45b9ff78a066 192 LENGTH_TYPE,
jmhong 84:45b9ff78a066 193 LENGTH_WIDTH,
jmhong 84:45b9ff78a066 194 CRC_MODE,
jmhong 84:45b9ff78a066 195 CONTROL_LENGTH,
jmhong 84:45b9ff78a066 196 EN_ADDRESS,
jmhong 84:45b9ff78a066 197 EN_FEC,
jmhong 84:45b9ff78a066 198 EN_WHITENING
Wolfgang Betz 69:22e9b407effa 199 };
Wolfgang Betz 69:22e9b407effa 200 pkt_basic_init(&x_basic_init);
Wolfgang Betz 34:edda6a7238ec 201
jmhong 84:45b9ff78a066 202
jmhong 84:45b9ff78a066 203
jmhong 84:45b9ff78a066 204
jmhong 84:45b9ff78a066 205
jmhong 84:45b9ff78a066 206
Wolfgang Betz 69:22e9b407effa 207 /* Enable the following interrupt sources, routed to GPIO */
Wolfgang Betz 69:22e9b407effa 208 irq_de_init(NULL);
Wolfgang Betz 69:22e9b407effa 209 irq_clear_status();
Wolfgang Betz 69:22e9b407effa 210 irq_set_status(TX_DATA_SENT, S_ENABLE);
Wolfgang Betz 69:22e9b407effa 211 irq_set_status(RX_DATA_READY,S_ENABLE);
Wolfgang Betz 69:22e9b407effa 212 irq_set_status(RX_DATA_DISC, S_ENABLE);
Wolfgang Betz 69:22e9b407effa 213 irq_set_status(VALID_SYNC, S_ENABLE);
Wolfgang Betz 69:22e9b407effa 214 irq_set_status(TX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 69:22e9b407effa 215 irq_set_status(RX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 47:3a30b960a8c2 216 #ifndef RX_FIFO_THR_WA
Wolfgang Betz 69:22e9b407effa 217 irq_set_status(TX_FIFO_ALMOST_EMPTY, S_ENABLE);
Wolfgang Betz 69:22e9b407effa 218 irq_set_status(RX_FIFO_ALMOST_FULL, S_ENABLE);
Wolfgang Betz 47:3a30b960a8c2 219 #endif // !RX_FIFO_THR_WA
Wolfgang Betz 34:edda6a7238ec 220
jmhong 84:45b9ff78a066 221
jmhong 84:45b9ff78a066 222
jmhong 84:45b9ff78a066 223
Wolfgang Betz 69:22e9b407effa 224 /* Configure Spirit1 */
Wolfgang Betz 69:22e9b407effa 225 radio_persistent_rx(S_ENABLE);
Wolfgang Betz 69:22e9b407effa 226 qi_set_sqi_threshold(SQI_TH_0);
Wolfgang Betz 69:22e9b407effa 227 qi_sqi_check(S_ENABLE);
jmhong 83:54b207156a91 228 qi_set_rssi_threshold_dbm(CCA_THRESHOLD); //180205 HJM : RRSI 셋팅 값 수정 테스트
Wolfgang Betz 69:22e9b407effa 229 timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD);
Wolfgang Betz 69:22e9b407effa 230 timer_set_infinite_rx_timeout();
Wolfgang Betz 69:22e9b407effa 231 radio_afc_freeze_on_sync(S_ENABLE);
Wolfgang Betz 69:22e9b407effa 232 calibration_rco(S_ENABLE);
Wolfgang Betz 34:edda6a7238ec 233
jmhong 83:54b207156a91 234 spirit_on = OFF;
Wolfgang Betz 69:22e9b407effa 235 CLEAR_TXBUF();
Wolfgang Betz 69:22e9b407effa 236 CLEAR_RXBUF();
Wolfgang Betz 69:22e9b407effa 237 _spirit_tx_started = false;
Wolfgang Betz 69:22e9b407effa 238 _is_receiving = false;
Wolfgang Betz 34:edda6a7238ec 239
Wolfgang Betz 69:22e9b407effa 240 /* Configure the radio to route the IRQ signal to its GPIO 3 */
Wolfgang Betz 69:22e9b407effa 241 SGpioInit x_gpio_init = {
jmhong 84:45b9ff78a066 242 SPIRIT_GPIO_IRQ,
jmhong 84:45b9ff78a066 243 SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,
jmhong 84:45b9ff78a066 244 SPIRIT_GPIO_DIG_OUT_IRQ
Wolfgang Betz 69:22e9b407effa 245 };
Wolfgang Betz 69:22e9b407effa 246 spirit_gpio_init(&x_gpio_init);
Wolfgang Betz 34:edda6a7238ec 247
jmhong 84:45b9ff78a066 248
jmhong 84:45b9ff78a066 249
jmhong 84:45b9ff78a066 250
jmhong 84:45b9ff78a066 251
jmhong 84:45b9ff78a066 252
Wolfgang Betz 69:22e9b407effa 253 /* Setup CSMA/CA */
Wolfgang Betz 69:22e9b407effa 254 CsmaInit x_csma_init = {
jmhong 84:45b9ff78a066 255 S_ENABLE, // enable persistent mode
jmhong 84:45b9ff78a066 256 TBIT_TIME_64, // Tcca time
jmhong 84:45b9ff78a066 257 TCCA_TIME_3, // Lcca length
jmhong 84:45b9ff78a066 258 5, // max nr of backoffs (<8)
jmhong 84:45b9ff78a066 259 1, // BU counter seed
jmhong 84:45b9ff78a066 260 8 // BU prescaler
Wolfgang Betz 69:22e9b407effa 261 };
Wolfgang Betz 69:22e9b407effa 262 csma_ca_init(&x_csma_init);
Wolfgang Betz 34:edda6a7238ec 263
Wolfgang Betz 34:edda6a7238ec 264 #ifdef USE_STANDBY_STATE
Wolfgang Betz 69:22e9b407effa 265 /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */
Wolfgang Betz 69:22e9b407effa 266 cmd_strobe(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 34:edda6a7238ec 267 #endif // USE_STANDBY_STATE
jmhong 84:45b9ff78a066 268
jmhong 84:45b9ff78a066 269 // }
jmhong 84:45b9ff78a066 270 printf("[INIT_REVISE]init end.\n");
Wolfgang Betz 34:edda6a7238ec 271 }
Wolfgang Betz 34:edda6a7238ec 272
jmhong 83:54b207156a91 273
jmhong 83:54b207156a91 274
jmhong 83:54b207156a91 275
jmhong 83:54b207156a91 276
Wolfgang Betz 69:22e9b407effa 277 static volatile int tx_fifo_remaining = 0; // to be used in irq handler
Wolfgang Betz 69:22e9b407effa 278 static volatile int tx_buffer_pos = 0; // to be used in irq handler
Wolfgang Betz 69:22e9b407effa 279 static const volatile uint8_t *tx_fifo_buffer = NULL; // to be used in irq handler
jmhong 84:45b9ff78a066 280 int SimpleSpirit1::send(const void *payload, unsigned int payload_len, bool use_csma_ca)
jmhong 83:54b207156a91 281 {
Wolfgang Betz 69:22e9b407effa 282 /* Checks if the payload length is supported */
jmhong 84:45b9ff78a066 283 // printf("\r\n[SEND] 1, MAX_PACKET_LEN : [%d]\n", MAX_PACKET_LEN);
jmhong 84:45b9ff78a066 284 // printf("[SEND] 2, payload_len : [%d]\n", payload_len);
jmhong 84:45b9ff78a066 285
jmhong 85:4ca74d007fe7 286 if(payload_len > MAX_PACKET_LEN)
jmhong 85:4ca74d007fe7 287 {
jmhong 83:54b207156a91 288 // printf("[SEND] \n");
Wolfgang Betz 69:22e9b407effa 289 return RADIO_TX_ERR;
Wolfgang Betz 69:22e9b407effa 290 }
jmhong 84:45b9ff78a066 291
jmhong 84:45b9ff78a066 292
jmhong 84:45b9ff78a066 293
jmhong 84:45b9ff78a066 294
jmhong 84:45b9ff78a066 295
jmhong 84:45b9ff78a066 296
jmhong 84:45b9ff78a066 297
jmhong 84:45b9ff78a066 298
jmhong 84:45b9ff78a066 299
jmhong 85:4ca74d007fe7 300 printf("send [1");
jmhong 85:4ca74d007fe7 301 // disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 302
Wolfgang Betz 69:22e9b407effa 303 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
Wolfgang Betz 34:edda6a7238ec 304 #ifndef NDEBUG
jmhong 84:45b9ff78a066 305 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 306 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 307 }
Wolfgang Betz 34:edda6a7238ec 308 #endif
Wolfgang Betz 34:edda6a7238ec 309
jmhong 83:54b207156a91 310
jmhong 84:45b9ff78a066 311 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX)
jmhong 84:45b9ff78a066 312 {
jmhong 84:45b9ff78a066 313 //180619 HJM : 여기서 뻗지는 않음, 그냥 send error 만 띄울 뿐. 하지만 이것도 카운팅 걸어두고 몇 번(MAX_ERROR_COUNTING) 이상이면 init을 타도록 해야 하겠다.
jmhong 84:45b9ff78a066 314 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
jmhong 84:45b9ff78a066 315 printf("[SEND] error \n");
jmhong 84:45b9ff78a066 316
jmhong 84:45b9ff78a066 317 if (0x3 == (last_state>>1))
jmhong 84:45b9ff78a066 318 {
jmhong 84:45b9ff78a066 319 return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 320 // reset_board();
jmhong 84:45b9ff78a066 321 }
jmhong 84:45b9ff78a066 322
jmhong 84:45b9ff78a066 323 if (0x40 == (last_state>>1))
jmhong 84:45b9ff78a066 324 {
jmhong 84:45b9ff78a066 325 return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 326
jmhong 84:45b9ff78a066 327 }
jmhong 84:45b9ff78a066 328 //180619 HJM : 아예 여기서 걸리면 흘러가게 냅두면 spirit1 이 꼬인다.
jmhong 85:4ca74d007fe7 329 ++iErrorCounting;
jmhong 85:4ca74d007fe7 330 if (iErrorCounting >= MAX_ERROR_COUNTING)
jmhong 85:4ca74d007fe7 331 {
jmhong 85:4ca74d007fe7 332 iErrorCounting = 0;
jmhong 85:4ca74d007fe7 333 return RADIO_TX_ERR_RESET;
jmhong 85:4ca74d007fe7 334 }
jmhong 84:45b9ff78a066 335 //
jmhong 84:45b9ff78a066 336 return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 337 }
jmhong 84:45b9ff78a066 338 iErrorCounting = 0;
jmhong 84:45b9ff78a066 339
jmhong 84:45b9ff78a066 340
jmhong 85:4ca74d007fe7 341 printf(" 2");
jmhong 84:45b9ff78a066 342 //if (SPIRIT1_STATE_RX == SPIRIT1_STATUS())
jmhong 84:45b9ff78a066 343 // {
jmhong 84:45b9ff78a066 344 // printf("[SEND] error \n");
jmhong 84:45b9ff78a066 345 //
jmhong 84:45b9ff78a066 346 // return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 347 // }
jmhong 84:45b9ff78a066 348
jmhong 84:45b9ff78a066 349 //180323 HJM : IRQ 선이 동작하지 않기 때문에 여기에 현재 sprit1의 상태가 비지 상태인지 체크하고 송신.
jmhong 84:45b9ff78a066 350
jmhong 84:45b9ff78a066 351
jmhong 84:45b9ff78a066 352
jmhong 84:45b9ff78a066 353
jmhong 84:45b9ff78a066 354
jmhong 84:45b9ff78a066 355
jmhong 84:45b9ff78a066 356
jmhong 84:45b9ff78a066 357
jmhong 83:54b207156a91 358
jmhong 83:54b207156a91 359
jmhong 83:54b207156a91 360
Wolfgang Betz 69:22e9b407effa 361 /* Reset State to Ready */
jmhong 85:4ca74d007fe7 362 printf(" 3");
jmhong 84:45b9ff78a066 363 // printf("[SEND] 3, set_ready_state() call, \n");
Wolfgang Betz 69:22e9b407effa 364 set_ready_state();
jmhong 84:45b9ff78a066 365
jmhong 85:4ca74d007fe7 366 printf(" 4");
jmhong 84:45b9ff78a066 367 // printf("[SEND] 4, cmd_strobe() call, SPIRIT1_STROBE_FTX \n");
jmhong 84:45b9ff78a066 368 cmd_strobe(SPIRIT1_STROBE_FTX); // flush TX FIFO buffer
Wolfgang Betz 34:edda6a7238ec 369
Wolfgang Betz 34:edda6a7238ec 370 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 371 debug_if(!(linear_fifo_read_num_elements_tx_fifo() == 0), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 372 #endif
Wolfgang Betz 34:edda6a7238ec 373
jmhong 85:4ca74d007fe7 374 printf(" 5");
jmhong 84:45b9ff78a066 375 // printf("[SEND] 5, pkt_basic_set_payload_length() call, \n");
jmhong 84:45b9ff78a066 376 pkt_basic_set_payload_length(payload_len); // set desired payload len
Wolfgang Betz 34:edda6a7238ec 377
jmhong 84:45b9ff78a066 378 if(use_csma_ca) {
jmhong 84:45b9ff78a066 379 // printf("[SEND] 6, csma_ca_state() call, \n");
Wolfgang Betz 69:22e9b407effa 380 csma_ca_state(S_ENABLE); // enable CSMA/CA
Wolfgang Betz 69:22e9b407effa 381 }
Wolfgang Betz 34:edda6a7238ec 382
jmhong 85:4ca74d007fe7 383 printf(" 6");
Wolfgang Betz 69:22e9b407effa 384 /* Init buffer & number of bytes to be send */
jmhong 84:45b9ff78a066 385 // printf("[SEND] 7, csma_ca_state() call, \n");
Wolfgang Betz 69:22e9b407effa 386 tx_fifo_remaining = payload_len;
Wolfgang Betz 69:22e9b407effa 387 tx_fifo_buffer = (const uint8_t*)payload;
Wolfgang Betz 45:2d01cc9bc761 388
jmhong 85:4ca74d007fe7 389 printf(" 7");
Wolfgang Betz 69:22e9b407effa 390 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN; // fill-up whole fifo
Wolfgang Betz 69:22e9b407effa 391 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
Wolfgang Betz 34:edda6a7238ec 392
jmhong 85:4ca74d007fe7 393 printf(" 8");
Wolfgang Betz 69:22e9b407effa 394 tx_fifo_remaining -= to_send;
Wolfgang Betz 34:edda6a7238ec 395
jmhong 85:4ca74d007fe7 396 printf(" 9");
jmhong 84:45b9ff78a066 397 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 398 if(to_send > 0) {
jmhong 84:45b9ff78a066 399 // printf("[SEND] 8, if(to_send > 0), if(to_send > 0) \n");
jmhong 84:45b9ff78a066 400 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[0]);
jmhong 84:45b9ff78a066 401 // printf("[SEND] 9, if(to_send > 0), if(to_send > 0) \n");
Wolfgang Betz 69:22e9b407effa 402 }
jmhong 85:4ca74d007fe7 403 printf(" 10");
Wolfgang Betz 69:22e9b407effa 404 tx_buffer_pos = to_send;
Wolfgang Betz 69:22e9b407effa 405 _spirit_tx_started = true;
Wolfgang Betz 34:edda6a7238ec 406
jmhong 85:4ca74d007fe7 407 printf(" 11");
jmhong 85:4ca74d007fe7 408 // enable_spirit_irq();
jmhong 84:45b9ff78a066 409 // printf(" 6");
jmhong 84:45b9ff78a066 410
jmhong 84:45b9ff78a066 411
jmhong 84:45b9ff78a066 412
jmhong 84:45b9ff78a066 413
jmhong 84:45b9ff78a066 414
jmhong 84:45b9ff78a066 415
jmhong 84:45b9ff78a066 416
jmhong 84:45b9ff78a066 417
jmhong 84:45b9ff78a066 418
jmhong 84:45b9ff78a066 419
jmhong 84:45b9ff78a066 420
jmhong 84:45b9ff78a066 421
jmhong 84:45b9ff78a066 422
jmhong 84:45b9ff78a066 423
Wolfgang Betz 34:edda6a7238ec 424
Wolfgang Betz 69:22e9b407effa 425 /* Start transmitting */
jmhong 84:45b9ff78a066 426 // printf("[SEND] 10, Start transmitting \n");
jmhong 85:4ca74d007fe7 427 printf(" 12");
jmhong 84:45b9ff78a066 428 cmd_strobe(SPIRIT1_STROBE_TX);
Wolfgang Betz 45:2d01cc9bc761 429
jmhong 85:4ca74d007fe7 430 printf(" 13");
Wolfgang Betz 69:22e9b407effa 431 while(tx_fifo_remaining != 0); // wait until not everything is yet send (evtl. by irq handler)
Wolfgang Betz 45:2d01cc9bc761 432
jmhong 84:45b9ff78a066 433 /*
jmhong 84:45b9ff78a066 434 if (SPIRIT1_STATUS() == SPIRIT1_STATE_TX)
jmhong 84:45b9ff78a066 435 {
jmhong 84:45b9ff78a066 436
jmhong 84:45b9ff78a066 437 }
jmhong 84:45b9ff78a066 438 else if (SPIRIT1_STATUS() == SPIRIT1_STATE_RX)
jmhong 84:45b9ff78a066 439 {
jmhong 84:45b9ff78a066 440
jmhong 84:45b9ff78a066 441 }
jmhong 84:45b9ff78a066 442 else if (SPIRIT1_STATUS() == SPIRIT1_STATE_)
jmhong 84:45b9ff78a066 443 {
jmhong 84:45b9ff78a066 444
jmhong 84:45b9ff78a066 445 }
jmhong 84:45b9ff78a066 446 */
jmhong 84:45b9ff78a066 447
jmhong 84:45b9ff78a066 448
jmhong 84:45b9ff78a066 449
jmhong 84:45b9ff78a066 450
jmhong 84:45b9ff78a066 451
jmhong 84:45b9ff78a066 452
jmhong 84:45b9ff78a066 453
jmhong 84:45b9ff78a066 454
jmhong 84:45b9ff78a066 455
jmhong 84:45b9ff78a066 456
jmhong 84:45b9ff78a066 457
jmhong 85:4ca74d007fe7 458 printf(" 14");
jmhong 84:45b9ff78a066 459 // printf("[SEND] 11, Start transmitting end, BUSYWAIT_UNTIL \n");
Wolfgang Betz 69:22e9b407effa 460 BUSYWAIT_UNTIL(!_spirit_tx_started, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 461
jmhong 84:45b9ff78a066 462
jmhong 84:45b9ff78a066 463
jmhong 84:45b9ff78a066 464
jmhong 84:45b9ff78a066 465
jmhong 84:45b9ff78a066 466
jmhong 84:45b9ff78a066 467
jmhong 84:45b9ff78a066 468
jmhong 84:45b9ff78a066 469
jmhong 84:45b9ff78a066 470
jmhong 84:45b9ff78a066 471
jmhong 84:45b9ff78a066 472
jmhong 84:45b9ff78a066 473
jmhong 84:45b9ff78a066 474
jmhong 84:45b9ff78a066 475
jmhong 84:45b9ff78a066 476
jmhong 84:45b9ff78a066 477
jmhong 84:45b9ff78a066 478
jmhong 84:45b9ff78a066 479
jmhong 84:45b9ff78a066 480
jmhong 84:45b9ff78a066 481
jmhong 84:45b9ff78a066 482
jmhong 84:45b9ff78a066 483
jmhong 84:45b9ff78a066 484
jmhong 84:45b9ff78a066 485
Wolfgang Betz 34:edda6a7238ec 486 #ifdef HEAVY_DEBUG
Wolfgang Betz 69:22e9b407effa 487 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 488 #endif
Wolfgang Betz 34:edda6a7238ec 489
jmhong 85:4ca74d007fe7 490 printf(" 15");
jmhong 84:45b9ff78a066 491 if(use_csma_ca) {
Wolfgang Betz 64:28ef790e4ef7 492 csma_ca_state(S_DISABLE); // disable CSMA/CA
Wolfgang Betz 64:28ef790e4ef7 493 }
Wolfgang Betz 43:a512f909514a 494
jmhong 84:45b9ff78a066 495
jmhong 84:45b9ff78a066 496
jmhong 84:45b9ff78a066 497
jmhong 84:45b9ff78a066 498
jmhong 84:45b9ff78a066 499
jmhong 84:45b9ff78a066 500
jmhong 84:45b9ff78a066 501
jmhong 84:45b9ff78a066 502
jmhong 84:45b9ff78a066 503
jmhong 84:45b9ff78a066 504
jmhong 84:45b9ff78a066 505 //180323 HJM : irq가 작동하지 않아 수동으로 irq 값을 읽어 오기로 결정됬다.
jmhong 84:45b9ff78a066 506 //이걸 while 로 가둬서 send 하기 전에 검토하면 된다.
jmhong 85:4ca74d007fe7 507 printf(" 16");
jmhong 84:45b9ff78a066 508 int iCounting = 0;
jmhong 85:4ca74d007fe7 509 while(1)
jmhong 85:4ca74d007fe7 510 {
jmhong 85:4ca74d007fe7 511 // printf(" 16-1");
jmhong 84:45b9ff78a066 512 st_lib_spirit_irqs x_irq_status;
jmhong 84:45b9ff78a066 513
jmhong 84:45b9ff78a066 514 irq_get_status(&x_irq_status);
jmhong 84:45b9ff78a066 515 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 516 printf("while\n");
jmhong 84:45b9ff78a066 517 #endif
jmhong 84:45b9ff78a066 518 iCounting = iCounting + 1;
jmhong 84:45b9ff78a066 519
jmhong 84:45b9ff78a066 520 // BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_TX, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 521
jmhong 84:45b9ff78a066 522
jmhong 85:4ca74d007fe7 523 // printf(" 16-2");
jmhong 85:4ca74d007fe7 524 if(x_irq_status.IRQ_TX_DATA_SENT)
jmhong 85:4ca74d007fe7 525 {
jmhong 84:45b9ff78a066 526
jmhong 84:45b9ff78a066 527 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 528 // uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 529 // debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 530 // debug_if(tx_fifo_remaining != 0, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 531 #endif
jmhong 85:4ca74d007fe7 532 // printf(" 16-3");
jmhong 85:4ca74d007fe7 533 if(_spirit_tx_started)
jmhong 85:4ca74d007fe7 534 {
jmhong 84:45b9ff78a066 535 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 536 printf("[IRQ] if(x_irq_status.IRQ_TX_DATA_SENT) in, if(_spirit_tx_started) in \n");
jmhong 84:45b9ff78a066 537 #endif
jmhong 84:45b9ff78a066 538
jmhong 84:45b9ff78a066 539 }
jmhong 84:45b9ff78a066 540
jmhong 85:4ca74d007fe7 541 // printf(" 16-4");
jmhong 84:45b9ff78a066 542 x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET;
jmhong 84:45b9ff78a066 543 tx_fifo_buffer = NULL;
jmhong 84:45b9ff78a066 544
jmhong 84:45b9ff78a066 545 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 546
jmhong 84:45b9ff78a066 547 break;
jmhong 85:4ca74d007fe7 548 }
jmhong 85:4ca74d007fe7 549 else
jmhong 85:4ca74d007fe7 550 {
jmhong 84:45b9ff78a066 551 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 552 printf("not yet sent!!!\n");
jmhong 84:45b9ff78a066 553 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 554 }
jmhong 84:45b9ff78a066 555
jmhong 84:45b9ff78a066 556
jmhong 84:45b9ff78a066 557
jmhong 84:45b9ff78a066 558
jmhong 84:45b9ff78a066 559
jmhong 85:4ca74d007fe7 560 // printf(" 17");
jmhong 84:45b9ff78a066 561 /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */
jmhong 84:45b9ff78a066 562 if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) {
jmhong 84:45b9ff78a066 563 // printf("1\n");
jmhong 84:45b9ff78a066 564 // printf("[IRQ] if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) in\n");
jmhong 84:45b9ff78a066 565
jmhong 84:45b9ff78a066 566 //uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 567 // debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 568 // debug_if(!_spirit_tx_started, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 569 // debug_if(tx_fifo_buffer == NULL, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 570
jmhong 84:45b9ff78a066 571 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo
jmhong 84:45b9ff78a066 572 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
jmhong 84:45b9ff78a066 573
jmhong 84:45b9ff78a066 574 tx_fifo_remaining -= to_send;
jmhong 84:45b9ff78a066 575
jmhong 84:45b9ff78a066 576 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 577 if(to_send > 0) {
jmhong 84:45b9ff78a066 578 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]);
jmhong 84:45b9ff78a066 579 }
jmhong 84:45b9ff78a066 580 tx_buffer_pos += to_send;
jmhong 84:45b9ff78a066 581 }
jmhong 84:45b9ff78a066 582
jmhong 83:54b207156a91 583
Wolfgang Betz 34:edda6a7238ec 584
jmhong 84:45b9ff78a066 585 /* TX FIFO underflow/overflow error */
jmhong 85:4ca74d007fe7 586 if(x_irq_status.IRQ_TX_FIFO_ERROR)
jmhong 85:4ca74d007fe7 587 {
jmhong 84:45b9ff78a066 588 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 589 printf("[IRQ] if(x_irq_status.IRQ_TX_FIFO_ERROR) in\n");
jmhong 84:45b9ff78a066 590 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 591
jmhong 84:45b9ff78a066 592 //uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 593 // debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 594 // debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 595
jmhong 84:45b9ff78a066 596 //if(_spirit_tx_started)
jmhong 84:45b9ff78a066 597 // {
jmhong 84:45b9ff78a066 598 // _spirit_tx_started = false;
jmhong 84:45b9ff78a066 599 // /* call user callback */
jmhong 84:45b9ff78a066 600 // if(_current_irq_callback)
jmhong 84:45b9ff78a066 601 // {
jmhong 84:45b9ff78a066 602 // _current_irq_callback(TX_ERR);
jmhong 84:45b9ff78a066 603 // }
jmhong 84:45b9ff78a066 604 // }
jmhong 84:45b9ff78a066 605
jmhong 84:45b9ff78a066 606 /* reset data still to be sent */
jmhong 84:45b9ff78a066 607 tx_fifo_remaining = 0;
jmhong 84:45b9ff78a066 608 }
jmhong 84:45b9ff78a066 609
jmhong 84:45b9ff78a066 610
jmhong 84:45b9ff78a066 611
jmhong 84:45b9ff78a066 612
jmhong 84:45b9ff78a066 613
jmhong 85:4ca74d007fe7 614
jmhong 85:4ca74d007fe7 615 if (1000 == iCounting)
jmhong 85:4ca74d007fe7 616 {
jmhong 84:45b9ff78a066 617 //180327 HJM : 10번이나 검색을 했는데 IRQ가 이상이 있으면 정말 이상이 있다고 생각하고 그냥 break
jmhong 84:45b9ff78a066 618 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 619 printf("if (1000 == iCounting) \n");
jmhong 84:45b9ff78a066 620 #endif
jmhong 84:45b9ff78a066 621 iCounting = 0;
jmhong 85:4ca74d007fe7 622 return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 623
jmhong 84:45b9ff78a066 624 }
jmhong 84:45b9ff78a066 625
jmhong 84:45b9ff78a066 626
jmhong 84:45b9ff78a066 627 }
jmhong 84:45b9ff78a066 628
jmhong 84:45b9ff78a066 629
jmhong 84:45b9ff78a066 630
jmhong 84:45b9ff78a066 631
jmhong 84:45b9ff78a066 632
jmhong 84:45b9ff78a066 633
jmhong 84:45b9ff78a066 634
jmhong 84:45b9ff78a066 635
jmhong 84:45b9ff78a066 636
jmhong 84:45b9ff78a066 637
jmhong 84:45b9ff78a066 638
jmhong 84:45b9ff78a066 639
jmhong 84:45b9ff78a066 640
jmhong 84:45b9ff78a066 641
jmhong 84:45b9ff78a066 642
jmhong 84:45b9ff78a066 643
jmhong 84:45b9ff78a066 644
jmhong 84:45b9ff78a066 645
jmhong 84:45b9ff78a066 646
jmhong 84:45b9ff78a066 647
jmhong 84:45b9ff78a066 648
jmhong 84:45b9ff78a066 649
jmhong 84:45b9ff78a066 650
jmhong 84:45b9ff78a066 651
jmhong 84:45b9ff78a066 652
jmhong 84:45b9ff78a066 653
jmhong 84:45b9ff78a066 654
jmhong 85:4ca74d007fe7 655 printf(" 18");
jmhong 84:45b9ff78a066 656 cmd_strobe(SPIRIT1_STROBE_RX); // Return to RX state
jmhong 84:45b9ff78a066 657
jmhong 84:45b9ff78a066 658 // printf("[SEND] 12, Start transmitting end, BUSYWAIT_UNTIL \n");
jmhong 85:4ca74d007fe7 659 // disable_spirit_irq();
jmhong 84:45b9ff78a066 660 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 661 // in case of state timeout
Wolfgang Betz 69:22e9b407effa 662 _spirit_tx_started = false;
jmhong 85:4ca74d007fe7 663 // enable_spirit_irq();
jmhong 84:45b9ff78a066 664
jmhong 84:45b9ff78a066 665 // printf("[SEND] 13, if(_spirit_tx_started), in case of state timeout, return RADIO_TX_ERR \n");
jmhong 85:4ca74d007fe7 666 printf(" 19, err\n");
Wolfgang Betz 69:22e9b407effa 667 return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 668 } else {
jmhong 85:4ca74d007fe7 669 // enable_spirit_irq();
jmhong 84:45b9ff78a066 670 /* call user callback */
jmhong 84:45b9ff78a066 671 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 672 _current_irq_callback(TX_DONE);
jmhong 84:45b9ff78a066 673 }
jmhong 84:45b9ff78a066 674 // printf("[SEND] 13, else, in case of state timeout, return RADIO_TX_OK \n");
jmhong 85:4ca74d007fe7 675 printf(" 19, ok\n");
Wolfgang Betz 69:22e9b407effa 676 return RADIO_TX_OK;
Wolfgang Betz 69:22e9b407effa 677 }
Wolfgang Betz 34:edda6a7238ec 678 }
Wolfgang Betz 34:edda6a7238ec 679
Wolfgang Betz 34:edda6a7238ec 680 /** Set Ready State **/
jmhong 84:45b9ff78a066 681 int SimpleSpirit1::set_ready_state(void)
jmhong 83:54b207156a91 682 {
Wolfgang Betz 69:22e9b407effa 683 uint16_t state;
Wolfgang Betz 34:edda6a7238ec 684
jmhong 85:4ca74d007fe7 685 // disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 686
Wolfgang Betz 69:22e9b407effa 687 _spirit_tx_started = false;
Wolfgang Betz 69:22e9b407effa 688 _is_receiving = false;
Wolfgang Betz 69:22e9b407effa 689 stop_rx_timeout();
Wolfgang Betz 34:edda6a7238ec 690
Wolfgang Betz 69:22e9b407effa 691 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 69:22e9b407effa 692 CLEAR_RXBUF();
Wolfgang Betz 69:22e9b407effa 693 CLEAR_TXBUF();
Wolfgang Betz 34:edda6a7238ec 694
Wolfgang Betz 69:22e9b407effa 695 state = SPIRIT1_STATUS();
jmhong 84:45b9ff78a066 696 if(state == SPIRIT1_STATE_STANDBY) {
jmhong 84:45b9ff78a066 697 // printf("[SEND] 3-1, set_ready_state() call, if(state == SPIRIT1_STATE_STANDBY) in \n");
Wolfgang Betz 69:22e9b407effa 698 cmd_strobe(SPIRIT1_STROBE_READY);
jmhong 84:45b9ff78a066 699 } else if(state == SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 700 // printf("[SEND] 3-2, set_ready_state() call, if(state == SPIRIT1_STATE_RX) in \n");
Wolfgang Betz 69:22e9b407effa 701 cmd_strobe(SPIRIT1_STROBE_SABORT);
jmhong 84:45b9ff78a066 702 } else if(state != SPIRIT1_STATE_READY)
jmhong 83:54b207156a91 703 {
Wolfgang Betz 34:edda6a7238ec 704 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 705 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, state>>1);
Wolfgang Betz 34:edda6a7238ec 706 #endif
jmhong 84:45b9ff78a066 707 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 708
jmhong 84:45b9ff78a066 709 // off();
jmhong 84:45b9ff78a066 710 // reset_board();
jmhong 84:45b9ff78a066 711 // on();
jmhong 84:45b9ff78a066 712 // printf("[SEND] 3-3, set_ready_state() call, else if(state != SPIRIT1_STATE_READY) in, something is wrong. \n");
Wolfgang Betz 69:22e9b407effa 713 }
Wolfgang Betz 34:edda6a7238ec 714
Wolfgang Betz 69:22e9b407effa 715 BUSYWAIT_UNTIL((SPIRIT1_STATUS() == SPIRIT1_STATE_READY) && ((last_state & XO_ON) == XO_ON), STATE_TIMEOUT);
jmhong 84:45b9ff78a066 716 if(last_state != (SPIRIT1_STATE_READY | XO_ON)) {
Wolfgang Betz 69:22e9b407effa 717 error("\r\nSpirit1: failed to become ready (%x) => pls. reset!\r\n", last_state);
jmhong 85:4ca74d007fe7 718 // enable_spirit_irq();
jmhong 84:45b9ff78a066 719 return RETURN_ERROR_NUMBER + 2;
Wolfgang Betz 69:22e9b407effa 720 }
Wolfgang Betz 34:edda6a7238ec 721
Wolfgang Betz 69:22e9b407effa 722 irq_clear_status();
Wolfgang Betz 34:edda6a7238ec 723
jmhong 85:4ca74d007fe7 724 // enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 725 }
Wolfgang Betz 34:edda6a7238ec 726
jmhong 84:45b9ff78a066 727 int SimpleSpirit1::off(void)
jmhong 83:54b207156a91 728 {
jmhong 84:45b9ff78a066 729 if(spirit_on == ON) {
Wolfgang Betz 69:22e9b407effa 730 /* Disables the mcu to get IRQ from the SPIRIT1 */
jmhong 85:4ca74d007fe7 731 // disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 732
Wolfgang Betz 69:22e9b407effa 733 /* first stop rx/tx */
Wolfgang Betz 69:22e9b407effa 734 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 735
Wolfgang Betz 34:edda6a7238ec 736 #ifdef USE_STANDBY_STATE
Wolfgang Betz 69:22e9b407effa 737 /* Puts the SPIRIT1 in STANDBY */
Wolfgang Betz 69:22e9b407effa 738 cmd_strobe(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 69:22e9b407effa 739 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, STATE_TIMEOUT);
Wolfgang Betz 69:22e9b407effa 740 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 69:22e9b407effa 741 error("\r\nSpirit1: failed to enter standby (%x)\r\n", last_state>>1);
Wolfgang Betz 69:22e9b407effa 742 return 1;
Wolfgang Betz 69:22e9b407effa 743 }
Wolfgang Betz 34:edda6a7238ec 744 #endif // USE_STANDBY_STATE
Wolfgang Betz 34:edda6a7238ec 745
Wolfgang Betz 69:22e9b407effa 746 spirit_on = OFF;
Wolfgang Betz 69:22e9b407effa 747 _nr_of_irq_disables = 1;
Wolfgang Betz 69:22e9b407effa 748 }
Wolfgang Betz 69:22e9b407effa 749 return 0;
Wolfgang Betz 34:edda6a7238ec 750 }
Wolfgang Betz 34:edda6a7238ec 751
jmhong 84:45b9ff78a066 752 int SimpleSpirit1::on(void)
jmhong 83:54b207156a91 753 {
jmhong 84:45b9ff78a066 754 if(spirit_on == OFF) {
Wolfgang Betz 69:22e9b407effa 755 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 756
Wolfgang Betz 69:22e9b407effa 757 /* now we go to Rx */
Wolfgang Betz 69:22e9b407effa 758 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 34:edda6a7238ec 759
Wolfgang Betz 69:22e9b407effa 760 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
Wolfgang Betz 69:22e9b407effa 761 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 762 error("\r\nSpirit1: failed to enter rx (%x) => retry\r\n", last_state>>1);
Wolfgang Betz 69:22e9b407effa 763 }
Wolfgang Betz 34:edda6a7238ec 764
Wolfgang Betz 69:22e9b407effa 765 /* Enables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 69:22e9b407effa 766 spirit_on = ON;
Wolfgang Betz 34:edda6a7238ec 767 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 768 debug_if(!(_nr_of_irq_disables == 1), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 769 #endif
jmhong 85:4ca74d007fe7 770 // enable_spirit_irq();
Wolfgang Betz 69:22e9b407effa 771 }
Wolfgang Betz 34:edda6a7238ec 772
Wolfgang Betz 34:edda6a7238ec 773 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 774 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 775 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 776 }
Wolfgang Betz 34:edda6a7238ec 777 #endif
Wolfgang Betz 34:edda6a7238ec 778
Wolfgang Betz 69:22e9b407effa 779 return 0;
Wolfgang Betz 34:edda6a7238ec 780 }
Wolfgang Betz 34:edda6a7238ec 781
jmhong 84:45b9ff78a066 782 uint8_t SimpleSpirit1::refresh_state(void)
jmhong 84:45b9ff78a066 783 {
Wolfgang Betz 69:22e9b407effa 784 uint8_t mcstate;
Wolfgang Betz 34:edda6a7238ec 785
Wolfgang Betz 69:22e9b407effa 786 SpiritSpiReadRegisters(MC_STATE0_BASE, 1, &mcstate);
Wolfgang Betz 34:edda6a7238ec 787
Wolfgang Betz 69:22e9b407effa 788 return mcstate;
Wolfgang Betz 34:edda6a7238ec 789 }
Wolfgang Betz 34:edda6a7238ec 790
Wolfgang Betz 34:edda6a7238ec 791 int SimpleSpirit1::read(void *buf, unsigned int bufsize)
jmhong 84:45b9ff78a066 792 {
jmhong 85:4ca74d007fe7 793 // disable_spirit_irq();
jmhong 83:54b207156a91 794 printf("read() 1 ");
Wolfgang Betz 34:edda6a7238ec 795
Wolfgang Betz 69:22e9b407effa 796 /* Checks if the RX buffer is empty */
Wolfgang Betz 69:22e9b407effa 797 if(IS_RXBUF_EMPTY()) {
Wolfgang Betz 43:a512f909514a 798 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 799 debug("\r\nBuffer is empty\r\n");
Wolfgang Betz 43:a512f909514a 800 #endif
jmhong 84:45b9ff78a066 801 printf("[DEBUG] 2-1");
Wolfgang Betz 69:22e9b407effa 802 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 803
Wolfgang Betz 69:22e9b407effa 804 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 69:22e9b407effa 805 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
jmhong 85:4ca74d007fe7 806 // enable_spirit_irq();
Wolfgang Betz 69:22e9b407effa 807 return 0;
Wolfgang Betz 69:22e9b407effa 808 }
Wolfgang Betz 34:edda6a7238ec 809
Wolfgang Betz 69:22e9b407effa 810 if(bufsize < spirit_rx_len) {
jmhong 85:4ca74d007fe7 811 // enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 812
Wolfgang Betz 69:22e9b407effa 813 /* If buf has the correct size */
Wolfgang Betz 34:edda6a7238ec 814 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 815 debug("\r\nTOO SMALL BUF\r\n");
Wolfgang Betz 34:edda6a7238ec 816 #endif
Wolfgang Betz 69:22e9b407effa 817 return 0;
Wolfgang Betz 69:22e9b407effa 818 } else {
Wolfgang Betz 69:22e9b407effa 819 /* Copies the packet received */
jmhong 84:45b9ff78a066 820
Wolfgang Betz 69:22e9b407effa 821 memcpy(buf, spirit_rx_buf, spirit_rx_len);
jmhong 84:45b9ff78a066 822 bufsize = spirit_rx_len;
jmhong 83:54b207156a91 823 printf("recv 3-1");
jmhong 84:45b9ff78a066 824
Wolfgang Betz 69:22e9b407effa 825 CLEAR_RXBUF();
jmhong 84:45b9ff78a066 826 printf(" 3-2");
jmhong 84:45b9ff78a066 827
jmhong 85:4ca74d007fe7 828 // enable_spirit_irq();
jmhong 83:54b207156a91 829 printf(" 3-3 read ok\n");
Wolfgang Betz 34:edda6a7238ec 830
Wolfgang Betz 69:22e9b407effa 831 return bufsize;
Wolfgang Betz 69:22e9b407effa 832 }
Wolfgang Betz 34:edda6a7238ec 833
Wolfgang Betz 34:edda6a7238ec 834 }
Wolfgang Betz 34:edda6a7238ec 835
Wolfgang Betz 34:edda6a7238ec 836 int SimpleSpirit1::channel_clear(void)
Wolfgang Betz 34:edda6a7238ec 837 {
Wolfgang Betz 69:22e9b407effa 838 float rssi_value;
Wolfgang Betz 69:22e9b407effa 839 /* Local variable used to memorize the SPIRIT1 state */
Wolfgang Betz 69:22e9b407effa 840 uint8_t spirit_state = ON;
Wolfgang Betz 34:edda6a7238ec 841
Wolfgang Betz 69:22e9b407effa 842 if(spirit_on == OFF) {
Wolfgang Betz 69:22e9b407effa 843 /* Wakes up the SPIRIT1 */
Wolfgang Betz 69:22e9b407effa 844 on();
Wolfgang Betz 69:22e9b407effa 845 spirit_state = OFF;
Wolfgang Betz 69:22e9b407effa 846 }
Wolfgang Betz 34:edda6a7238ec 847
Wolfgang Betz 34:edda6a7238ec 848 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 849 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 850 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 851 }
Wolfgang Betz 34:edda6a7238ec 852 #endif
Wolfgang Betz 34:edda6a7238ec 853
jmhong 85:4ca74d007fe7 854 // disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 855
Wolfgang Betz 69:22e9b407effa 856 /* Reset State to Ready */
Wolfgang Betz 69:22e9b407effa 857 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 858
Wolfgang Betz 69:22e9b407effa 859 /* Stores the RSSI value */
Wolfgang Betz 69:22e9b407effa 860 rssi_value = qi_get_rssi_dbm();
Wolfgang Betz 34:edda6a7238ec 861
jmhong 85:4ca74d007fe7 862 // enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 863
Wolfgang Betz 69:22e9b407effa 864 /* Puts the SPIRIT1 in its previous state */
jmhong 83:54b207156a91 865 if(spirit_state==OFF) {
Wolfgang Betz 69:22e9b407effa 866 off();
Wolfgang Betz 34:edda6a7238ec 867 #ifndef NDEBUG
Wolfgang Betz 34:edda6a7238ec 868 #ifdef USE_STANDBY_STATE
Wolfgang Betz 69:22e9b407effa 869 if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) {
jmhong 83:54b207156a91 870 #else
jmhong 84:45b9ff78a066 871 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
jmhong 83:54b207156a91 872 #endif
jmhong 84:45b9ff78a066 873 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
jmhong 84:45b9ff78a066 874 }
jmhong 83:54b207156a91 875 #endif
jmhong 84:45b9ff78a066 876 } else {
jmhong 85:4ca74d007fe7 877 // disable_spirit_irq();
jmhong 83:54b207156a91 878
jmhong 84:45b9ff78a066 879 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 880
jmhong 84:45b9ff78a066 881 cmd_strobe(SPIRIT1_STROBE_RX);
jmhong 84:45b9ff78a066 882 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 883 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 884 error("\r\nSpirit1: (#2) failed to enter rx (%x) => retry\r\n", last_state>>1);
jmhong 84:45b9ff78a066 885 }
Wolfgang Betz 34:edda6a7238ec 886
jmhong 85:4ca74d007fe7 887 // enable_spirit_irq();
jmhong 83:54b207156a91 888
jmhong 83:54b207156a91 889 #ifndef NDEBUG
jmhong 84:45b9ff78a066 890 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 891 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 82:a18c22d2b83a 892 }
jmhong 84:45b9ff78a066 893 #endif
Wolfgang Betz 82:a18c22d2b83a 894 }
Wolfgang Betz 82:a18c22d2b83a 895
jmhong 84:45b9ff78a066 896 /* Checks the RSSI value with the threshold */
jmhong 84:45b9ff78a066 897 if(rssi_value<CCA_THRESHOLD) {
jmhong 84:45b9ff78a066 898 return 0;
jmhong 84:45b9ff78a066 899 } else {
jmhong 84:45b9ff78a066 900 return 1;
jmhong 84:45b9ff78a066 901 }
jmhong 84:45b9ff78a066 902 }
Wolfgang Betz 82:a18c22d2b83a 903
jmhong 84:45b9ff78a066 904 int SimpleSpirit1::get_pending_packet(void)
jmhong 84:45b9ff78a066 905 {
jmhong 84:45b9ff78a066 906 return !IS_RXBUF_EMPTY();
jmhong 84:45b9ff78a066 907 }
Wolfgang Betz 82:a18c22d2b83a 908
jmhong 84:45b9ff78a066 909 /** Spirit Irq Callback **/
jmhong 84:45b9ff78a066 910 /* betzw - TODO: use threaded interrupt handling when `MBED_CONF_RTOS_PRESENT` is defined (see `atmel-rf-driver`) */
jmhong 84:45b9ff78a066 911 void SimpleSpirit1::IrqHandler()
jmhong 84:45b9ff78a066 912 {
jmhong 84:45b9ff78a066 913 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 914 printf("[CUBEBITE] IrqHandler() call !\r\n");
jmhong 84:45b9ff78a066 915 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 916
jmhong 84:45b9ff78a066 917 st_lib_spirit_irqs x_irq_status;
jmhong 84:45b9ff78a066 918
jmhong 84:45b9ff78a066 919 /* get interrupt source from radio */
jmhong 84:45b9ff78a066 920 irq_get_status(&x_irq_status);
jmhong 84:45b9ff78a066 921
jmhong 84:45b9ff78a066 922 /* The IRQ_TX_DATA_SENT notifies the packet has been sent. Puts the SPIRIT1 in RX */
jmhong 84:45b9ff78a066 923 if(x_irq_status.IRQ_TX_DATA_SENT) {
jmhong 84:45b9ff78a066 924 /* betzw - NOTE: MUST be handled before `IRQ_RX_DATA_READY` for Nanostack integration!
jmhong 84:45b9ff78a066 925 Logically, Nanostack only expects the "DONE" after "SUCCESS" (if it gets
jmhong 84:45b9ff78a066 926 DONE before SUCCESS, it assumes you're not going to bother to send SUCCESS).
jmhong 84:45b9ff78a066 927 */
Wolfgang Betz 82:a18c22d2b83a 928 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 929 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 930 debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 931 debug_if(tx_fifo_remaining != 0, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 83:54b207156a91 932 #endif
jmhong 83:54b207156a91 933
jmhong 84:45b9ff78a066 934 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 935 printf("[IRQ] if(x_irq_status.IRQ_TX_DATA_SENT) in, if(_spirit_tx_started) in \n");
jmhong 84:45b9ff78a066 936 _spirit_tx_started = false;
jmhong 83:54b207156a91 937
jmhong 84:45b9ff78a066 938 /* call user callback */
jmhong 84:45b9ff78a066 939 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 940 _current_irq_callback(TX_DONE);
jmhong 83:54b207156a91 941 }
jmhong 84:45b9ff78a066 942 }
jmhong 83:54b207156a91 943
jmhong 84:45b9ff78a066 944 /* Disable handling of other TX flags */
jmhong 84:45b9ff78a066 945 x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET;
jmhong 84:45b9ff78a066 946 tx_fifo_buffer = NULL;
jmhong 84:45b9ff78a066 947 }
jmhong 83:54b207156a91 948
jmhong 83:54b207156a91 949 #ifndef RX_FIFO_THR_WA
jmhong 84:45b9ff78a066 950 /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */
jmhong 84:45b9ff78a066 951 if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) {
jmhong 83:54b207156a91 952 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 953 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 954 debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 955 debug_if(!_spirit_tx_started, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 956 debug_if(tx_fifo_buffer == NULL, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 82:a18c22d2b83a 957 #endif
Wolfgang Betz 82:a18c22d2b83a 958
jmhong 84:45b9ff78a066 959 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo
jmhong 84:45b9ff78a066 960 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
jmhong 83:54b207156a91 961
jmhong 84:45b9ff78a066 962 tx_fifo_remaining -= to_send;
jmhong 83:54b207156a91 963
jmhong 84:45b9ff78a066 964 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 965 if(to_send > 0) {
jmhong 84:45b9ff78a066 966 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]);
jmhong 83:54b207156a91 967 }
jmhong 84:45b9ff78a066 968 tx_buffer_pos += to_send;
jmhong 84:45b9ff78a066 969 }
jmhong 83:54b207156a91 970 #endif // !RX_FIFO_THR_WA
jmhong 83:54b207156a91 971
jmhong 84:45b9ff78a066 972 /* TX FIFO underflow/overflow error */
jmhong 84:45b9ff78a066 973 if(x_irq_status.IRQ_TX_FIFO_ERROR) {
jmhong 83:54b207156a91 974 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 975 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 976 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 977 debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 978 #endif
jmhong 84:45b9ff78a066 979 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 980 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 981 /* call user callback */
jmhong 84:45b9ff78a066 982 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 983 _current_irq_callback(TX_ERR);
jmhong 84:45b9ff78a066 984 }
jmhong 84:45b9ff78a066 985 }
jmhong 84:45b9ff78a066 986
jmhong 84:45b9ff78a066 987 /* reset data still to be sent */
jmhong 84:45b9ff78a066 988 tx_fifo_remaining = 0;
jmhong 84:45b9ff78a066 989 }
jmhong 84:45b9ff78a066 990
jmhong 84:45b9ff78a066 991 /* The IRQ_RX_DATA_READY notifies a new packet arrived */
jmhong 84:45b9ff78a066 992 if(x_irq_status.IRQ_RX_DATA_READY) {
jmhong 84:45b9ff78a066 993 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 994 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 995 debug_if(!((*tmp) & IRQ_RX_DATA_READY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 996 #endif
jmhong 84:45b9ff78a066 997
jmhong 84:45b9ff78a066 998 if(!_is_receiving) { // spurious irq?!? (betzw: see comments on macro 'RX_FIFO_THR_WA'!)
jmhong 84:45b9ff78a066 999 #ifdef HEAVY_DEBUG
jmhong 83:54b207156a91 1000 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 83:54b207156a91 1001 #endif
jmhong 84:45b9ff78a066 1002 } else {
jmhong 84:45b9ff78a066 1003 _is_receiving = false; // Finished receiving
jmhong 84:45b9ff78a066 1004 stop_rx_timeout();
jmhong 84:45b9ff78a066 1005
jmhong 84:45b9ff78a066 1006 spirit_rx_len = pkt_basic_get_received_pkt_length();
jmhong 84:45b9ff78a066 1007
jmhong 84:45b9ff78a066 1008 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1009 debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 1010 #endif
jmhong 84:45b9ff78a066 1011
jmhong 84:45b9ff78a066 1012 if(spirit_rx_len <= MAX_PACKET_LEN) {
jmhong 84:45b9ff78a066 1013 uint8_t to_receive = spirit_rx_len - _spirit_rx_pos;
jmhong 84:45b9ff78a066 1014 if(to_receive > 0) {
jmhong 84:45b9ff78a066 1015 spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
jmhong 84:45b9ff78a066 1016 _spirit_rx_pos += to_receive;
jmhong 83:54b207156a91 1017 }
jmhong 83:54b207156a91 1018 }
jmhong 83:54b207156a91 1019
jmhong 84:45b9ff78a066 1020 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 82:a18c22d2b83a 1021
jmhong 84:45b9ff78a066 1022 last_rssi = qi_get_rssi(); //MGR
jmhong 84:45b9ff78a066 1023 last_sqi = qi_get_sqi(); //MGR
jmhong 83:54b207156a91 1024
jmhong 84:45b9ff78a066 1025 /* call user callback */
jmhong 84:45b9ff78a066 1026 if((_spirit_rx_pos == spirit_rx_len) && _current_irq_callback) {
jmhong 84:45b9ff78a066 1027 _current_irq_callback(RX_DONE);
jmhong 84:45b9ff78a066 1028 }
jmhong 83:54b207156a91 1029
jmhong 84:45b9ff78a066 1030 /* Disable handling of other RX flags */
jmhong 84:45b9ff78a066 1031 x_irq_status.IRQ_RX_FIFO_ALMOST_FULL = S_RESET;
Wolfgang Betz 69:22e9b407effa 1032 }
jmhong 84:45b9ff78a066 1033 }
Wolfgang Betz 34:edda6a7238ec 1034
Wolfgang Betz 82:a18c22d2b83a 1035 #ifndef RX_FIFO_THR_WA
jmhong 84:45b9ff78a066 1036 /* RX FIFO almost full */
jmhong 84:45b9ff78a066 1037 if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) {
jmhong 84:45b9ff78a066 1038 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1039 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1040 debug_if(!((*tmp) & IRQ_RX_FIFO_ALMOST_FULL_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 1041 #endif
jmhong 84:45b9ff78a066 1042 if(!_is_receiving) { // spurious irq?!?
jmhong 83:54b207156a91 1043 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1044 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 83:54b207156a91 1045 #endif
jmhong 84:45b9ff78a066 1046 } else {
jmhong 84:45b9ff78a066 1047 uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
jmhong 84:45b9ff78a066 1048 if((fifo_available + _spirit_rx_pos) <= MAX_PACKET_LEN) {
jmhong 84:45b9ff78a066 1049 spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
jmhong 84:45b9ff78a066 1050 _spirit_rx_pos += fifo_available;
jmhong 84:45b9ff78a066 1051 } else {
Wolfgang Betz 34:edda6a7238ec 1052 #ifdef DEBUG_IRQ
jmhong 83:54b207156a91 1053 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
Wolfgang Betz 34:edda6a7238ec 1054 #endif
jmhong 83:54b207156a91 1055 }
Wolfgang Betz 82:a18c22d2b83a 1056 }
jmhong 84:45b9ff78a066 1057 }
Wolfgang Betz 82:a18c22d2b83a 1058 #endif // !RX_FIFO_THR_WA
Wolfgang Betz 82:a18c22d2b83a 1059
jmhong 84:45b9ff78a066 1060 /* Reception errors */
jmhong 84:45b9ff78a066 1061 if((x_irq_status.IRQ_RX_FIFO_ERROR) || (x_irq_status.IRQ_RX_DATA_DISC)) {
Wolfgang Betz 82:a18c22d2b83a 1062 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1063 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1064 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 1065 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 1066 #endif
jmhong 84:45b9ff78a066 1067 rx_timeout_handler();
jmhong 84:45b9ff78a066 1068 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 1069 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 1070 /* call user callback */
jmhong 84:45b9ff78a066 1071 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 1072 _current_irq_callback(TX_ERR);
Wolfgang Betz 69:22e9b407effa 1073 }
Wolfgang Betz 69:22e9b407effa 1074 }
Wolfgang Betz 69:22e9b407effa 1075 }
jmhong 84:45b9ff78a066 1076
jmhong 84:45b9ff78a066 1077 /* The IRQ_VALID_SYNC is used to notify a new packet is coming */
jmhong 84:45b9ff78a066 1078 if(x_irq_status.IRQ_VALID_SYNC) {
jmhong 84:45b9ff78a066 1079 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1080 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1081 debug_if(!((*tmp) & IRQ_VALID_SYNC_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 1082 #endif
jmhong 84:45b9ff78a066 1083 /* betzw - NOTE: there is a race condition between Spirit1 receiving packets and
jmhong 84:45b9ff78a066 1084 * the MCU trying to send a packet, which gets resolved in favor of
jmhong 84:45b9ff78a066 1085 * sending.
jmhong 84:45b9ff78a066 1086 */
jmhong 84:45b9ff78a066 1087 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 1088 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1089 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 1090 #endif
jmhong 84:45b9ff78a066 1091 } else {
jmhong 84:45b9ff78a066 1092 _is_receiving = true;
jmhong 84:45b9ff78a066 1093 start_rx_timeout();
jmhong 84:45b9ff78a066 1094 }
jmhong 84:45b9ff78a066 1095 }
jmhong 84:45b9ff78a066 1096 }