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

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
jmhong
Date:
Fri Jun 22 03:42:24 2018 +0000
Revision:
84:45b9ff78a066
Parent:
83:54b207156a91
Child:
85:cdf9e4210c87
180622 HJM : 10 Count sensing data RF send

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 84:45b9ff78a066 17 #define MAX_ERROR_COUNTING 10
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; // @@
Wolfgang Betz 69:22e9b407effa 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 84:45b9ff78a066 169 {//180621 HJM : 여기서는 reset을 해주는게 맞는게, init 은 전역의 spirit1 의 객체가 생성될 때 호출되기 때문이다. 다시 init을 호출해서 종료 시켜야, 아.. return 이 빠졌네
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 84:45b9ff78a066 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 84:45b9ff78a066 286 if(payload_len > MAX_PACKET_LEN) {
jmhong 83:54b207156a91 287 // printf("[SEND] \n");
Wolfgang Betz 69:22e9b407effa 288 return RADIO_TX_ERR;
Wolfgang Betz 69:22e9b407effa 289 }
jmhong 84:45b9ff78a066 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
Wolfgang Betz 69:22e9b407effa 300 disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 301
Wolfgang Betz 69:22e9b407effa 302 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
Wolfgang Betz 34:edda6a7238ec 303 #ifndef NDEBUG
jmhong 84:45b9ff78a066 304 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 305 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 306 }
Wolfgang Betz 34:edda6a7238ec 307 #endif
Wolfgang Betz 34:edda6a7238ec 308
jmhong 83:54b207156a91 309
jmhong 84:45b9ff78a066 310 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX)
jmhong 84:45b9ff78a066 311 {
jmhong 84:45b9ff78a066 312 //180619 HJM : 여기서 뻗지는 않음, 그냥 send error 만 띄울 뿐. 하지만 이것도 카운팅 걸어두고 몇 번(MAX_ERROR_COUNTING) 이상이면 init을 타도록 해야 하겠다.
jmhong 84:45b9ff78a066 313 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
jmhong 84:45b9ff78a066 314 printf("[SEND] error \n");
jmhong 84:45b9ff78a066 315
jmhong 84:45b9ff78a066 316 if (0x3 == (last_state>>1))
jmhong 84:45b9ff78a066 317 {
jmhong 84:45b9ff78a066 318 return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 319 // reset_board();
jmhong 84:45b9ff78a066 320 }
jmhong 84:45b9ff78a066 321
jmhong 84:45b9ff78a066 322 if (0x40 == (last_state>>1))
jmhong 84:45b9ff78a066 323 {
jmhong 84:45b9ff78a066 324 return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 325
jmhong 84:45b9ff78a066 326 }
jmhong 84:45b9ff78a066 327 //180619 HJM : 아예 여기서 걸리면 흘러가게 냅두면 spirit1 이 꼬인다.
jmhong 84:45b9ff78a066 328 // ++iErrorCounting;
jmhong 84:45b9ff78a066 329 //if (iErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 330 // {
jmhong 84:45b9ff78a066 331 // iErrorCounting = 0;
jmhong 84:45b9ff78a066 332 // return RADIO_TX_ERR_RESET;
jmhong 84:45b9ff78a066 333 ////
jmhong 84:45b9ff78a066 334 //// reset_board();
jmhong 84:45b9ff78a066 335 // }
jmhong 84:45b9ff78a066 336 //
jmhong 84:45b9ff78a066 337 return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 338 }
jmhong 84:45b9ff78a066 339 iErrorCounting = 0;
jmhong 84:45b9ff78a066 340
jmhong 84:45b9ff78a066 341
jmhong 84:45b9ff78a066 342
jmhong 84:45b9ff78a066 343 //if (SPIRIT1_STATE_RX == SPIRIT1_STATUS())
jmhong 84:45b9ff78a066 344 // {
jmhong 84:45b9ff78a066 345 // printf("[SEND] error \n");
jmhong 84:45b9ff78a066 346 //
jmhong 84:45b9ff78a066 347 // return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 348 // }
jmhong 84:45b9ff78a066 349
jmhong 84:45b9ff78a066 350 //180323 HJM : IRQ 선이 동작하지 않기 때문에 여기에 현재 sprit1의 상태가 비지 상태인지 체크하고 송신.
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 84:45b9ff78a066 358
jmhong 83:54b207156a91 359
jmhong 83:54b207156a91 360
jmhong 83:54b207156a91 361
Wolfgang Betz 69:22e9b407effa 362 /* Reset State to Ready */
jmhong 84:45b9ff78a066 363 // printf("[SEND] 3, set_ready_state() call, \n");
Wolfgang Betz 69:22e9b407effa 364 set_ready_state();
jmhong 84:45b9ff78a066 365
Wolfgang Betz 34:edda6a7238ec 366
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 84:45b9ff78a066 374 // printf("[SEND] 5, pkt_basic_set_payload_length() call, \n");
jmhong 84:45b9ff78a066 375 pkt_basic_set_payload_length(payload_len); // set desired payload len
Wolfgang Betz 34:edda6a7238ec 376
jmhong 84:45b9ff78a066 377 if(use_csma_ca) {
jmhong 84:45b9ff78a066 378 // printf("[SEND] 6, csma_ca_state() call, \n");
Wolfgang Betz 69:22e9b407effa 379 csma_ca_state(S_ENABLE); // enable CSMA/CA
Wolfgang Betz 69:22e9b407effa 380 }
Wolfgang Betz 34:edda6a7238ec 381
Wolfgang Betz 69:22e9b407effa 382 /* Init buffer & number of bytes to be send */
jmhong 84:45b9ff78a066 383 // printf("[SEND] 7, csma_ca_state() call, \n");
Wolfgang Betz 69:22e9b407effa 384 tx_fifo_remaining = payload_len;
Wolfgang Betz 69:22e9b407effa 385 tx_fifo_buffer = (const uint8_t*)payload;
Wolfgang Betz 45:2d01cc9bc761 386
Wolfgang Betz 69:22e9b407effa 387 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN; // fill-up whole fifo
Wolfgang Betz 69:22e9b407effa 388 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
Wolfgang Betz 34:edda6a7238ec 389
Wolfgang Betz 69:22e9b407effa 390 tx_fifo_remaining -= to_send;
Wolfgang Betz 34:edda6a7238ec 391
jmhong 84:45b9ff78a066 392 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 393 if(to_send > 0) {
jmhong 84:45b9ff78a066 394 // printf("[SEND] 8, if(to_send > 0), if(to_send > 0) \n");
jmhong 84:45b9ff78a066 395 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[0]);
jmhong 84:45b9ff78a066 396 // printf("[SEND] 9, if(to_send > 0), if(to_send > 0) \n");
Wolfgang Betz 69:22e9b407effa 397 }
Wolfgang Betz 34:edda6a7238ec 398
Wolfgang Betz 69:22e9b407effa 399 tx_buffer_pos = to_send;
Wolfgang Betz 69:22e9b407effa 400 _spirit_tx_started = true;
Wolfgang Betz 34:edda6a7238ec 401
Wolfgang Betz 69:22e9b407effa 402 enable_spirit_irq();
jmhong 84:45b9ff78a066 403 // printf(" 6");
jmhong 84:45b9ff78a066 404
jmhong 84:45b9ff78a066 405
jmhong 84:45b9ff78a066 406
jmhong 84:45b9ff78a066 407
jmhong 84:45b9ff78a066 408
jmhong 84:45b9ff78a066 409
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
Wolfgang Betz 34:edda6a7238ec 418
Wolfgang Betz 69:22e9b407effa 419 /* Start transmitting */
jmhong 84:45b9ff78a066 420 // printf("[SEND] 10, Start transmitting \n");
jmhong 84:45b9ff78a066 421 cmd_strobe(SPIRIT1_STROBE_TX);
Wolfgang Betz 45:2d01cc9bc761 422
Wolfgang Betz 69:22e9b407effa 423 while(tx_fifo_remaining != 0); // wait until not everything is yet send (evtl. by irq handler)
Wolfgang Betz 45:2d01cc9bc761 424
jmhong 84:45b9ff78a066 425 /*
jmhong 84:45b9ff78a066 426 if (SPIRIT1_STATUS() == SPIRIT1_STATE_TX)
jmhong 84:45b9ff78a066 427 {
jmhong 84:45b9ff78a066 428
jmhong 84:45b9ff78a066 429 }
jmhong 84:45b9ff78a066 430 else if (SPIRIT1_STATUS() == SPIRIT1_STATE_RX)
jmhong 84:45b9ff78a066 431 {
jmhong 84:45b9ff78a066 432
jmhong 84:45b9ff78a066 433 }
jmhong 84:45b9ff78a066 434 else if (SPIRIT1_STATUS() == SPIRIT1_STATE_)
jmhong 84:45b9ff78a066 435 {
jmhong 84:45b9ff78a066 436
jmhong 84:45b9ff78a066 437 }
jmhong 84:45b9ff78a066 438 */
jmhong 84:45b9ff78a066 439
jmhong 84:45b9ff78a066 440
jmhong 84:45b9ff78a066 441
jmhong 84:45b9ff78a066 442
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 // printf("[SEND] 11, Start transmitting end, BUSYWAIT_UNTIL \n");
Wolfgang Betz 69:22e9b407effa 452 BUSYWAIT_UNTIL(!_spirit_tx_started, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 453
jmhong 84:45b9ff78a066 454
jmhong 84:45b9ff78a066 455
jmhong 84:45b9ff78a066 456
jmhong 84:45b9ff78a066 457
jmhong 84:45b9ff78a066 458
jmhong 84:45b9ff78a066 459
jmhong 84:45b9ff78a066 460
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
Wolfgang Betz 34:edda6a7238ec 478 #ifdef HEAVY_DEBUG
Wolfgang Betz 69:22e9b407effa 479 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 480 #endif
Wolfgang Betz 34:edda6a7238ec 481
jmhong 84:45b9ff78a066 482
jmhong 84:45b9ff78a066 483 if(use_csma_ca) {
Wolfgang Betz 64:28ef790e4ef7 484 csma_ca_state(S_DISABLE); // disable CSMA/CA
Wolfgang Betz 64:28ef790e4ef7 485 }
Wolfgang Betz 43:a512f909514a 486
jmhong 84:45b9ff78a066 487
jmhong 84:45b9ff78a066 488
jmhong 84:45b9ff78a066 489
jmhong 84:45b9ff78a066 490
jmhong 84:45b9ff78a066 491
jmhong 84:45b9ff78a066 492
jmhong 84:45b9ff78a066 493
jmhong 84:45b9ff78a066 494
jmhong 84:45b9ff78a066 495
jmhong 84:45b9ff78a066 496
jmhong 84:45b9ff78a066 497 //180323 HJM : irq가 작동하지 않아 수동으로 irq 값을 읽어 오기로 결정됬다.
jmhong 84:45b9ff78a066 498 //이걸 while 로 가둬서 send 하기 전에 검토하면 된다.
jmhong 84:45b9ff78a066 499
jmhong 84:45b9ff78a066 500 int iCounting = 0;
jmhong 84:45b9ff78a066 501 while(1) {
jmhong 84:45b9ff78a066 502 st_lib_spirit_irqs x_irq_status;
jmhong 84:45b9ff78a066 503
jmhong 84:45b9ff78a066 504 irq_get_status(&x_irq_status);
jmhong 84:45b9ff78a066 505 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 506 printf("while\n");
jmhong 84:45b9ff78a066 507 #endif
jmhong 84:45b9ff78a066 508 iCounting = iCounting + 1;
jmhong 84:45b9ff78a066 509
jmhong 84:45b9ff78a066 510 // BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_TX, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 511
jmhong 84:45b9ff78a066 512
jmhong 84:45b9ff78a066 513 if(x_irq_status.IRQ_TX_DATA_SENT) {
jmhong 84:45b9ff78a066 514
jmhong 84:45b9ff78a066 515 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 516 // uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 517 // debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 518 // debug_if(tx_fifo_remaining != 0, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 519 #endif
jmhong 84:45b9ff78a066 520
jmhong 84:45b9ff78a066 521 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 522 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 523 printf("[IRQ] if(x_irq_status.IRQ_TX_DATA_SENT) in, if(_spirit_tx_started) in \n");
jmhong 84:45b9ff78a066 524 #endif
jmhong 84:45b9ff78a066 525
jmhong 84:45b9ff78a066 526 }
jmhong 84:45b9ff78a066 527
jmhong 84:45b9ff78a066 528
jmhong 84:45b9ff78a066 529 x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET;
jmhong 84:45b9ff78a066 530 tx_fifo_buffer = NULL;
jmhong 84:45b9ff78a066 531
jmhong 84:45b9ff78a066 532 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 533
jmhong 84:45b9ff78a066 534 break;
jmhong 84:45b9ff78a066 535 } else {
jmhong 84:45b9ff78a066 536 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 537 printf("not yet sent!!!\n");
jmhong 84:45b9ff78a066 538 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 539 }
jmhong 84:45b9ff78a066 540
jmhong 84:45b9ff78a066 541
jmhong 84:45b9ff78a066 542
jmhong 84:45b9ff78a066 543
jmhong 84:45b9ff78a066 544
jmhong 84:45b9ff78a066 545
jmhong 84:45b9ff78a066 546 /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */
jmhong 84:45b9ff78a066 547 if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) {
jmhong 84:45b9ff78a066 548 // printf("1\n");
jmhong 84:45b9ff78a066 549 // printf("[IRQ] if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) in\n");
jmhong 84:45b9ff78a066 550
jmhong 84:45b9ff78a066 551 //uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 552 // debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 553 // debug_if(!_spirit_tx_started, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 554 // debug_if(tx_fifo_buffer == NULL, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 555
jmhong 84:45b9ff78a066 556 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo
jmhong 84:45b9ff78a066 557 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
jmhong 84:45b9ff78a066 558
jmhong 84:45b9ff78a066 559 tx_fifo_remaining -= to_send;
jmhong 84:45b9ff78a066 560
jmhong 84:45b9ff78a066 561 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 562 if(to_send > 0) {
jmhong 84:45b9ff78a066 563 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]);
jmhong 84:45b9ff78a066 564 }
jmhong 84:45b9ff78a066 565 tx_buffer_pos += to_send;
jmhong 84:45b9ff78a066 566 }
jmhong 84:45b9ff78a066 567
jmhong 83:54b207156a91 568
Wolfgang Betz 34:edda6a7238ec 569
jmhong 84:45b9ff78a066 570 /* TX FIFO underflow/overflow error */
jmhong 84:45b9ff78a066 571 if(x_irq_status.IRQ_TX_FIFO_ERROR) {
jmhong 84:45b9ff78a066 572 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 573 printf("[IRQ] if(x_irq_status.IRQ_TX_FIFO_ERROR) in\n");
jmhong 84:45b9ff78a066 574 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 575
jmhong 84:45b9ff78a066 576 //uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 577 // debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 578 // debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 579
jmhong 84:45b9ff78a066 580 //if(_spirit_tx_started)
jmhong 84:45b9ff78a066 581 // {
jmhong 84:45b9ff78a066 582 // _spirit_tx_started = false;
jmhong 84:45b9ff78a066 583 // /* call user callback */
jmhong 84:45b9ff78a066 584 // if(_current_irq_callback)
jmhong 84:45b9ff78a066 585 // {
jmhong 84:45b9ff78a066 586 // _current_irq_callback(TX_ERR);
jmhong 84:45b9ff78a066 587 // }
jmhong 84:45b9ff78a066 588 // }
jmhong 84:45b9ff78a066 589
jmhong 84:45b9ff78a066 590 /* reset data still to be sent */
jmhong 84:45b9ff78a066 591 tx_fifo_remaining = 0;
jmhong 84:45b9ff78a066 592 }
jmhong 84:45b9ff78a066 593
jmhong 84:45b9ff78a066 594
jmhong 84:45b9ff78a066 595
jmhong 84:45b9ff78a066 596
jmhong 84:45b9ff78a066 597
jmhong 84:45b9ff78a066 598
jmhong 84:45b9ff78a066 599 if (10 == iCounting) {
jmhong 84:45b9ff78a066 600 //180327 HJM : 10번이나 검색을 했는데 IRQ가 이상이 있으면 정말 이상이 있다고 생각하고 그냥 break
jmhong 84:45b9ff78a066 601 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 602 printf("if (1000 == iCounting) \n");
jmhong 84:45b9ff78a066 603 #endif
jmhong 84:45b9ff78a066 604 iCounting = 0;
jmhong 84:45b9ff78a066 605 return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 606
jmhong 84:45b9ff78a066 607 }
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 84:45b9ff78a066 614
jmhong 84:45b9ff78a066 615
jmhong 84:45b9ff78a066 616
jmhong 84:45b9ff78a066 617
jmhong 84:45b9ff78a066 618
jmhong 84:45b9ff78a066 619
jmhong 84:45b9ff78a066 620
jmhong 84:45b9ff78a066 621
jmhong 84:45b9ff78a066 622
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 cmd_strobe(SPIRIT1_STROBE_RX); // Return to RX state
jmhong 84:45b9ff78a066 640
jmhong 84:45b9ff78a066 641 // printf("[SEND] 12, Start transmitting end, BUSYWAIT_UNTIL \n");
jmhong 84:45b9ff78a066 642 disable_spirit_irq();
jmhong 84:45b9ff78a066 643 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 644 // in case of state timeout
Wolfgang Betz 69:22e9b407effa 645 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 646 enable_spirit_irq();
jmhong 84:45b9ff78a066 647
jmhong 84:45b9ff78a066 648 // printf("[SEND] 13, if(_spirit_tx_started), in case of state timeout, return RADIO_TX_ERR \n");
jmhong 84:45b9ff78a066 649
Wolfgang Betz 69:22e9b407effa 650 return RADIO_TX_ERR;
jmhong 84:45b9ff78a066 651 } else {
jmhong 84:45b9ff78a066 652 enable_spirit_irq();
jmhong 84:45b9ff78a066 653 /* call user callback */
jmhong 84:45b9ff78a066 654 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 655 _current_irq_callback(TX_DONE);
jmhong 84:45b9ff78a066 656 }
jmhong 84:45b9ff78a066 657 // printf("[SEND] 13, else, in case of state timeout, return RADIO_TX_OK \n");
jmhong 84:45b9ff78a066 658
Wolfgang Betz 69:22e9b407effa 659 return RADIO_TX_OK;
Wolfgang Betz 69:22e9b407effa 660 }
Wolfgang Betz 34:edda6a7238ec 661 }
Wolfgang Betz 34:edda6a7238ec 662
Wolfgang Betz 34:edda6a7238ec 663 /** Set Ready State **/
jmhong 84:45b9ff78a066 664 int SimpleSpirit1::set_ready_state(void)
jmhong 83:54b207156a91 665 {
Wolfgang Betz 69:22e9b407effa 666 uint16_t state;
Wolfgang Betz 34:edda6a7238ec 667
Wolfgang Betz 69:22e9b407effa 668 disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 669
Wolfgang Betz 69:22e9b407effa 670 _spirit_tx_started = false;
Wolfgang Betz 69:22e9b407effa 671 _is_receiving = false;
Wolfgang Betz 69:22e9b407effa 672 stop_rx_timeout();
Wolfgang Betz 34:edda6a7238ec 673
Wolfgang Betz 69:22e9b407effa 674 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 69:22e9b407effa 675 CLEAR_RXBUF();
Wolfgang Betz 69:22e9b407effa 676 CLEAR_TXBUF();
Wolfgang Betz 34:edda6a7238ec 677
Wolfgang Betz 69:22e9b407effa 678 state = SPIRIT1_STATUS();
jmhong 84:45b9ff78a066 679 if(state == SPIRIT1_STATE_STANDBY) {
jmhong 84:45b9ff78a066 680 // printf("[SEND] 3-1, set_ready_state() call, if(state == SPIRIT1_STATE_STANDBY) in \n");
Wolfgang Betz 69:22e9b407effa 681 cmd_strobe(SPIRIT1_STROBE_READY);
jmhong 84:45b9ff78a066 682 } else if(state == SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 683 // printf("[SEND] 3-2, set_ready_state() call, if(state == SPIRIT1_STATE_RX) in \n");
Wolfgang Betz 69:22e9b407effa 684 cmd_strobe(SPIRIT1_STROBE_SABORT);
jmhong 84:45b9ff78a066 685 } else if(state != SPIRIT1_STATE_READY)
jmhong 83:54b207156a91 686 {
Wolfgang Betz 34:edda6a7238ec 687 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 688 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, state>>1);
Wolfgang Betz 34:edda6a7238ec 689 #endif
jmhong 84:45b9ff78a066 690 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 691
jmhong 84:45b9ff78a066 692 // off();
jmhong 84:45b9ff78a066 693 // reset_board();
jmhong 84:45b9ff78a066 694 // on();
jmhong 84:45b9ff78a066 695 // printf("[SEND] 3-3, set_ready_state() call, else if(state != SPIRIT1_STATE_READY) in, something is wrong. \n");
Wolfgang Betz 69:22e9b407effa 696 }
Wolfgang Betz 34:edda6a7238ec 697
Wolfgang Betz 69:22e9b407effa 698 BUSYWAIT_UNTIL((SPIRIT1_STATUS() == SPIRIT1_STATE_READY) && ((last_state & XO_ON) == XO_ON), STATE_TIMEOUT);
jmhong 84:45b9ff78a066 699 if(last_state != (SPIRIT1_STATE_READY | XO_ON)) {
Wolfgang Betz 69:22e9b407effa 700 error("\r\nSpirit1: failed to become ready (%x) => pls. reset!\r\n", last_state);
Wolfgang Betz 69:22e9b407effa 701 enable_spirit_irq();
jmhong 84:45b9ff78a066 702 return RETURN_ERROR_NUMBER + 2;
Wolfgang Betz 69:22e9b407effa 703 }
Wolfgang Betz 34:edda6a7238ec 704
Wolfgang Betz 69:22e9b407effa 705 irq_clear_status();
Wolfgang Betz 34:edda6a7238ec 706
Wolfgang Betz 69:22e9b407effa 707 enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 708 }
Wolfgang Betz 34:edda6a7238ec 709
jmhong 84:45b9ff78a066 710 int SimpleSpirit1::off(void)
jmhong 83:54b207156a91 711 {
jmhong 84:45b9ff78a066 712 if(spirit_on == ON) {
Wolfgang Betz 69:22e9b407effa 713 /* Disables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 69:22e9b407effa 714 disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 715
Wolfgang Betz 69:22e9b407effa 716 /* first stop rx/tx */
Wolfgang Betz 69:22e9b407effa 717 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 718
Wolfgang Betz 34:edda6a7238ec 719 #ifdef USE_STANDBY_STATE
Wolfgang Betz 69:22e9b407effa 720 /* Puts the SPIRIT1 in STANDBY */
Wolfgang Betz 69:22e9b407effa 721 cmd_strobe(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 69:22e9b407effa 722 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, STATE_TIMEOUT);
Wolfgang Betz 69:22e9b407effa 723 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 69:22e9b407effa 724 error("\r\nSpirit1: failed to enter standby (%x)\r\n", last_state>>1);
Wolfgang Betz 69:22e9b407effa 725 return 1;
Wolfgang Betz 69:22e9b407effa 726 }
Wolfgang Betz 34:edda6a7238ec 727 #endif // USE_STANDBY_STATE
Wolfgang Betz 34:edda6a7238ec 728
Wolfgang Betz 69:22e9b407effa 729 spirit_on = OFF;
Wolfgang Betz 69:22e9b407effa 730 _nr_of_irq_disables = 1;
Wolfgang Betz 69:22e9b407effa 731 }
Wolfgang Betz 69:22e9b407effa 732 return 0;
Wolfgang Betz 34:edda6a7238ec 733 }
Wolfgang Betz 34:edda6a7238ec 734
jmhong 84:45b9ff78a066 735 int SimpleSpirit1::on(void)
jmhong 83:54b207156a91 736 {
jmhong 84:45b9ff78a066 737 if(spirit_on == OFF) {
Wolfgang Betz 69:22e9b407effa 738 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 739
Wolfgang Betz 69:22e9b407effa 740 /* now we go to Rx */
Wolfgang Betz 69:22e9b407effa 741 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 34:edda6a7238ec 742
Wolfgang Betz 69:22e9b407effa 743 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
Wolfgang Betz 69:22e9b407effa 744 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 745 error("\r\nSpirit1: failed to enter rx (%x) => retry\r\n", last_state>>1);
Wolfgang Betz 69:22e9b407effa 746 }
Wolfgang Betz 34:edda6a7238ec 747
Wolfgang Betz 69:22e9b407effa 748 /* Enables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 69:22e9b407effa 749 spirit_on = ON;
Wolfgang Betz 34:edda6a7238ec 750 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 751 debug_if(!(_nr_of_irq_disables == 1), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 34:edda6a7238ec 752 #endif
Wolfgang Betz 69:22e9b407effa 753 enable_spirit_irq();
Wolfgang Betz 69:22e9b407effa 754 }
Wolfgang Betz 34:edda6a7238ec 755
Wolfgang Betz 34:edda6a7238ec 756 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 757 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 758 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 759 }
Wolfgang Betz 34:edda6a7238ec 760 #endif
Wolfgang Betz 34:edda6a7238ec 761
Wolfgang Betz 69:22e9b407effa 762 return 0;
Wolfgang Betz 34:edda6a7238ec 763 }
Wolfgang Betz 34:edda6a7238ec 764
jmhong 84:45b9ff78a066 765 uint8_t SimpleSpirit1::refresh_state(void)
jmhong 84:45b9ff78a066 766 {
Wolfgang Betz 69:22e9b407effa 767 uint8_t mcstate;
Wolfgang Betz 34:edda6a7238ec 768
Wolfgang Betz 69:22e9b407effa 769 SpiritSpiReadRegisters(MC_STATE0_BASE, 1, &mcstate);
Wolfgang Betz 34:edda6a7238ec 770
Wolfgang Betz 69:22e9b407effa 771 return mcstate;
Wolfgang Betz 34:edda6a7238ec 772 }
Wolfgang Betz 34:edda6a7238ec 773
Wolfgang Betz 34:edda6a7238ec 774 int SimpleSpirit1::read(void *buf, unsigned int bufsize)
jmhong 84:45b9ff78a066 775 {
Wolfgang Betz 69:22e9b407effa 776 disable_spirit_irq();
jmhong 83:54b207156a91 777 printf("read() 1 ");
Wolfgang Betz 34:edda6a7238ec 778
Wolfgang Betz 69:22e9b407effa 779 /* Checks if the RX buffer is empty */
Wolfgang Betz 69:22e9b407effa 780 if(IS_RXBUF_EMPTY()) {
Wolfgang Betz 43:a512f909514a 781 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 782 debug("\r\nBuffer is empty\r\n");
Wolfgang Betz 43:a512f909514a 783 #endif
jmhong 84:45b9ff78a066 784 printf("[DEBUG] 2-1");
Wolfgang Betz 69:22e9b407effa 785 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 786
Wolfgang Betz 69:22e9b407effa 787 cmd_strobe(SPIRIT1_STROBE_RX);
Wolfgang Betz 69:22e9b407effa 788 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
Wolfgang Betz 69:22e9b407effa 789 enable_spirit_irq();
Wolfgang Betz 69:22e9b407effa 790 return 0;
Wolfgang Betz 69:22e9b407effa 791 }
Wolfgang Betz 34:edda6a7238ec 792
Wolfgang Betz 69:22e9b407effa 793 if(bufsize < spirit_rx_len) {
Wolfgang Betz 69:22e9b407effa 794 enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 795
Wolfgang Betz 69:22e9b407effa 796 /* If buf has the correct size */
Wolfgang Betz 34:edda6a7238ec 797 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 798 debug("\r\nTOO SMALL BUF\r\n");
Wolfgang Betz 34:edda6a7238ec 799 #endif
Wolfgang Betz 69:22e9b407effa 800 return 0;
Wolfgang Betz 69:22e9b407effa 801 } else {
Wolfgang Betz 69:22e9b407effa 802 /* Copies the packet received */
jmhong 84:45b9ff78a066 803
Wolfgang Betz 69:22e9b407effa 804 memcpy(buf, spirit_rx_buf, spirit_rx_len);
jmhong 84:45b9ff78a066 805 bufsize = spirit_rx_len;
jmhong 83:54b207156a91 806 printf("recv 3-1");
jmhong 84:45b9ff78a066 807
Wolfgang Betz 69:22e9b407effa 808 CLEAR_RXBUF();
jmhong 84:45b9ff78a066 809 printf(" 3-2");
jmhong 84:45b9ff78a066 810
Wolfgang Betz 69:22e9b407effa 811 enable_spirit_irq();
jmhong 83:54b207156a91 812 printf(" 3-3 read ok\n");
Wolfgang Betz 34:edda6a7238ec 813
Wolfgang Betz 69:22e9b407effa 814 return bufsize;
Wolfgang Betz 69:22e9b407effa 815 }
Wolfgang Betz 34:edda6a7238ec 816
Wolfgang Betz 34:edda6a7238ec 817 }
Wolfgang Betz 34:edda6a7238ec 818
Wolfgang Betz 34:edda6a7238ec 819 int SimpleSpirit1::channel_clear(void)
Wolfgang Betz 34:edda6a7238ec 820 {
Wolfgang Betz 69:22e9b407effa 821 float rssi_value;
Wolfgang Betz 69:22e9b407effa 822 /* Local variable used to memorize the SPIRIT1 state */
Wolfgang Betz 69:22e9b407effa 823 uint8_t spirit_state = ON;
Wolfgang Betz 34:edda6a7238ec 824
Wolfgang Betz 69:22e9b407effa 825 if(spirit_on == OFF) {
Wolfgang Betz 69:22e9b407effa 826 /* Wakes up the SPIRIT1 */
Wolfgang Betz 69:22e9b407effa 827 on();
Wolfgang Betz 69:22e9b407effa 828 spirit_state = OFF;
Wolfgang Betz 69:22e9b407effa 829 }
Wolfgang Betz 34:edda6a7238ec 830
Wolfgang Betz 34:edda6a7238ec 831 #ifndef NDEBUG
Wolfgang Betz 69:22e9b407effa 832 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 69:22e9b407effa 833 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 69:22e9b407effa 834 }
Wolfgang Betz 34:edda6a7238ec 835 #endif
Wolfgang Betz 34:edda6a7238ec 836
Wolfgang Betz 69:22e9b407effa 837 disable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 838
Wolfgang Betz 69:22e9b407effa 839 /* Reset State to Ready */
Wolfgang Betz 69:22e9b407effa 840 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 841
Wolfgang Betz 69:22e9b407effa 842 /* Stores the RSSI value */
Wolfgang Betz 69:22e9b407effa 843 rssi_value = qi_get_rssi_dbm();
Wolfgang Betz 34:edda6a7238ec 844
Wolfgang Betz 69:22e9b407effa 845 enable_spirit_irq();
Wolfgang Betz 34:edda6a7238ec 846
Wolfgang Betz 69:22e9b407effa 847 /* Puts the SPIRIT1 in its previous state */
jmhong 83:54b207156a91 848 if(spirit_state==OFF) {
Wolfgang Betz 69:22e9b407effa 849 off();
Wolfgang Betz 34:edda6a7238ec 850 #ifndef NDEBUG
Wolfgang Betz 34:edda6a7238ec 851 #ifdef USE_STANDBY_STATE
Wolfgang Betz 69:22e9b407effa 852 if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) {
jmhong 83:54b207156a91 853 #else
jmhong 84:45b9ff78a066 854 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
jmhong 83:54b207156a91 855 #endif
jmhong 84:45b9ff78a066 856 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
jmhong 84:45b9ff78a066 857 }
jmhong 83:54b207156a91 858 #endif
jmhong 84:45b9ff78a066 859 } else {
jmhong 84:45b9ff78a066 860 disable_spirit_irq();
jmhong 83:54b207156a91 861
jmhong 84:45b9ff78a066 862 set_ready_state();
Wolfgang Betz 34:edda6a7238ec 863
jmhong 84:45b9ff78a066 864 cmd_strobe(SPIRIT1_STROBE_RX);
jmhong 84:45b9ff78a066 865 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, STATE_TIMEOUT);
jmhong 84:45b9ff78a066 866 if((last_state & SPIRIT1_STATE_STATEBITS) != SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 867 error("\r\nSpirit1: (#2) failed to enter rx (%x) => retry\r\n", last_state>>1);
jmhong 84:45b9ff78a066 868 }
Wolfgang Betz 34:edda6a7238ec 869
jmhong 84:45b9ff78a066 870 enable_spirit_irq();
jmhong 83:54b207156a91 871
jmhong 83:54b207156a91 872 #ifndef NDEBUG
jmhong 84:45b9ff78a066 873 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
jmhong 84:45b9ff78a066 874 debug("\r\nAssert failed in: %s (%d): state=%x\r\n", __func__, __LINE__, last_state>>1);
Wolfgang Betz 82:a18c22d2b83a 875 }
jmhong 84:45b9ff78a066 876 #endif
Wolfgang Betz 82:a18c22d2b83a 877 }
Wolfgang Betz 82:a18c22d2b83a 878
jmhong 84:45b9ff78a066 879 /* Checks the RSSI value with the threshold */
jmhong 84:45b9ff78a066 880 if(rssi_value<CCA_THRESHOLD) {
jmhong 84:45b9ff78a066 881 return 0;
jmhong 84:45b9ff78a066 882 } else {
jmhong 84:45b9ff78a066 883 return 1;
jmhong 84:45b9ff78a066 884 }
jmhong 84:45b9ff78a066 885 }
Wolfgang Betz 82:a18c22d2b83a 886
jmhong 84:45b9ff78a066 887 int SimpleSpirit1::get_pending_packet(void)
jmhong 84:45b9ff78a066 888 {
jmhong 84:45b9ff78a066 889 return !IS_RXBUF_EMPTY();
jmhong 84:45b9ff78a066 890 }
Wolfgang Betz 82:a18c22d2b83a 891
jmhong 84:45b9ff78a066 892 /** Spirit Irq Callback **/
jmhong 84:45b9ff78a066 893 /* betzw - TODO: use threaded interrupt handling when `MBED_CONF_RTOS_PRESENT` is defined (see `atmel-rf-driver`) */
jmhong 84:45b9ff78a066 894 void SimpleSpirit1::IrqHandler()
jmhong 84:45b9ff78a066 895 {
jmhong 84:45b9ff78a066 896 #ifdef CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 897 printf("[CUBEBITE] IrqHandler() call !\r\n");
jmhong 84:45b9ff78a066 898 #endif //CUBEBITE_DEBUG
jmhong 84:45b9ff78a066 899
jmhong 84:45b9ff78a066 900 st_lib_spirit_irqs x_irq_status;
jmhong 84:45b9ff78a066 901
jmhong 84:45b9ff78a066 902 /* get interrupt source from radio */
jmhong 84:45b9ff78a066 903 irq_get_status(&x_irq_status);
jmhong 84:45b9ff78a066 904
jmhong 84:45b9ff78a066 905 /* The IRQ_TX_DATA_SENT notifies the packet has been sent. Puts the SPIRIT1 in RX */
jmhong 84:45b9ff78a066 906 if(x_irq_status.IRQ_TX_DATA_SENT) {
jmhong 84:45b9ff78a066 907 /* betzw - NOTE: MUST be handled before `IRQ_RX_DATA_READY` for Nanostack integration!
jmhong 84:45b9ff78a066 908 Logically, Nanostack only expects the "DONE" after "SUCCESS" (if it gets
jmhong 84:45b9ff78a066 909 DONE before SUCCESS, it assumes you're not going to bother to send SUCCESS).
jmhong 84:45b9ff78a066 910 */
Wolfgang Betz 82:a18c22d2b83a 911 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 912 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 913 debug_if(!((*tmp) & IRQ_TX_DATA_SENT_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 914 debug_if(tx_fifo_remaining != 0, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 83:54b207156a91 915 #endif
jmhong 83:54b207156a91 916
jmhong 84:45b9ff78a066 917 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 918 printf("[IRQ] if(x_irq_status.IRQ_TX_DATA_SENT) in, if(_spirit_tx_started) in \n");
jmhong 84:45b9ff78a066 919 _spirit_tx_started = false;
jmhong 83:54b207156a91 920
jmhong 84:45b9ff78a066 921 /* call user callback */
jmhong 84:45b9ff78a066 922 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 923 _current_irq_callback(TX_DONE);
jmhong 83:54b207156a91 924 }
jmhong 84:45b9ff78a066 925 }
jmhong 83:54b207156a91 926
jmhong 84:45b9ff78a066 927 /* Disable handling of other TX flags */
jmhong 84:45b9ff78a066 928 x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY = S_RESET;
jmhong 84:45b9ff78a066 929 tx_fifo_buffer = NULL;
jmhong 84:45b9ff78a066 930 }
jmhong 83:54b207156a91 931
jmhong 83:54b207156a91 932 #ifndef RX_FIFO_THR_WA
jmhong 84:45b9ff78a066 933 /* The IRQ_TX_FIFO_ALMOST_EMPTY notifies an nearly empty TX fifo */
jmhong 84:45b9ff78a066 934 if(x_irq_status.IRQ_TX_FIFO_ALMOST_EMPTY) {
jmhong 83:54b207156a91 935 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 936 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 937 debug_if(!((*tmp) & IRQ_TX_FIFO_ALMOST_EMPTY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 938 debug_if(!_spirit_tx_started, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 939 debug_if(tx_fifo_buffer == NULL, "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
Wolfgang Betz 82:a18c22d2b83a 940 #endif
Wolfgang Betz 82:a18c22d2b83a 941
jmhong 84:45b9ff78a066 942 int8_t fifo_available = SPIRIT_MAX_FIFO_LEN/2; // fill-up half fifo
jmhong 84:45b9ff78a066 943 int8_t to_send = (tx_fifo_remaining > fifo_available) ? fifo_available : tx_fifo_remaining;
jmhong 83:54b207156a91 944
jmhong 84:45b9ff78a066 945 tx_fifo_remaining -= to_send;
jmhong 83:54b207156a91 946
jmhong 84:45b9ff78a066 947 /* Fill FIFO Buffer */
jmhong 84:45b9ff78a066 948 if(to_send > 0) {
jmhong 84:45b9ff78a066 949 spi_write_linear_fifo(to_send, (uint8_t*)&tx_fifo_buffer[tx_buffer_pos]);
jmhong 83:54b207156a91 950 }
jmhong 84:45b9ff78a066 951 tx_buffer_pos += to_send;
jmhong 84:45b9ff78a066 952 }
jmhong 83:54b207156a91 953 #endif // !RX_FIFO_THR_WA
jmhong 83:54b207156a91 954
jmhong 84:45b9ff78a066 955 /* TX FIFO underflow/overflow error */
jmhong 84:45b9ff78a066 956 if(x_irq_status.IRQ_TX_FIFO_ERROR) {
jmhong 83:54b207156a91 957 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 958 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 959 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 960 debug_if(!((*tmp) & IRQ_TX_FIFO_ERROR_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 961 #endif
jmhong 84:45b9ff78a066 962 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 963 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 964 /* call user callback */
jmhong 84:45b9ff78a066 965 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 966 _current_irq_callback(TX_ERR);
jmhong 84:45b9ff78a066 967 }
jmhong 84:45b9ff78a066 968 }
jmhong 84:45b9ff78a066 969
jmhong 84:45b9ff78a066 970 /* reset data still to be sent */
jmhong 84:45b9ff78a066 971 tx_fifo_remaining = 0;
jmhong 84:45b9ff78a066 972 }
jmhong 84:45b9ff78a066 973
jmhong 84:45b9ff78a066 974 /* The IRQ_RX_DATA_READY notifies a new packet arrived */
jmhong 84:45b9ff78a066 975 if(x_irq_status.IRQ_RX_DATA_READY) {
jmhong 84:45b9ff78a066 976 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 977 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 978 debug_if(!((*tmp) & IRQ_RX_DATA_READY_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 979 #endif
jmhong 84:45b9ff78a066 980
jmhong 84:45b9ff78a066 981 if(!_is_receiving) { // spurious irq?!? (betzw: see comments on macro 'RX_FIFO_THR_WA'!)
jmhong 84:45b9ff78a066 982 #ifdef HEAVY_DEBUG
jmhong 83:54b207156a91 983 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 83:54b207156a91 984 #endif
jmhong 84:45b9ff78a066 985 } else {
jmhong 84:45b9ff78a066 986 _is_receiving = false; // Finished receiving
jmhong 84:45b9ff78a066 987 stop_rx_timeout();
jmhong 84:45b9ff78a066 988
jmhong 84:45b9ff78a066 989 spirit_rx_len = pkt_basic_get_received_pkt_length();
jmhong 84:45b9ff78a066 990
jmhong 84:45b9ff78a066 991 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 992 debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 993 #endif
jmhong 84:45b9ff78a066 994
jmhong 84:45b9ff78a066 995 if(spirit_rx_len <= MAX_PACKET_LEN) {
jmhong 84:45b9ff78a066 996 uint8_t to_receive = spirit_rx_len - _spirit_rx_pos;
jmhong 84:45b9ff78a066 997 if(to_receive > 0) {
jmhong 84:45b9ff78a066 998 spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
jmhong 84:45b9ff78a066 999 _spirit_rx_pos += to_receive;
jmhong 83:54b207156a91 1000 }
jmhong 83:54b207156a91 1001 }
jmhong 83:54b207156a91 1002
jmhong 84:45b9ff78a066 1003 cmd_strobe(SPIRIT1_STROBE_FRX);
Wolfgang Betz 82:a18c22d2b83a 1004
jmhong 84:45b9ff78a066 1005 last_rssi = qi_get_rssi(); //MGR
jmhong 84:45b9ff78a066 1006 last_sqi = qi_get_sqi(); //MGR
jmhong 83:54b207156a91 1007
jmhong 84:45b9ff78a066 1008 /* call user callback */
jmhong 84:45b9ff78a066 1009 if((_spirit_rx_pos == spirit_rx_len) && _current_irq_callback) {
jmhong 84:45b9ff78a066 1010 _current_irq_callback(RX_DONE);
jmhong 84:45b9ff78a066 1011 }
jmhong 83:54b207156a91 1012
jmhong 84:45b9ff78a066 1013 /* Disable handling of other RX flags */
jmhong 84:45b9ff78a066 1014 x_irq_status.IRQ_RX_FIFO_ALMOST_FULL = S_RESET;
Wolfgang Betz 69:22e9b407effa 1015 }
jmhong 84:45b9ff78a066 1016 }
Wolfgang Betz 34:edda6a7238ec 1017
Wolfgang Betz 82:a18c22d2b83a 1018 #ifndef RX_FIFO_THR_WA
jmhong 84:45b9ff78a066 1019 /* RX FIFO almost full */
jmhong 84:45b9ff78a066 1020 if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) {
jmhong 84:45b9ff78a066 1021 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1022 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1023 debug_if(!((*tmp) & IRQ_RX_FIFO_ALMOST_FULL_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 1024 #endif
jmhong 84:45b9ff78a066 1025 if(!_is_receiving) { // spurious irq?!?
jmhong 83:54b207156a91 1026 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1027 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 83:54b207156a91 1028 #endif
jmhong 84:45b9ff78a066 1029 } else {
jmhong 84:45b9ff78a066 1030 uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
jmhong 84:45b9ff78a066 1031 if((fifo_available + _spirit_rx_pos) <= MAX_PACKET_LEN) {
jmhong 84:45b9ff78a066 1032 spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
jmhong 84:45b9ff78a066 1033 _spirit_rx_pos += fifo_available;
jmhong 84:45b9ff78a066 1034 } else {
Wolfgang Betz 34:edda6a7238ec 1035 #ifdef DEBUG_IRQ
jmhong 83:54b207156a91 1036 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
Wolfgang Betz 34:edda6a7238ec 1037 #endif
jmhong 83:54b207156a91 1038 }
Wolfgang Betz 82:a18c22d2b83a 1039 }
jmhong 84:45b9ff78a066 1040 }
Wolfgang Betz 82:a18c22d2b83a 1041 #endif // !RX_FIFO_THR_WA
Wolfgang Betz 82:a18c22d2b83a 1042
jmhong 84:45b9ff78a066 1043 /* Reception errors */
jmhong 84:45b9ff78a066 1044 if((x_irq_status.IRQ_RX_FIFO_ERROR) || (x_irq_status.IRQ_RX_DATA_DISC)) {
Wolfgang Betz 82:a18c22d2b83a 1045 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1046 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1047 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 1048 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 1049 #endif
jmhong 84:45b9ff78a066 1050 rx_timeout_handler();
jmhong 84:45b9ff78a066 1051 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 1052 _spirit_tx_started = false;
jmhong 84:45b9ff78a066 1053 /* call user callback */
jmhong 84:45b9ff78a066 1054 if(_current_irq_callback) {
jmhong 84:45b9ff78a066 1055 _current_irq_callback(TX_ERR);
Wolfgang Betz 69:22e9b407effa 1056 }
Wolfgang Betz 69:22e9b407effa 1057 }
Wolfgang Betz 69:22e9b407effa 1058 }
jmhong 84:45b9ff78a066 1059
jmhong 84:45b9ff78a066 1060 /* The IRQ_VALID_SYNC is used to notify a new packet is coming */
jmhong 84:45b9ff78a066 1061 if(x_irq_status.IRQ_VALID_SYNC) {
jmhong 84:45b9ff78a066 1062 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1063 uint32_t *tmp = (uint32_t*)&x_irq_status;
jmhong 84:45b9ff78a066 1064 debug_if(!((*tmp) & IRQ_VALID_SYNC_MASK), "\r\nAssert failed in: %s (%d)\r\n", __func__, __LINE__);
jmhong 84:45b9ff78a066 1065 #endif
jmhong 84:45b9ff78a066 1066 /* betzw - NOTE: there is a race condition between Spirit1 receiving packets and
jmhong 84:45b9ff78a066 1067 * the MCU trying to send a packet, which gets resolved in favor of
jmhong 84:45b9ff78a066 1068 * sending.
jmhong 84:45b9ff78a066 1069 */
jmhong 84:45b9ff78a066 1070 if(_spirit_tx_started) {
jmhong 84:45b9ff78a066 1071 #ifdef DEBUG_IRQ
jmhong 84:45b9ff78a066 1072 debug("\r\n%s (%d): irq=%x\r\n", __func__, __LINE__, *tmp);
jmhong 84:45b9ff78a066 1073 #endif
jmhong 84:45b9ff78a066 1074 } else {
jmhong 84:45b9ff78a066 1075 _is_receiving = true;
jmhong 84:45b9ff78a066 1076 start_rx_timeout();
jmhong 84:45b9ff78a066 1077 }
jmhong 84:45b9ff78a066 1078 }
jmhong 84:45b9ff78a066 1079 }