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