lora.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. #include "lora.h"
  2. #include "includes.h"
  3. #include "radio.h"
  4. #include "project_config.h"
  5. #include "stdio.h"
  6. #include "stm32f10x_it.h"
  7. #include "delay.h"
  8. #include "string.h"
  9. #include "lora.h"
  10. #include "bsp.h"
  11. #include "cad.h"
  12. #include "gw_ctrl.h"
  13. #define RADIO_RX_TIMEOUT_VALUE 0
  14. uint8_t cmpBuf[256] ;
  15. uint8_t lora_state = lora_state_idle;
  16. uint8_t lora_state_tmp = lora_state_idle;
  17. OS_Q lora_q;
  18. //system_lora_t sys_lora;
  19. system_lora_t sys_lora_rx;
  20. system_lora_t sys_lora_tx;
  21. uint8_t lora_send_buf[256],lora_send_size;
  22. uint8_t lora_cad_num = 0,lora_cad_start = 0,lora_send_start = 0;
  23. uint16_t delay_time = 0;
  24. lora_para_t lora_para;
  25. uint8_t lora_para_choice;
  26. uint32_t LORA_FRE = 486300000;
  27. uint8_t LORA_TX_OUTPUT_POWER = 20;
  28. uint8_t LORA_BANDWIDTH = 1;
  29. uint8_t LORA_SPREADING_FACTOR = 7;
  30. uint8_t LORA_CODINGRATE = 2;
  31. uint8_t LORA_PREAMBLE_LENGTH = 8;
  32. //lora参数
  33. lora_para_single_t lora_para_fixed[]=
  34. {
  35. 486300000,20,1,7,2,8,
  36. 489300000,20,1,7,2,8,
  37. 509700000,20,2,8,3,8,
  38. 470300000,20,2,8,3,8,
  39. };
  40. //lora中断定时器
  41. timeout_t tt_lora_irq={
  42. 0xff,
  43. 0,
  44. 60*1000,
  45. };
  46. //lora接收定时器
  47. //lora一小时未接收到数据,设备复位
  48. timeout_t tt_lora_rcv_state={
  49. 0xff,
  50. 0,
  51. 60*60*1000, //1小时
  52. };
  53. //lora一小时复位后
  54. timeout_t tt_lora_rst_rcv_state={
  55. 0,0,5*60*1000,//5分钟
  56. };
  57. /*信道空闲的标志*/
  58. bool channel_free = false;
  59. /**
  60. * @brief lora状态机,死机定时器
  61. */
  62. timeout_t tt_lora_state={
  63. 0xFF,
  64. 0,
  65. 1*60*1000 //1分钟
  66. };
  67. /**
  68. * @brief 从cad切换至rx后,停留在rx状态的定时器
  69. */
  70. timeout_t tt_fromCadtoRx={
  71. 1,
  72. 0,
  73. 200 //200ms
  74. };
  75. /*!
  76. * Radio events function pointer
  77. * 这个是传参进入其他函数中了,所以用全局变量(局部变量使用完了内存释放可能导致异常)
  78. */
  79. static RadioEvents_t RadioEventsObj;
  80. static void SX126xOnTxDone( void );
  81. static void SX126xOnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
  82. static void SX126xOnCadDone( bool channelActivityDetected );
  83. static void SX126xOnTxTimeout( void );
  84. static void SX126xOnRxTimeout( void );
  85. static void SX126xOnRxError( void );
  86. /////////////////////////////////////////////////////////////////
  87. //lora初始超时定时
  88. void lora_timeout_start(void)
  89. {
  90. //收到升级相关指令时,重新打开Lora超时定时器
  91. //打开Lora接收或发送超时定时器(用于判断Lora模块是否正常工作)
  92. timeout_start(&tt_lora_rcv_state,0xff);
  93. timeout_stop(&tt_lora_rst_rcv_state);
  94. device_fixed_info.reset_flag = 0;
  95. }
  96. /////////////////////////////////////////////////////////////////////
  97. //申请Lora消息队列
  98. void* lora_queue_mem_calloc_must(uint8_t state)
  99. {
  100. OS_ERR err;
  101. void * p_msg = NULL;
  102. if(state == SYS_LORA_RX)
  103. {
  104. OSSemPend(&sys_lora_rx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  105. p_msg = OSMemGet(&sys_lora_rx.lora_m, &err);
  106. OSSemPost(&sys_lora_rx.sem, OS_OPT_POST_ALL, &err);
  107. }
  108. else if(state == SYS_LORA_TX)
  109. {
  110. OSSemPend(&sys_lora_tx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  111. p_msg = OSMemGet(&sys_lora_tx.lora_m, &err);
  112. OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  113. }
  114. return p_msg;
  115. }
  116. //释放Lora消息队列
  117. int lora_queue_mem_free(uint8_t state,void * p_msg)
  118. {
  119. OS_ERR err;
  120. if(state == SYS_LORA_RX)
  121. {
  122. OSSemPend(&sys_lora_rx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  123. OSMemPut(&sys_lora_rx.lora_m, p_msg, &err);
  124. OSSemPost(&sys_lora_rx.sem, OS_OPT_POST_ALL, &err);
  125. }
  126. else if(state == SYS_LORA_TX)
  127. {
  128. OSSemPend(&sys_lora_tx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  129. OSMemPut(&sys_lora_tx.lora_m, p_msg, &err);
  130. OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  131. }
  132. return err;
  133. }
  134. //往消息队列内插入数据
  135. void lora_queue_insert(uint8_t state,char *p_msg, uint32_t msg_len)
  136. {
  137. OS_ERR err;
  138. if(state == SYS_LORA_RX)
  139. {
  140. OSSemPend(&sys_lora_rx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  141. OS_QPost(&sys_lora_rx.lora_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  142. OSSemPost(&sys_lora_rx.sem, OS_OPT_POST_ALL, &err);
  143. }
  144. else if(state == SYS_LORA_TX)
  145. {
  146. OSSemPend(&sys_lora_tx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  147. OS_QPost(&sys_lora_tx.lora_q, p_msg, msg_len, OS_OPT_POST_FIFO, 0, &err);
  148. OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  149. }
  150. }
  151. static void SX126xOnTxDone( void )
  152. {
  153. //printf("TxDone\r\n");
  154. Radio.Standby();
  155. lora_state = lora_state_idle;
  156. lora_send_start = 0;
  157. //Radio.Rx( RADIO_RX_TIMEOUT_VALUE );
  158. }
  159. static void SX126xOnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
  160. {
  161. char *p_msg = NULL;
  162. printf_debug(LORA_RCV_DEBUG, "RxDone size:%d <rssi:%d, snr:%d> \r\n",size, rssi, snr);
  163. Radio.Standby();
  164. data_dump_debug(LORA_RCV_DATA_DEBUG, "lora rcv", (uint8_t *)payload, size);
  165. p_msg = lora_queue_mem_calloc_must(SYS_LORA_RX);
  166. if(p_msg)
  167. {
  168. if(size) //和上次数据不同,数据有效
  169. {
  170. memcpy(p_msg, payload, size);
  171. lora_queue_insert(SYS_LORA_RX,(char *)p_msg, size);
  172. } else {
  173. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  174. }
  175. }
  176. else
  177. {
  178. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  179. }
  180. lora_state = lora_state_idle;
  181. }
  182. static void SX126xOnCadDone( bool channelActivityDetected )
  183. {
  184. lora_cad_start = 0;
  185. Radio.Standby();
  186. printf("cadDone %d\r\n", channelActivityDetected);
  187. if(channelActivityDetected) {
  188. channel_free = false;
  189. LORA_DEBUG_F("SX126xOnCadDone CAD占用\r\n");
  190. if(device_fixed_info.Work_State==DEV_WORK_STATE_UPDATING)//升级模式
  191. {
  192. if(ota_state.update_mode == OTA_WORK_STATE_SLAVE && ota_state.update_state_slave == OTA_WORK_STATE_RETRANSMIT)
  193. {
  194. //升级重传时,cad占用延时700ms
  195. ota_timer_retransmit_require_slave_set(OPEN,RETRANSMIT_DELAY_TIMEOUT_MAX);//打开重传延时定时器
  196. lora_queue_delete(SYS_LORA_TX);//清空发送消息队列
  197. }
  198. if(ota_state.update_mode == OTA_WORK_STATE_UPLOAD)//上报升级状态
  199. {
  200. ota_timer_upload_cad_slave_set(OPEN,SLAVE_CAD_TIME_MAX);
  201. lora_queue_delete(SYS_LORA_TX);//清空发送消息队列
  202. }
  203. }
  204. // lora_state = lora_state_cadDone;
  205. } else {
  206. channel_free = true;
  207. LORA_DEBUG_F("SX126xOnCadDone CAD空闲\r\n");
  208. }
  209. lora_state = lora_state_cadDone;
  210. return ;
  211. }
  212. //static void SX126xOnCadTimeout( void )
  213. //{
  214. // Radio.Standby();
  215. // //Radio.Rx(LORA_RX_TIMEOUT_VALUE);
  216. // channel_free = false;
  217. // LORA_DEBUG_F("SX126xOnCadTimeout CAD超时\r\n");
  218. // lora_state = lora_state_cadTimeout;
  219. //}
  220. static void SX126xOnTxTimeout( void )
  221. {
  222. printf("TxTimeout\r\n");
  223. Radio.Standby();
  224. lora_state = lora_state_idle;
  225. }
  226. static void SX126xOnRxTimeout( void )
  227. {
  228. printf("RxTimeout retry recive\r\n");
  229. Radio.Standby();
  230. //Radio.Rx( LORA_RX_TIMEOUT_VALUE );
  231. lora_state = lora_state_idle;
  232. }
  233. static void SX126xOnRxError( void )
  234. {
  235. printf("RxError retry recive\r\n");
  236. Radio.Standby();
  237. //Radio.Rx(LORA_RX_TIMEOUT_VALUE);
  238. lora_state = lora_state_idle;
  239. }
  240. //lora发送函数
  241. void lora_send(char *tx_data, uint32_t tx_len)
  242. {
  243. char *p_msg = NULL;
  244. p_msg = (char *)lora_queue_mem_calloc_must(SYS_LORA_TX);
  245. if(p_msg) {
  246. memcpy(p_msg, tx_data, tx_len);
  247. lora_queue_insert(SYS_LORA_TX,(char *)p_msg, tx_len);
  248. }
  249. else
  250. {
  251. lora_queue_mem_free(SYS_LORA_TX,p_msg);
  252. }
  253. }
  254. //Lora接收队列处理
  255. void lora_queue_proc_rx(void)
  256. {
  257. OS_ERR err;
  258. OS_MSG_SIZE msg_len;
  259. collect_gateway_msg_format_t *p_msg = NULL;
  260. uint16_t p_crc, crc;
  261. transparent_info_t *p_tax = NULL;
  262. OSSemPend(&sys_lora_rx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  263. p_msg = (collect_gateway_msg_format_t *)OSQPend(&sys_lora_rx.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  264. OSSemPost(&sys_lora_rx.sem, OS_OPT_POST_ALL, &err);
  265. if(p_msg&&msg_len)
  266. {
  267. if(p_msg->frame_header!=0xfefe)//帧头错误
  268. {
  269. // printf("p_msg->header:%04x\n",p_msg->frame_header);
  270. printf("header error\n");
  271. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  272. return;
  273. }
  274. if(p_msg->msg_len+FRAME_HEADER_LEN > msg_len)//命令的数据长度大于实际长度
  275. {
  276. printf("datalen err\n");
  277. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  278. return;
  279. }
  280. //crc 校验
  281. p_crc = *(uint16_t*)&p_msg->info[p_msg->msg_len-2];
  282. crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2);
  283. if(device_fixed_info.Work_State != DEV_WORK_STATE_PT)
  284. {
  285. if(p_msg->proto_Ver == PROTOCOL_VERSION)//协议1
  286. {
  287. if((p_msg->first_type&0xF0) == 0x50) //业务数据命令
  288. {
  289. if(p_crc != crc)
  290. {
  291. printf("crc err\n");
  292. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  293. return;
  294. }
  295. if(device_fixed_info.Work_State == DEV_WORK_STATE_NORMAL)
  296. {
  297. gateway_coll_ctrl_comm(p_msg);
  298. }
  299. }
  300. else if((p_msg->first_type&0xF0) == 0x10) //升级下发命令
  301. {
  302. lora_timeout_start();//Lora初始超时定时时间
  303. if((ota_state.update_mode != OTA_WORK_STATE_MASTER) && (device_fixed_info.Work_State != DEV_WORK_STATE_XSP_UPDATING)) //从设备处理升级下发指令,主设备不处理
  304. gateway_lora_ota_proc(p_msg);
  305. }
  306. else if((p_msg->first_type&0xf0) == 0x20)//升级时的主设备
  307. {
  308. lora_timeout_start();//Lora初始超时定时时间
  309. if(device_fixed_info.Work_State == DEV_WORK_STATE_UPDATING && (ota_state.update_mode == OTA_WORK_STATE_MASTER || ota_state.update_mode == OTA_WORK_STATE_ONLOOKER))
  310. {
  311. lora_master_ota_proc(p_msg);
  312. }
  313. }
  314. else if(p_msg->first_type == FIRST_TYPE_SYSTEM)//系统类,透传指令
  315. {
  316. p_tax = (transparent_info_t *)p_msg->info;
  317. if(p_tax->coll_sn == device_info.device_sn)
  318. {
  319. if(p_msg->second_type == SYSTEM_SECOND_TRANS_DOWN)//透传指令
  320. {
  321. printf_debug(MSG_HEARTBEAT_DOWN_TYPE1, "device_sn=%010u<0x%08x>\n",p_tax->coll_sn,p_tax->coll_sn);
  322. printf("first type:%x, second type:%x\n",p_msg->first_type,p_msg->second_type);
  323. //lora接收指示灯
  324. led_start(LORA_RCV_LED);
  325. gateway_coll_transparent_proc(p_msg);
  326. }
  327. }
  328. }
  329. }
  330. else if(p_msg->proto_Ver == PROTOCOL_VERSION_3)//版本3.0
  331. {
  332. if(device_fixed_info.Work_State == DEV_WORK_STATE_NORMAL)
  333. {
  334. coll_rcv_lora_ver3_handle((uint8_t *)p_msg,msg_len);
  335. }
  336. }
  337. else if(p_msg->proto_Ver == PROTOCOL_VERSION_FF)//版本FF
  338. {
  339. if(device_fixed_info.Work_State == DEV_WORK_STATE_NORMAL)
  340. {
  341. coll_rcv_lora_verff_handle((uint8_t *)p_msg,msg_len);
  342. }
  343. }
  344. }
  345. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  346. }
  347. }
  348. //Lora发送队列处理
  349. void lora_queue_proc_tx(void)
  350. {
  351. OS_ERR err;
  352. uint8_t *p_msg;
  353. OS_MSG_SIZE msg_len;
  354. OSSemPend(&sys_lora_tx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  355. p_msg = (uint8_t *)OSQPend(&sys_lora_tx.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  356. // OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  357. if(p_msg&&msg_len)
  358. {
  359. Radio.Send((uint8_t *)p_msg,msg_len);
  360. data_dump_debug(LORA_SEND_DATA_DEBUG, "LORA Tx", (uint8_t *)p_msg, msg_len);
  361. //lora发送指示灯
  362. led_start(LORA_SEND_LED);
  363. lora_timeout_start();//Lora初始超时定时时间
  364. if(device_fixed_info.Work_State==DEV_WORK_STATE_UPDATING)//升级模式
  365. {
  366. if(ota_state.update_mode == OTA_WORK_STATE_SLAVE && ota_state.update_state_slave == OTA_WORK_STATE_RETRANSMIT)
  367. {
  368. //升级重传时
  369. ota_timer_retransmit_require_slave_set(OPEN,RETRANSMIT_DELAY_TIMEOUT_MIN);//打开重传延时定时器
  370. }
  371. if(ota_state.update_mode == OTA_WORK_STATE_UPLOAD)//上报升级状态
  372. {
  373. slave_upload_info.num++;
  374. printf("slave send %d ",slave_upload_info.num);
  375. data_dump("times",(uint8_t *)p_msg,msg_len);
  376. if(slave_upload_info.num<SLAVE_UPLOAD_NUM)//未上报完
  377. {
  378. ota_timer_upload_cad_slave_set(OPEN,SLAVE_CAD_TIME_MIN);
  379. }
  380. else//已上报完
  381. {
  382. slave_upload_end();
  383. }
  384. }
  385. }
  386. OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  387. lora_queue_mem_free(SYS_LORA_TX,p_msg);
  388. }
  389. }
  390. //Lora状态机运行
  391. void lora_task(void)
  392. {
  393. //非空闲时,状态切换打印日志,
  394. if((lora_state_tmp!=lora_state) && (lora_state!=lora_state_idle))
  395. {
  396. tt_lora_state.count = TickCounter;
  397. #ifdef LORA_DEBUG_EN
  398. LORA_DEBUG_F("状态机切换:");
  399. if(lora_state == lora_state_rcvRunning){
  400. LORA_DEBUG("lora_state_rcvRunning\r\n");
  401. }else if(lora_state == lora_state_sendRunning){
  402. LORA_DEBUG("lora_state_sendRunning\r\n");
  403. }else if(lora_state == lora_state_cadRunning){
  404. LORA_DEBUG("lora_state_cadRunning\r\n");
  405. }else if(lora_state == lora_state_cadTimeout){
  406. LORA_DEBUG("lora_state_cadTimeout\r\n");
  407. }else if(lora_state == lora_state_cadDone){
  408. LORA_DEBUG("lora_state_cadDone\r\n");
  409. }else if(lora_state == lora_state_max){
  410. LORA_DEBUG("lora_state_max\r\n");
  411. }else{
  412. LORA_DEBUG("default\r\n");
  413. }
  414. #endif
  415. }
  416. lora_state_tmp = lora_state;
  417. if(timeout_isOut(&tt_lora_state))
  418. {
  419. LORA_DEBUG_F("LoRa状态机长时间未进入【空闲态】,强制清除,避免状态机死机\r\n");
  420. lora_state = lora_state_idle;
  421. }
  422. if(sys_lora_rx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  423. {
  424. lora_queue_proc_rx();
  425. }
  426. switch(lora_state)
  427. {
  428. case lora_state_idle:
  429. Radio.Standby();
  430. //在idle下且发送队列不为空,进入cad模式
  431. if(sys_lora_tx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  432. {
  433. //进入cad模式,尝试发送
  434. LORA_DEBUG_F("进入cad模式,尝试发送\r\n");
  435. Radio.StartCad();
  436. lora_state = lora_state_cadRunning;
  437. RadioEventsObj.fromCadtoRx = false;
  438. }
  439. else
  440. {
  441. //进入接收模式
  442. Radio.Rx(LORA_RX_TIMEOUT_VALUE);
  443. lora_state = lora_state_rcvRunning;
  444. }
  445. RadioEventsObj.lora_header_valid = false;
  446. RadioEventsObj.fromCadtoRx = false;
  447. break;
  448. case lora_state_rcvRunning:
  449. if(RadioEventsObj.fromCadtoRx)
  450. {
  451. if(timeout_isOut(&tt_fromCadtoRx))
  452. {
  453. LORA_DEBUG_F("timeout_isOut(&tt_fromCadtoRx)\r\n");
  454. RadioEventsObj.fromCadtoRx = false;
  455. if(RadioEventsObj.lora_header_valid == false)
  456. {
  457. LORA_DEBUG_F("已从cad模式切入rx模式,但超时未接收到数据,执行发送\r\n");
  458. if(sys_lora_tx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  459. {
  460. lora_queue_proc_tx();
  461. lora_state = lora_state_sendRunning;
  462. }
  463. }
  464. }
  465. }
  466. //虽然在接收模式,但未接收到前导码,认为此时信道为空闲,即可尝试发送(类似强制发送)
  467. else if(RadioEventsObj.lora_header_valid == false)
  468. {
  469. if(sys_lora_tx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  470. {
  471. LORA_DEBUG_F("由Rx模式直接切换到Tx模式\r\n");
  472. lora_queue_proc_tx();
  473. lora_state = lora_state_sendRunning;
  474. }
  475. }
  476. else
  477. {
  478. }
  479. break;
  480. case lora_state_sendRunning:
  481. //在此状态停留一段时间,但主机不占用CPU,在中断里离开此状态
  482. break;
  483. case lora_state_cadRunning:
  484. //在此状态停留一段时间,但主机不占用CPU,在中断里离开此状态
  485. break;
  486. case lora_state_cadTimeout:
  487. //无break;直接进入下个case
  488. case lora_state_cadDone:
  489. if(channel_free)//cad空闲或超时
  490. {
  491. channel_free = false;
  492. if(sys_lora_tx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  493. {
  494. lora_queue_proc_tx();
  495. lora_state = lora_state_sendRunning;
  496. }
  497. }
  498. else//cad占用,进入接收模式
  499. {
  500. Radio.Rx(LORA_RX_TIMEOUT_VALUE);
  501. lora_state = lora_state_rcvRunning;
  502. RadioEventsObj.lora_header_valid = false;
  503. RadioEventsObj.fromCadtoRx = true;
  504. timeout_setValue(&tt_fromCadtoRx,200,1);
  505. }
  506. break;
  507. default:
  508. lora_state = lora_state_idle;
  509. break;
  510. }
  511. Radio.IrqProcess( ); // Process Radio IRQ
  512. }
  513. //Lora队列初始化
  514. void lora_queue_init(void)
  515. {
  516. OS_ERR err;
  517. //lora接收数据消息队列
  518. OSSemCreate(&sys_lora_rx.sem, "lora_sem_rx", 1, &err);//创建信号量
  519. OSQCreate(&sys_lora_rx.lora_q, "lora_queue_rx", 8, &err);//创建网络消息处理队列
  520. OSMemCreate(&sys_lora_rx.lora_m, "lora_memory_rx", sys_lora_rx.memory, 8, 256, &err);//创建内存管理池
  521. //lora发送数据消息队列
  522. OSSemCreate(&sys_lora_tx.sem, "lora_sem_tx", 1, &err);//创建信号量
  523. OSQCreate(&sys_lora_tx.lora_q, "lora_queue_tx", 8, &err);//创建网络消息处理队列
  524. OSMemCreate(&sys_lora_tx.lora_m, "lora_memory_tx", sys_lora_tx.memory, 8, 256, &err);//创建内存管理池
  525. }
  526. //获取Lora参数
  527. void get_lora_para(uint8_t index)
  528. {
  529. LORA_FRE = lora_para_fixed[index].lora_fre;
  530. LORA_TX_OUTPUT_POWER = lora_para_fixed[index].lora_tx_output_power;
  531. LORA_BANDWIDTH = lora_para_fixed[index].lora_bandwidth;
  532. LORA_SPREADING_FACTOR = lora_para_fixed[index].lora_spreading_factor;
  533. LORA_CODINGRATE = lora_para_fixed[index].lora_codingrate;
  534. LORA_PREAMBLE_LENGTH = lora_para_fixed[index].lora_preamble_length;
  535. }
  536. void lora_init(void)
  537. {
  538. RadioEventsObj.TxDone = SX126xOnTxDone;
  539. RadioEventsObj.RxDone = SX126xOnRxDone;
  540. RadioEventsObj.TxTimeout = SX126xOnTxTimeout;
  541. RadioEventsObj.RxTimeout = SX126xOnRxTimeout;
  542. RadioEventsObj.RxError = SX126xOnRxError;
  543. RadioEventsObj.CadDone = SX126xOnCadDone;
  544. lora_encrypt_power_init(LORA_PWR);//lora掉电再上电
  545. get_lora_para(lora_para_choice);//获取Lora参数
  546. Radio.Init( &RadioEventsObj );
  547. Radio.SetChannel(LORA_FRE);
  548. Radio.SetTxConfig( MODEM_LORA, LORA_TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
  549. LORA_SPREADING_FACTOR, LORA_CODINGRATE,
  550. LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
  551. true, 0, 0, LORA_IQ_INVERSION_ON, 1000 );//参数:lora模式,发射功率,fsk用的lora设置为0就可以,带宽,纠错编码率,前导码长度,固定长度数据包(一般是不固定的所以选false),crc校验,0表示关闭跳频,跳频之间的符号数(关闭跳频这个参数没有意义),这个应该是表示是否要翻转中断电平的,超时时间
  552. Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
  553. LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
  554. LORA_SX126X_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
  555. 0, true, 0, 0, LORA_IQ_INVERSION_ON, false );
  556. /***************************************************************/
  557. SX126xConfigureCad( CAD_SYMBOL_NUM,
  558. CAD_DET_PEAK,CAD_DET_MIN,
  559. CAD_TIMEOUT_MS); // Configure the CAD
  560. // Radio.StartCad(); // do the config and lunch first CAD
  561. /***************************************************************/
  562. Radio.Rx( LORA_RX_TIMEOUT_VALUE );
  563. lora_state = lora_state_rcv;
  564. }
  565. //清空消息队列
  566. void lora_queue_delete(uint8_t state)
  567. {
  568. OS_ERR err;
  569. uint8_t *p_msg;
  570. OS_MSG_SIZE msg_len;
  571. if(state == SYS_LORA_RX)
  572. {
  573. while(sys_lora_rx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  574. {
  575. OSSemPend(&sys_lora_rx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  576. p_msg = (uint8_t *)OSQPend(&sys_lora_rx.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  577. OSSemPost(&sys_lora_rx.sem, OS_OPT_POST_ALL, &err);
  578. if(p_msg&&msg_len)
  579. {
  580. lora_queue_mem_free(SYS_LORA_RX,p_msg);
  581. }
  582. }
  583. }
  584. else if(state == SYS_LORA_TX)
  585. {
  586. while(sys_lora_tx.lora_q.MsgQ.NbrEntries)//当前队列中的消息数。
  587. {
  588. OSSemPend(&sys_lora_tx.sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
  589. p_msg = (uint8_t *)OSQPend(&sys_lora_tx.lora_q, 0, OS_OPT_PEND_NON_BLOCKING, &msg_len, NULL, &err); /* blocking. */
  590. OSSemPost(&sys_lora_tx.sem, OS_OPT_POST_ALL, &err);
  591. if(p_msg&&msg_len)
  592. {
  593. lora_queue_mem_free(SYS_LORA_TX,p_msg);
  594. }
  595. }
  596. }
  597. }