sx1208.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161
  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2014 Semtech
  8. Description: sx1208 dirver
  9. License: Revised BSD License, see LICENSE.TXT file include in the project
  10. Maintainer: Leo Xie, Jiapeng Li
  11. */
  12. #include "myRadio_gpio.h"
  13. #include "sx1208-reg.h"
  14. #include "sx1208.h"
  15. #include "string.h"
  16. #include "sx1208-state-grid.h"
  17. #include "sx1231_params.h"
  18. #define SX1208_RX_FIFO_THRESH (66-15)
  19. #define SX1208_TX_FIFO_THRESH (15)
  20. #define SX1208_PAYLOAD_LENGTH_MAX (0xFF)
  21. uint8_t sx1208_read(uint8_t addr);
  22. void sx1208_write(uint8_t addr, uint8_t data);
  23. void sx1208_rmw(uint8_t addr, uint8_t mask, uint8_t val);
  24. void sx1208_rmw_bit(uint8_t addr, uint8_t bit, uint8_t val);
  25. void sx1208_read_burst(uint8_t addr, uint8_t *buf, uint16_t len);
  26. void sx1208_write_burst(uint8_t addr, uint8_t *buf, uint16_t len);
  27. int sx1208_read_fifo(uint8_t *buf, uint16_t len);
  28. int sx1208_write_fifo(uint8_t *buf, uint16_t len);
  29. // static void sx1208_set_rxbw(uint32_t fdev, uint32_t br);
  30. static void sx1208_set_preamble_reg(uint16_t len);
  31. static void sx1208_set_crc_auto_clear(sx1208_crc_auto_clear_t crcac_opt);
  32. void sx1208_irq_dio0(void);
  33. void sx1208_irq_dio1(void);
  34. void sx1208_irq_dio2(void);
  35. void sx1208_irq_dio3(void);
  36. void sx1208_irq_dio4(void);
  37. void sx1208_irq_dio5(void);
  38. volatile uint8_t sx1208_ext_fifo[256];
  39. volatile uint8_t sx1208_ext_fifo_rd_index;
  40. volatile uint8_t sx1208_ext_fifo_wr_index;
  41. volatile int16_t sx1208_ext_fifo_count;
  42. static volatile sx1208_callback_t sx1208_callback_g;
  43. static volatile uint16_t sx1208_tx_preamble_len_g;
  44. static volatile uint16_t sx1208_rx_preamble_len_g;
  45. static volatile uint8_t sx1208_high_power; // 0: off, 1: on
  46. static sx1208_rx_pkt_t sx1208_rx_pkt;
  47. static uint16_t sx1208_rx_payload_length;
  48. static sx1208_protocol_t sx1208_protocol;
  49. bool Irq0Fired = false;
  50. #define SX1208_FSK_RXBW_TAB_LENGTH (21)
  51. static const uint32_t sx1208_fsk_rxbw_tab[SX1208_FSK_RXBW_TAB_LENGTH]={
  52. 2600, 3100, 3900, 5200, 6300, 7800, 10400, 12500, 15600, 20800,
  53. 25000, 31300, 41700, 50000, 62500, 83300, 100000, 125000, 166700, 200000,
  54. 250000
  55. };
  56. static void delay_ms(uint32_t delay_ms)
  57. {
  58. uint32_t i = 0;
  59. uint32_t j = 0;
  60. for (i = 0; i < delay_ms; i++)
  61. {
  62. for (j = 0; j < 10000; j++)
  63. {
  64. ;
  65. }
  66. }
  67. }
  68. void sx1208_reset(void)
  69. {
  70. uint8_t i;
  71. // HAL_SX1208_RST_OUTPUT();
  72. RF_SX12xx_RST_H();
  73. delay_ms(1);
  74. // HAL_SX1208_RST_INPUT();
  75. RF_SX12xx_RST_L();
  76. delay_ms(6);
  77. }
  78. void sx1208_initParams(void)
  79. {
  80. uint8_t i;
  81. sx1208_params_unit_t *params;
  82. params = (sx1208_params_unit_t *)sx1231ParamsList;
  83. for ( i = 0; i < sizeof(sx1231ParamsList) / 2; i++)
  84. {
  85. if (params->addr != 0xff)
  86. {
  87. sx1208_write(params->addr, params->value);
  88. }
  89. params ++;
  90. }
  91. }
  92. void sx1208_init(sx1208_callback_t sx1208_cb)
  93. {
  94. uint8_t i;
  95. /** sfotware reset sx1208 */
  96. sx1208_reset();
  97. // sx1208_initParams();
  98. /** Callback function */
  99. sx1208_callback_g = NULL;
  100. if(sx1208_cb != NULL){
  101. sx1208_callback_g = sx1208_cb;
  102. }
  103. sx1208_ext_fifo_rd_index = 0;
  104. sx1208_ext_fifo_count = 0;
  105. sx1208_ext_fifo_wr_index = 0;
  106. sx1208_high_power = 0;
  107. sx1208_rx_pkt.buf = NULL;
  108. sx1208_rx_payload_length = 0;
  109. /** write default value to SX1208, refer to SX1208-Datasheet for register description */
  110. sx1208_write(REG_RXBW, 0x55);
  111. sx1208_write(REG_AFCBW, 0x8B);
  112. sx1208_write(REG_DIOMAPPING2, 0x07);
  113. for(i=0; i<8; i++){
  114. sx1208_write(REG_SYNCVALUE1+i, 0x01); // Write SyncWord to default value
  115. }
  116. sx1208_write(REG_FIFOTHRESH, 0x8F);
  117. /** Receiver optimized */
  118. sx1208_write(REG_TESTLNA, 0X2D); // =0x2D,enable sensitivity boost, this is optional
  119. // =0x1B,disable sensitivity boost
  120. {
  121. /* read test */
  122. // uint8_t read_reg;
  123. // read_reg = sx1208_read(REG_RSSITHRESH);
  124. // read_reg = sx1208_read(REG_PACKETCONFIG2);
  125. // read_reg = sx1208_read(REG_TESTLNA);
  126. // read_reg = sx1208_read(REG_TESTLNA);
  127. }
  128. {
  129. //LNA \AGC config
  130. sx1208_write(REG_LNA, 0X89); // 0x89 means 200 Ohm LNA and AGC OFF with G1
  131. sx1208_write(REG_DAGC, 0x30); //
  132. }
  133. {
  134. sx1208_write(REG_RSSITHRESH, 0xE8); // =0xE8,Auto threshold:
  135. sx1208_write(REG_PACKETCONFIG2, 0x04); // .AutoRxRestartOn = 1,
  136. }
  137. // sx1208_write(REG_RSSICONFIG, sx1208_read(REG_RSSICONFIG) | RF_RSSI_START);
  138. {
  139. // uint8_t i = 0;
  140. // /** configure DIO Mapping */
  141. // sx1208_write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_00 | \
  142. // RF_DIOMAPPING1_DIO1_00 | \
  143. // RF_DIOMAPPING1_DIO2_00 | \
  144. // RF_DIOMAPPING1_DIO3_FIFO_FULL );
  145. // //fifo总共66BYTE,写完DIO3会拉高
  146. // while(READ_RF_SX12xx_DIO3() == 0)
  147. // {
  148. // sx1208_write(REG_FIFO, 0xff);
  149. // i ++;
  150. // if (i >= 66)
  151. // {
  152. // break;
  153. // }
  154. // }
  155. // delay_ms(10);
  156. // //FifoOverrun位写1,DIO3会置低,不操作该bit,电平会一直保持
  157. // sx1208_write(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
  158. // while (1)
  159. // {
  160. // ;
  161. // }
  162. }
  163. delay_ms(10);
  164. }
  165. void sx1208_set_mode(sx1208_mode_t mode)
  166. {
  167. uint8_t cur_mode;
  168. cur_mode = sx1208_read(REG_OPMODE) & (~RF_OPMODE_MASK);
  169. if(cur_mode != mode){
  170. /** adjust high power option, must be closed during RX */
  171. switch(mode){
  172. case RF_OPMODE_TRANSMITTER:
  173. if( sx1208_high_power && (sx1208_read(REG_OCP) != 0x0F) ){
  174. sx1208_write(REG_OCP, 0x0F);
  175. sx1208_write(REG_TEST_PA1, 0x5D);
  176. sx1208_write(REG_TEST_PA2, 0x7C);
  177. }
  178. break;
  179. case RF_OPMODE_RECEIVER:
  180. if( sx1208_high_power && (sx1208_read(REG_OCP) != 0x1F) ){
  181. sx1208_write(REG_OCP, 0x1F);
  182. sx1208_write(REG_TEST_PA1, 0x55);
  183. sx1208_write(REG_TEST_PA2, 0x70);
  184. }
  185. break;
  186. default:
  187. break;
  188. }
  189. sx1208_rmw(REG_OPMODE, RF_OPMODE_MASK, mode);
  190. }
  191. while( (sx1208_read(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  192. }
  193. void sx1208_set_config(sx1208_config_t *config)
  194. {
  195. sx1208_protocol = config->protocol;
  196. sx1208_set_frf(config->frf);
  197. sx1208_set_fdev(config->fdev);
  198. sx1208_set_bitrate(config->bitrate);
  199. sx1208_set_rxbw(config->fdev, config->bitrate);
  200. sx1208_set_tx_power(config->tx_power);
  201. sx1208_set_sync_word(config->sync_word, config->sync_word_len);
  202. switch(sx1208_protocol){
  203. case SX1208_PROTOCOL_STATE_GRID:
  204. /** To implement state grid protocol, we need use software crc and fixed length packet */
  205. sx1208_set_header_mode(SX1208_HEADER_DISABLE);
  206. sx1208_set_crc_mode(SX1208_CRC_OFF);
  207. sx1208_write(REG_PAYLOADLENGTH, SX1208_PAYLOAD_LENGTH_MAX);
  208. break;
  209. case SX1208_PROTOCOL_NONE:
  210. sx1208_set_header_mode(config->header_mode);
  211. if(config->header_mode == SX1208_HEADER_DISABLE){
  212. sx1208_write(REG_PAYLOADLENGTH, config->payload_len);
  213. }
  214. sx1208_set_crc_mode(config->crc_mode);
  215. break;
  216. }
  217. /** If CRC AUTO CLEAR is on, then there will be not PKT_READY interrupt, when crc is error
  218. Turn it off to make sure PKT_READY is generated at any time */
  219. sx1208_set_crc_auto_clear(SX1208_CRC_AUTO_CLEAR_OFF);
  220. sx1208_set_preamble(SX1208_TX_PREAMBLE, config->tx_preamble_len);
  221. sx1208_set_preamble(SX1208_RX_PREAMBLE, config->rx_preamble_len);
  222. }
  223. int8_t sx1208_send(uint8_t *buf, uint8_t len, uint16_t timeout)
  224. {
  225. int i;
  226. uint8_t mode;
  227. uint16_t crc;
  228. uint8_t frame_length;
  229. mode = sx1208_read(REG_OPMODE) & (~RF_OPMODE_MASK);
  230. if( mode == RF_OPMODE_TRANSMITTER || mode == RF_OPMODE_RECEIVER ){
  231. return -1;
  232. }
  233. if(len == 0){
  234. return -2;
  235. }
  236. /** TX start is triggered by FifoLevel */
  237. if(len > SX1208_TX_FIFO_THRESH){
  238. /** set fifo threshold for TX mode, make a software FIFO ALMOST Empty INTERRUPT*/
  239. sx1208_write(REG_FIFOTHRESH, SX1208_TX_FIFO_THRESH);
  240. }else{
  241. sx1208_write(REG_FIFOTHRESH, len-1);
  242. }
  243. /** rewrite tx_preamble length to preamble length register */
  244. sx1208_set_preamble_reg(sx1208_tx_preamble_len_g);
  245. /** configure DIO Mapping */
  246. sx1208_write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_PKT_SENT | \
  247. RF_DIOMAPPING1_DIO1_FIFO_LEVEL | \
  248. RF_DIOMAPPING1_DIO2_FIFO_NEMPTY | \
  249. RF_DIOMAPPING1_DIO3_FIFO_FULL );
  250. switch(sx1208_protocol){
  251. case SX1208_PROTOCOL_STATE_GRID:
  252. /** State Grid Length area, length of payload */
  253. sx1208_write(REG_FIFO, sx1208_state_grid_whitening_reverse_data(len, 0)); // Use index 0 to whitening the first byte (length).
  254. /** State Grid Whole Frame Length, 1 byte for length, 2 bytes for CRC, "len" bytes for payload */
  255. sx1208_write(REG_PAYLOADLENGTH, len+3);
  256. /** calculate and append crc bytes */
  257. crc = sx1208_state_grid_crc_calc(buf, len);
  258. buf[len] = (uint8_t)crc;
  259. buf[len+1] = (uint8_t)(crc>>8);
  260. /** recalculate frame length */
  261. frame_length = len + 2;
  262. sx1208_state_grid_whitening_reverse_buf(buf, frame_length, 1); // Use index 1 to whitening and reverse payload and crc
  263. break;
  264. case SX1208_PROTOCOL_NONE:
  265. if(sx1208_read(REG_PACKETCONFIG1) & RF_PACKET1_FORMAT_VARIABLE){
  266. sx1208_write(REG_FIFO, len);
  267. }else{
  268. sx1208_write(REG_PAYLOADLENGTH, len);
  269. }
  270. /** recalculate frame length */
  271. frame_length = len;
  272. break;
  273. }
  274. i=0;
  275. while(READ_RF_SX12xx_DIO3() == 0){
  276. sx1208_write(REG_FIFO, buf[i]);
  277. i++;
  278. if(i >= frame_length){
  279. break;
  280. }
  281. }
  282. // TODO: protect this section code
  283. /** i shouldn't be re-initialized */
  284. for(; i<frame_length; i++){
  285. sx1208_ext_fifo[sx1208_ext_fifo_wr_index++] = buf[i];
  286. sx1208_ext_fifo_count++;
  287. }
  288. /** resume buffer data */
  289. sx1208_state_grid_reverse_whitening_buf(buf, frame_length, 1);
  290. sx1208_set_mode(SX1208_MODE_TX);
  291. return 0;
  292. }
  293. void sx1208_receive(uint8_t *buf, uint8_t len, uint16_t timeout)
  294. {
  295. /** For protection */
  296. sx1208_set_mode(SX1208_MODE_SLEEP);
  297. sx1208_write(REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
  298. /** set fifo threshold for RX mode, make a software FIFO ALMOST FULL INTERRUPT*/
  299. sx1208_write(REG_FIFOTHRESH, SX1208_RX_FIFO_THRESH);
  300. /** rewrite tx_preamble length to preamble length register */
  301. sx1208_set_preamble_reg(sx1208_rx_preamble_len_g);
  302. /** configure DIO Mapping */
  303. sx1208_write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_PLD_RDY | \
  304. RF_DIOMAPPING1_DIO1_FIFO_LEVEL | \
  305. RF_DIOMAPPING1_DIO2_FIFO_NEMPTY | \
  306. RF_DIOMAPPING1_DIO3_PREAMBLEDETECT );
  307. switch(sx1208_protocol){
  308. case SX1208_PROTOCOL_STATE_GRID:
  309. sx1208_set_header_mode(SX1208_HEADER_DISABLE);
  310. /** force receive largest packets, use software to check when exits. */
  311. sx1208_write(REG_PAYLOADLENGTH, SX1208_PAYLOAD_LENGTH_MAX);
  312. break;
  313. case SX1208_PROTOCOL_NONE:
  314. if(sx1208_read(REG_PACKETCONFIG1) & RF_PACKET1_FORMAT_VARIABLE){
  315. /** variable mode could receive maximum 255 bytes payload */
  316. sx1208_write(REG_PAYLOADLENGTH, SX1208_PAYLOAD_LENGTH_MAX);
  317. }else{
  318. sx1208_write(REG_PAYLOADLENGTH, len);
  319. }
  320. break;
  321. }
  322. sx1208_ext_fifo_rd_index = 0;
  323. sx1208_ext_fifo_count = 0;
  324. sx1208_ext_fifo_wr_index = 0;
  325. sx1208_rx_pkt.buf = buf;
  326. sx1208_set_mode(SX1208_MODE_RX);
  327. delay_ms(1);
  328. }
  329. void sx1208_rx_test_mode(void)
  330. {
  331. sx1208_set_mode(SX1208_MODE_STANDBY);
  332. delay_ms(20);
  333. sx1208_set_mode(SX1208_MODE_FS);
  334. delay_ms(20);
  335. sx1208_write(REG_DATAMODUL,0x40); // continuous mode
  336. delay_ms(10);
  337. /** configure DIO Mapping */
  338. sx1208_write( REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_PLD_RDY | \
  339. RF_DIOMAPPING1_DIO1_FIFO_LEVEL | \
  340. RF_DIOMAPPING1_DIO2_01 | \
  341. RF_DIOMAPPING1_DIO3_PREAMBLEDETECT );
  342. // sx1208_write(REG_DIOMAPPING1,0x00);
  343. // delay_ms(10);
  344. sx1208_write(REG_DIOMAPPING2,0x07);
  345. delay_ms(10);
  346. sx1208_set_mode(SX1208_MODE_RX);
  347. delay_ms(20);
  348. while((sx1208_read(REG_IRQFLAGS1)&RF_IRQFLAGS1_RXREADY)==0);
  349. }
  350. void sx1208_tx_test_mode(void)
  351. {
  352. sx1208_set_mode(SX1208_MODE_STANDBY);
  353. delay_ms(20);
  354. sx1208_set_mode(SX1208_MODE_FS);
  355. // delay_ms(20);
  356. // sx1208_write(REG_DATAMODUL,0x40); // continuous mode
  357. // delay_ms(10);
  358. // sx1208_write(REG_DIOMAPPING1,0x00);
  359. // delay_ms(10);
  360. // sx1208_write(REG_DIOMAPPING2,0x07);
  361. delay_ms(10);
  362. sx1208_set_mode(SX1208_MODE_TX);
  363. delay_ms(20);
  364. while((sx1208_read(REG_IRQFLAGS1)&RF_IRQFLAGS1_TXREADY)==0);
  365. }
  366. void sx1208_set_rxtx_polarity(sx1208_txtx_polarity_t pol)
  367. {
  368. if(pol == SX1208_RXTX_TXHIGH || pol == SX1208_RXTX_RXLOW){
  369. sx1208_rmw(REG_OPMODE, RF_OPMODE_RXTX_MASK, RF_OPMODE_RXTX_TXHIGH);
  370. }else{
  371. sx1208_rmw(REG_OPMODE, RF_OPMODE_RXTX_MASK, RF_OPMODE_RXTX_RXHIGH);
  372. }
  373. }
  374. void sx1208_set_frf( uint32_t frf )
  375. {
  376. frf = ( uint32_t )( ( double )frf / ( double )SX1208_FREQ_STEP );
  377. sx1208_write( REG_FRFMSB, ( uint8_t )( ( frf >> 16 ) & 0xFF ) );
  378. sx1208_write( REG_FRFMID, ( uint8_t )( ( frf >> 8 ) & 0xFF ) );
  379. sx1208_write( REG_FRFLSB, ( uint8_t )( frf & 0xFF ) );
  380. }
  381. void sx1208_set_fdev( uint32_t fdev )
  382. {
  383. if(fdev>100000){
  384. fdev=100000;
  385. }
  386. fdev = ( uint32_t )( ( double )fdev / ( double )SX1208_FREQ_STEP );
  387. sx1208_write( REG_FDEVMSB, ( uint8_t )( ( fdev >> 8 ) & 0xFF ) );
  388. sx1208_write( REG_FDEVLSB, ( uint8_t )( fdev & 0xFF ) );
  389. }
  390. void sx1208_set_bitrate( uint32_t br )
  391. {
  392. if(br>100000){
  393. br=100000;
  394. }
  395. br = ( uint32_t )( ( double )SX1208_FXOSC / ( double )br );
  396. sx1208_write( REG_BITRATEMSB, ( uint8_t )( ( br >> 8 ) & 0xFF ) );
  397. sx1208_write( REG_BITRATELSB, ( uint8_t )( br & 0xFF ) );
  398. }
  399. void sx1208_set_rxbw(uint32_t fdev, uint32_t br)
  400. {
  401. uint8_t reg, RxBwMant, RxBwExp, i;
  402. uint32_t sum;
  403. sum = fdev * 2 + br;
  404. for(i=0; i<SX1208_FSK_RXBW_TAB_LENGTH; i++){
  405. if(sx1208_fsk_rxbw_tab[i] > sum){
  406. break;
  407. }
  408. }
  409. if(i == SX1208_FSK_RXBW_TAB_LENGTH){
  410. // invalid fdev and bitrate (Fdev + bitrate/2 > RxBw)
  411. // fdev and bitrate are out of range, use the largest RXBW
  412. i = (SX1208_FSK_RXBW_TAB_LENGTH-1);
  413. }
  414. RxBwExp = 7 - i/3;
  415. RxBwMant = 2 - i%3;
  416. reg = sx1208_read(REG_RXBW);
  417. reg = (reg&RF_RXBW_DCCFREQ_111) | (RxBwMant<<3) | RxBwExp;
  418. sx1208_write(REG_RXBW, reg);
  419. }
  420. sx1208_tx_port_t hal_sx1208_get_tx_port(void)
  421. {
  422. #if 0
  423. /** use RFIO as OUTPUT port*/
  424. return SX1208_TX_PORT_RFIO;
  425. #else
  426. /** use PA_BOOST as OUTPUT port */
  427. return SX1208_TX_PORT_PA_BOOST;
  428. #endif
  429. }
  430. void sx1208_set_tx_power( int8_t pow )
  431. {
  432. uint8_t reg = 0;
  433. uint8_t OutputPower;
  434. /** reset power setings, start TX power configuration from exact state */
  435. sx1208_write(REG_PALEVEL, 0x9F);
  436. /** disable high power output */
  437. sx1208_write(REG_OCP, 0x1F);
  438. sx1208_write(REG_TEST_PA1, 0x55);
  439. sx1208_write(REG_TEST_PA2, 0x70);
  440. sx1208_high_power = 0;
  441. if( hal_sx1208_get_tx_port() == SX1208_TX_PORT_PA_BOOST ){
  442. /** Adjust power value if it is out of range */
  443. if(pow>20){
  444. pow = 20;
  445. }else if(pow < 2){
  446. pow = 2;
  447. }
  448. /** TX on PA_BOOST, this driver doesn't support to use PA1 alone
  449. Use PA1 only with PA_BOOST, HW should be different with use both PA1 and PA2*/
  450. if(pow<=17){
  451. if (pow<=13)
  452. {
  453. reg = RF_PALEVEL_PA1_ON | RF_PALEVEL_PA2_OFF;
  454. OutputPower = 18 + pow;
  455. }
  456. else
  457. {
  458. /** Enable both PA1 and PA2 on PA_BOOST */
  459. reg = RF_PALEVEL_PA1_ON | RF_PALEVEL_PA2_ON;
  460. OutputPower = 14 + pow;
  461. }
  462. }else{
  463. /** Enable both PA1 and PA2 on PA_BOOST, and enable high power output */
  464. reg = RF_PALEVEL_PA1_ON | RF_PALEVEL_PA2_ON;
  465. sx1208_write(REG_OCP, 0x0F);
  466. sx1208_write(REG_TEST_PA1, 0x5D);
  467. sx1208_write(REG_TEST_PA2, 0x7C);
  468. OutputPower = 11 + pow;
  469. sx1208_high_power = 1; // high power mode
  470. }
  471. }else{
  472. /** TX on RFIO */
  473. if(pow>13){
  474. pow = 13;
  475. }else if(pow < -18){
  476. pow = -18;
  477. }
  478. /** Enable PA0 on RFIO */
  479. reg = RF_PALEVEL_PA0_ON;
  480. OutputPower = 18 + pow;
  481. }
  482. reg |= OutputPower;
  483. sx1208_write(REG_PALEVEL, reg);
  484. }
  485. void sx1208_set_sync_word(uint8_t *sync_word, uint8_t len)
  486. {
  487. int8_t i;
  488. if(len == 0 || sync_word == NULL){
  489. sx1208_rmw(REG_SYNCCONFIG, RF_SYNC_MASK, RF_SYNC_OFF);
  490. for(i = 0; i<8; i++){
  491. sx1208_write(REG_SYNCVALUE1+i, 0x00);
  492. }
  493. }else if(len <= 8){
  494. sx1208_rmw(REG_SYNCCONFIG, RF_SYNC_MASK, RF_SYNC_ON); // sync word on
  495. sx1208_rmw(REG_SYNCCONFIG, RF_SYNC_SIZE_MASK, (len-1)<<3); // sync word size
  496. for(i = 0; i<len; i++){
  497. switch(sx1208_protocol){
  498. case SX1208_PROTOCOL_STATE_GRID:
  499. /** SX1208 send MSB first, StateGrid send LSB first, reverse sync word to implement State Grid Spec. */
  500. sx1208_write(REG_SYNCVALUE1+i, sx1208_state_grid_reverse(sync_word[i]));
  501. break;
  502. case SX1208_PROTOCOL_NONE:
  503. sx1208_write(REG_SYNCVALUE1+i, sync_word[i]);
  504. break;
  505. }
  506. }
  507. }else{
  508. while(1); // synword length is less than 8
  509. }
  510. }
  511. void sx1208_set_header_mode(sx1208_header_mode_t hdr_mode)
  512. {
  513. if(hdr_mode == SX1208_HEADER_ENABLE){
  514. /** Packet with header */
  515. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_MASK, RF_PACKET1_FORMAT_VARIABLE);
  516. }else{
  517. /** Packet without header */
  518. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_FORMAT_MASK, RF_PACKET1_FORMAT_FIXED);
  519. }
  520. }
  521. void sx1208_set_crc_mode(sx1208_crc_mode_t crc_mode)
  522. {
  523. if(crc_mode == SX1208_CRC_ON){
  524. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_CRC_MASK, RF_PACKET1_CRC_ON);
  525. }else{
  526. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_CRC_MASK, RF_PACKET1_CRC_OFF);
  527. }
  528. }
  529. void sx1208_set_crc_auto_clear(sx1208_crc_auto_clear_t crcac_opt)
  530. {
  531. if(crcac_opt == SX1208_CRC_AUTO_CLEAR_ON){
  532. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_CRCAUTOCLEAR_MASK, RF_PACKET1_CRCAUTOCLEAR_ON);
  533. }else{
  534. sx1208_rmw(REG_PACKETCONFIG1, RF_PACKET1_CRCAUTOCLEAR_MASK, RF_PACKET1_CRCAUTOCLEAR_OFF);
  535. }
  536. }
  537. uint8_t sx1208_read_rssi(void)
  538. {
  539. // sx1208_write(REG_RSSICONFIG, sx1208_read(REG_RSSICONFIG) | RF_RSSI_START);
  540. // while( 0 == ( sx1208_read(REG_RSSICONFIG) & RF_RSSI_DONE ) );
  541. return sx1208_read(REG_RSSIVALUE);
  542. }
  543. uint8_t sx1208_read_fei(void)
  544. {
  545. // sx1208_write(REG_RSSICONFIG, sx1208_read(REG_RSSICONFIG) | RF_RSSI_START);
  546. while( 0 == ( sx1208_read(REG_RSSICONFIG) & RF_RSSI_DONE ) );
  547. return sx1208_read(REG_RSSIVALUE);
  548. }
  549. void sx1208_set_preamble(sx1208_preamble_t preamble_type, uint16_t len)
  550. {
  551. if(preamble_type == SX1208_TX_PREAMBLE){
  552. sx1208_tx_preamble_len_g = len;
  553. }else{
  554. sx1208_rx_preamble_len_g = len;
  555. }
  556. }
  557. static void sx1208_set_preamble_reg(uint16_t len)
  558. {
  559. sx1208_write(REG_PREAMBLEMSB, (uint8_t)(len>>8));
  560. sx1208_write(REG_PREAMBLELSB, (uint8_t)len);
  561. }
  562. /** low level functions */
  563. uint8_t sx1208_read(uint8_t addr)
  564. {
  565. uint8_t ret;
  566. BOARD_SPI_NSS_L();
  567. SpiReadWrite( (~0x80) & addr );
  568. ret = SpiReadWrite( 0x00 );
  569. BOARD_SPI_NSS_H();
  570. return ret;
  571. }
  572. void sx1208_write(uint8_t addr, uint8_t data)
  573. {
  574. BOARD_SPI_NSS_L();
  575. SpiReadWrite( 0x80 | addr );
  576. SpiReadWrite( data );
  577. BOARD_SPI_NSS_H();
  578. }
  579. uint8_t sx1208_read_int(uint8_t addr)
  580. {
  581. uint8_t ret;
  582. BOARD_SPI_NSS_L();
  583. SpiReadWrite( (~0x80) & addr );
  584. ret = SpiReadWrite( 0x00 );
  585. BOARD_SPI_NSS_H();
  586. return ret;
  587. }
  588. void sx1208_write_int(uint8_t addr, uint8_t data)
  589. {
  590. BOARD_SPI_NSS_L();
  591. SpiReadWrite( 0x80 | addr );
  592. SpiReadWrite( data );
  593. BOARD_SPI_NSS_H();
  594. }
  595. /** read-modify write register */
  596. void sx1208_rmw(uint8_t addr, uint8_t mask, uint8_t val)
  597. {
  598. uint8_t ret;
  599. /** read register */
  600. BOARD_SPI_NSS_L();
  601. SpiReadWrite( (~0x80) & addr );
  602. ret = SpiReadWrite( 0x00 );
  603. BOARD_SPI_NSS_H();
  604. /** modify the data */
  605. ret = (ret & mask) | (val & ~mask);
  606. /** write data back */
  607. BOARD_SPI_NSS_L();
  608. SpiReadWrite( 0x80 | addr );
  609. SpiReadWrite( ret );
  610. BOARD_SPI_NSS_H();
  611. }
  612. /** read-modify write register */
  613. void sx1208_rmw_int(uint8_t addr, uint8_t mask, uint8_t val)
  614. {
  615. uint8_t ret;
  616. /** read register */
  617. BOARD_SPI_NSS_L();
  618. SpiReadWrite( (~0x80) & addr );
  619. ret = SpiReadWrite( 0x00 );
  620. BOARD_SPI_NSS_H();
  621. /** modify the data */
  622. ret = (ret & mask) | (val & ~mask);
  623. /** write data back */
  624. BOARD_SPI_NSS_L();
  625. SpiReadWrite( 0x80 | addr );
  626. SpiReadWrite( ret );
  627. BOARD_SPI_NSS_H();
  628. }
  629. void sx1208_rmw_bit(uint8_t addr, uint8_t bit, uint8_t val)
  630. {
  631. uint8_t ret;
  632. /** read register */
  633. BOARD_SPI_NSS_L();
  634. SpiReadWrite( (~0x80) & addr );
  635. ret = SpiReadWrite( 0x00 );
  636. BOARD_SPI_NSS_H();
  637. /** modify the data */
  638. ret = (val == 0)? (ret & bit) : (ret | bit);
  639. /** write data back */
  640. BOARD_SPI_NSS_L();
  641. SpiReadWrite( 0x80 | addr );
  642. SpiReadWrite( ret );
  643. BOARD_SPI_NSS_H();
  644. }
  645. void sx1208_read_burst(uint8_t addr, uint8_t *buf, uint16_t len)
  646. {
  647. int i;
  648. BOARD_SPI_NSS_L();
  649. SpiReadWrite( (~0x80) & addr );
  650. for(i = 0; i<len; i++){
  651. buf[i] = SpiReadWrite( 0x00 );
  652. }
  653. BOARD_SPI_NSS_H();
  654. }
  655. void sx1208_write_burst(uint8_t addr, uint8_t *buf, uint16_t len)
  656. {
  657. int i;
  658. BOARD_SPI_NSS_L();
  659. SpiReadWrite( 0x80 | addr );
  660. for(i = 0; i<len; i++){
  661. SpiReadWrite( *buf++ );
  662. }
  663. BOARD_SPI_NSS_H();
  664. }
  665. int sx1208_read_fifo(uint8_t *buf, uint16_t len)
  666. {
  667. int i = 0;
  668. BOARD_SPI_NSS_L();
  669. SpiReadWrite( (~0x80) & REG_FIFO );
  670. while( (READ_RF_SX12xx_DIO2() == 1) && (i < len) ){
  671. buf[i] = SpiReadWrite( 0x00 );
  672. i++;
  673. }
  674. BOARD_SPI_NSS_H();
  675. return i;
  676. }
  677. int sx1208_write_fifo(uint8_t *buf, uint16_t len)
  678. {
  679. sx1208_write_burst(REG_FIFO, buf, len);
  680. return 0;
  681. }
  682. static int sx1208_update_fifo_thresh(uint16_t pkt_len, uint8_t received_len)
  683. {
  684. uint16_t remain_len;
  685. remain_len = pkt_len - received_len;
  686. if( remain_len > SX1208_RX_FIFO_THRESH ){
  687. sx1208_write_int(REG_FIFOTHRESH, SX1208_RX_FIFO_THRESH);
  688. }else if(remain_len < 5){
  689. return -1;
  690. }else{
  691. sx1208_write_int(REG_FIFOTHRESH, remain_len-2);
  692. }
  693. return 0;
  694. }
  695. void sx1208_onDioIrq( void )
  696. {
  697. Irq0Fired = true;
  698. }
  699. void sx1208_process(void)
  700. {
  701. uint8_t irq_flag2, mode, crc_sta;
  702. if (Irq0Fired == true)
  703. {
  704. Irq0Fired = false;
  705. irq_flag2 = sx1208_read_int(REG_IRQFLAGS2);
  706. mode = sx1208_read_int(REG_OPMODE) & (~RF_OPMODE_MASK);
  707. crc_sta = sx1208_read_int(REG_PACKETCONFIG1) & (~RF_PACKET1_CRC_MASK);
  708. switch(mode){
  709. case RF_OPMODE_TRANSMITTER:
  710. if(irq_flag2 & RF_IRQFLAGS2_PACKETSENT){
  711. /** package sent, exit */
  712. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  713. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  714. sx1208_callback_g(SX1208_TX_DONE, NULL);
  715. }
  716. break;
  717. case RF_OPMODE_RECEIVER:
  718. if( (irq_flag2 & RF_IRQFLAGS2_PAYLOADREADY) &&( (!crc_sta) || (irq_flag2 & RF_IRQFLAGS2_CRCOK) ) ){
  719. while( (READ_RF_SX12xx_DIO2() == 1) && (sx1208_ext_fifo_count < 256) ){
  720. sx1208_ext_fifo[sx1208_ext_fifo_wr_index++] = sx1208_read_int(REG_FIFO);
  721. sx1208_ext_fifo_count++;
  722. }
  723. sx1208_rx_pkt.raw_rssi = sx1208_read_int(REG_RSSIVALUE);
  724. switch(sx1208_protocol){
  725. case SX1208_PROTOCOL_STATE_GRID:
  726. /** should never here */
  727. if( SX1208_STATE_GRID_GOOD_CRC == sx1208_state_grid_crc_check((void *)(sx1208_ext_fifo+1), sx1208_rx_payload_length-3) ){
  728. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  729. sx1208_rx_pkt.len = sx1208_ext_fifo_count-3;
  730. sx1208_ext_fifo_count = 0;
  731. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  732. }else{
  733. sx1208_ext_fifo_count = 0;
  734. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  735. }
  736. break;
  737. case SX1208_PROTOCOL_NONE:
  738. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  739. sx1208_rx_pkt.len = sx1208_ext_fifo_count-1;
  740. sx1208_ext_fifo_count = 0;
  741. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  742. break;
  743. }
  744. }else{
  745. /** CRC error */
  746. /** package received, exit */
  747. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  748. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  749. sx1208_ext_fifo_count = 0;
  750. sx1208_ext_fifo_wr_index = 0;
  751. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  752. }
  753. break;
  754. default:
  755. break;
  756. }
  757. }
  758. }
  759. void sx1208_irq_dio0(void)
  760. {
  761. uint8_t irq_flag2, mode, crc_sta;
  762. irq_flag2 = sx1208_read_int(REG_IRQFLAGS2);
  763. mode = sx1208_read_int(REG_OPMODE) & (~RF_OPMODE_MASK);
  764. crc_sta = sx1208_read_int(REG_PACKETCONFIG1) & (~RF_PACKET1_CRC_MASK);
  765. switch(mode){
  766. case RF_OPMODE_TRANSMITTER:
  767. if(irq_flag2 & RF_IRQFLAGS2_PACKETSENT){
  768. /** package sent, exit */
  769. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  770. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  771. sx1208_callback_g(SX1208_TX_DONE, NULL);
  772. }
  773. break;
  774. case RF_OPMODE_RECEIVER:
  775. if( (irq_flag2 & RF_IRQFLAGS2_PAYLOADREADY) &&( (!crc_sta) || (irq_flag2 & RF_IRQFLAGS2_CRCOK) ) ){
  776. while( (READ_RF_SX12xx_DIO2() == 1) && (sx1208_ext_fifo_count < 256) ){
  777. sx1208_ext_fifo[sx1208_ext_fifo_wr_index++] = sx1208_read_int(REG_FIFO);
  778. sx1208_ext_fifo_count++;
  779. }
  780. /** package received, exit receive mode */
  781. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  782. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  783. switch(sx1208_protocol){
  784. case SX1208_PROTOCOL_STATE_GRID:
  785. /** should never here */
  786. if( SX1208_STATE_GRID_GOOD_CRC == sx1208_state_grid_crc_check((void *)(sx1208_ext_fifo+1), sx1208_rx_payload_length-3) ){
  787. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  788. sx1208_rx_pkt.len = sx1208_ext_fifo_count-3;
  789. sx1208_ext_fifo_count = 0;
  790. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  791. }else{
  792. sx1208_ext_fifo_count = 0;
  793. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  794. }
  795. break;
  796. case SX1208_PROTOCOL_NONE:
  797. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  798. sx1208_rx_pkt.len = sx1208_ext_fifo_count-1;
  799. sx1208_ext_fifo_count = 0;
  800. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  801. break;
  802. }
  803. }else{
  804. /** CRC error */
  805. /** package received, exit */
  806. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  807. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  808. sx1208_ext_fifo_count = 0;
  809. sx1208_ext_fifo_wr_index = 0;
  810. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  811. }
  812. break;
  813. default:
  814. break;
  815. }
  816. }
  817. void sx1208_irq_dio1(void)
  818. {
  819. uint8_t irq_flag2, mode, len;
  820. uint16_t fifo_bytes_remain;
  821. irq_flag2 = sx1208_read_int(REG_IRQFLAGS2);
  822. mode = sx1208_read_int(REG_OPMODE) & (~RF_OPMODE_MASK);
  823. switch(mode){
  824. case RF_OPMODE_TRANSMITTER:
  825. if(irq_flag2 & RF_IRQFLAGS2_FIFOLEVEL){
  826. /** rising edge */
  827. }else{
  828. /** falling edge, FIFO almost empty */
  829. while( (READ_RF_SX12xx_DIO3() == 0) && (sx1208_ext_fifo_count > 0) ){
  830. sx1208_write_int(REG_FIFO, sx1208_ext_fifo[sx1208_ext_fifo_rd_index++]);
  831. sx1208_ext_fifo_count--;
  832. }
  833. }
  834. break;
  835. case RF_OPMODE_RECEIVER:
  836. if(irq_flag2 & RF_IRQFLAGS2_FIFOLEVEL){
  837. /** rising edge */
  838. fifo_bytes_remain = 256 - sx1208_ext_fifo_count;
  839. fifo_bytes_remain = sx1208_rx_payload_length;
  840. len = sx1208_read_fifo( (uint8_t *)sx1208_ext_fifo + (uint8_t)sx1208_ext_fifo_wr_index, fifo_bytes_remain );
  841. sx1208_ext_fifo_wr_index += len;
  842. sx1208_ext_fifo_count += len;
  843. switch(sx1208_protocol){
  844. case SX1208_PROTOCOL_STATE_GRID:
  845. if(sx1208_update_fifo_thresh(sx1208_rx_payload_length, sx1208_ext_fifo_count) < 0){
  846. while(sx1208_ext_fifo_count < sx1208_rx_payload_length){
  847. len = sx1208_read_fifo( (uint8_t *)sx1208_ext_fifo + (uint8_t)sx1208_ext_fifo_wr_index, sx1208_rx_payload_length );
  848. sx1208_ext_fifo_wr_index += len;
  849. sx1208_ext_fifo_count += len;
  850. }
  851. /** package received, exit */
  852. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  853. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  854. sx1208_state_grid_reverse_whitening_buf((void *)sx1208_ext_fifo, sx1208_rx_payload_length ,0);
  855. if( SX1208_STATE_GRID_GOOD_CRC == sx1208_state_grid_crc_check((void *)(sx1208_ext_fifo+1), sx1208_rx_payload_length-3) ){
  856. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  857. sx1208_rx_pkt.len = sx1208_ext_fifo_count-3;
  858. sx1208_ext_fifo_count = 0;
  859. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  860. }else{
  861. sx1208_ext_fifo_count = 0;
  862. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  863. }
  864. }
  865. break;
  866. case SX1208_PROTOCOL_NONE:
  867. break;
  868. }
  869. }else{
  870. /** falling edge */
  871. }
  872. break;
  873. default:
  874. break;
  875. }
  876. }
  877. void sx1208_irq_dio2(void)
  878. {
  879. uint8_t irq_flag2, mode, len;
  880. irq_flag2 = sx1208_read_int(REG_IRQFLAGS2);
  881. mode = sx1208_read_int(REG_OPMODE) & (~RF_OPMODE_MASK);
  882. switch(mode){
  883. case RF_OPMODE_TRANSMITTER:
  884. break;
  885. case RF_OPMODE_RECEIVER:
  886. if(irq_flag2 & RF_IRQFLAGS2_FIFONOTEMPTY){
  887. /** rising edge */
  888. switch(sx1208_protocol){
  889. case SX1208_PROTOCOL_STATE_GRID:
  890. /** read first byte back, this byte is the length of this frame */
  891. if(sx1208_ext_fifo_wr_index == 0){
  892. sx1208_read_fifo( (uint8_t *)sx1208_ext_fifo + (uint8_t)sx1208_ext_fifo_wr_index, 1 );
  893. sx1208_rx_payload_length = sx1208_state_grid_reverse_whitening_data(sx1208_ext_fifo[0], 0)+3;
  894. /** payload length is out of range */
  895. if(sx1208_rx_payload_length > 0xFF){
  896. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  897. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  898. sx1208_ext_fifo_count = 0;
  899. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  900. break;
  901. }
  902. sx1208_ext_fifo_wr_index++;
  903. sx1208_ext_fifo_count++;
  904. if(sx1208_update_fifo_thresh(sx1208_rx_payload_length, sx1208_ext_fifo_count) < 0){
  905. while(sx1208_ext_fifo_count < sx1208_rx_payload_length){
  906. len = sx1208_read_fifo( (uint8_t *)sx1208_ext_fifo + (uint8_t)sx1208_ext_fifo_wr_index, sx1208_rx_payload_length );
  907. sx1208_ext_fifo_wr_index += len;
  908. sx1208_ext_fifo_count += len;
  909. }
  910. /** package received, exit */
  911. sx1208_rmw_int(REG_OPMODE, RF_OPMODE_MASK, RF_OPMODE_SLEEP);
  912. while( (sx1208_read_int(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00 );
  913. sx1208_state_grid_reverse_whitening_buf((void *)sx1208_ext_fifo, sx1208_rx_payload_length ,0);
  914. if( SX1208_STATE_GRID_GOOD_CRC == sx1208_state_grid_crc_check((void *)(sx1208_ext_fifo+1), sx1208_rx_payload_length-3) ){
  915. memcpy(sx1208_rx_pkt.buf, (void *)(sx1208_ext_fifo+1), sx1208_ext_fifo_count-1);
  916. sx1208_rx_pkt.len = sx1208_ext_fifo_count-3;
  917. sx1208_ext_fifo_count = 0;
  918. sx1208_callback_g(SX1208_RX_DONE, &sx1208_rx_pkt);
  919. }else{
  920. sx1208_ext_fifo_count = 0;
  921. sx1208_callback_g(SX1208_RX_ERROR, NULL);
  922. }
  923. }
  924. }
  925. break;
  926. case SX1208_PROTOCOL_NONE:
  927. break;
  928. }
  929. }
  930. break;
  931. default:
  932. break;
  933. }
  934. }
  935. void sx1208_irq_dio3(void)
  936. {
  937. uint8_t irq_flag1, mode, afc_ctl;
  938. afc_ctl = sx1208_read_int(REG_AFCCTRL);
  939. irq_flag1 = sx1208_read_int(REG_IRQFLAGS1);
  940. mode = sx1208_read_int(REG_OPMODE) & (~RF_OPMODE_MASK);
  941. switch(mode){
  942. case RF_OPMODE_TRANSMITTER:
  943. break;
  944. case RF_OPMODE_RECEIVER:
  945. if(afc_ctl & RF_AFCCTRL_PREAMBLEDETECT){
  946. //sx1208_rx_pkt.raw_rssi = sx1208_read_rssi();
  947. sx1208_write_int(REG_RSSICONFIG, sx1208_read_int(REG_RSSICONFIG) | RF_RSSI_START);
  948. while( 0 == ( sx1208_read_int(REG_RSSICONFIG) & RF_RSSI_DONE ) );
  949. sx1208_rx_pkt.raw_rssi = sx1208_read_int(REG_RSSIVALUE);
  950. }else if(irq_flag1 & RF_IRQFLAGS1_SYNCADDRESSMATCH){
  951. //sx1208_rx_pkt.raw_rssi = sx1208_read_rssi();
  952. sx1208_write_int(REG_RSSICONFIG, sx1208_read_int(REG_RSSICONFIG) | RF_RSSI_START);
  953. while( 0 == ( sx1208_read_int(REG_RSSICONFIG) & RF_RSSI_DONE ) );
  954. sx1208_rx_pkt.raw_rssi = sx1208_read_int(REG_RSSIVALUE);
  955. }
  956. break;
  957. default:
  958. break;
  959. }
  960. }
  961. void sx1208_irq_dio4(void)
  962. {
  963. }