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

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
jmhong
Date:
Wed Jul 18 05:44:03 2018 +0000
Revision:
85:cdf9e4210c87
Parent:
84:45b9ff78a066
cubebite hjm 180718

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