센서보드 RF IRQ 테스트 중 and bug fix?

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
jmhong
Date:
Thu Sep 20 06:34:33 2018 +0000
Revision:
85:38de5ee78824
Parent:
84:45b9ff78a066
bug fix?

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