sx1276_api.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include "sx1276_api.h"
  4. #include "sx1276-Hal.h"
  5. #include "sx1276.h"
  6. #include "sx1276-LoRaMisc.h"
  7. #include "sx1276-LoRa.h"
  8. #include "radio.h"
  9. #include "systick.h"
  10. #include "queue.h"
  11. #include "usart.h"
  12. #include "led.h"
  13. sequeue_t *lora_tx_sq;
  14. uint32_t LoRa_SendTimeCouter;
  15. /************************************************
  16. 函数名称 : 应用层函数,SX1276_Send_Data
  17. 功 能 : Lora发送 阻塞函数,自动计算发送超时时间
  18. 参 数 : buffer 发送缓存区,
  19. bufferLen 发送数据长度,最长不能超过128个字节
  20. 返 回 值 : 返回1发送成功,其他值发送失败
  21. 作 者 : sun
  22. *************************************************/
  23. uint8_t SX1276_Send_Data(uint8_t * buffer,uint16_t bufferLen )
  24. {
  25. uint32_t result = 0;
  26. uint32_t Timeout = 0;
  27. Timeout = SX1276GetLoraTimeOnAir(bufferLen);
  28. Timeout = 2*Timeout;
  29. SX1276LoRaSetTxPacketTimeout( Timeout );
  30. if(bufferLen > 255)
  31. {
  32. //SX1276LoRaSetPayloadLength(128);
  33. //SX1276SetTxPacket( buffer, 128 ); //开始发送
  34. return 0;
  35. }
  36. else
  37. {
  38. start_led(1,bufferLen,99,30*10);//(led,delay*0.1ms,duty,period*0.1ms)
  39. //LED1=!LED1;
  40. SX1276LoRaSetPayloadLength(bufferLen);
  41. SX1276SetTxPacket( buffer, bufferLen ); //开始发送
  42. }
  43. while( 1 )
  44. {
  45. //start_led(1,3*10,90,100*10);//(led,delay*0.1ms,duty,period*0.1ms)
  46. //LED3=!LED3;
  47. result = SX1276Process( );
  48. if( result == RF_TX_DONE || result == RF_TX_TIMEOUT )
  49. {
  50. break;
  51. }
  52. }
  53. //start_led(1,0,90,100*10);//(led,delay*0.1ms,duty,period*0.1ms)
  54. if( result == RF_TX_DONE )
  55. {
  56. return 1;
  57. }
  58. return 0;
  59. }
  60. /************************************************
  61. 函数名称 : SX1276_Read_Data LoRa单次接函数
  62. 功 能 : 单信道接收,阻塞函数,接收指定敷在长度的数据,用于发送完成后开启短暂接收窗
  63. 参 数 : Buffer 接收到的数据
  64. timeout 接收超时时间
  65. snr 信噪比 输出接收当前包的信噪比
  66. rssi 信号强度 输出接收当前包的信噪比
  67. 返 回 值 : 接收到数据返回数据长度 失败返回-1
  68. 作 者 : sun
  69. *************************************************/
  70. int16_t SX1276_Read_Data( void *Buffer ,uint32_t Timeout, int8_t *snr,double *rssi )
  71. {
  72. uint32_t result;
  73. uint16_t bufferLen = 0;
  74. SX1276LoRaSetRxSingleOn( 1 );
  75. SX1276LoRaSetRxPacketTimeout( Timeout );
  76. SX1276StartRx( );
  77. while( 1 )
  78. {
  79. result = SX1276Process( );
  80. if( result == RF_RX_DONE || result == RF_RX_TIMEOUT )
  81. break;
  82. }
  83. if( result == RF_RX_DONE )
  84. {
  85. SX1276GetRxPacket( Buffer, ( uint16_t* )&bufferLen );
  86. *snr = SX1276LoRaGetPacketSnr( );
  87. //*rssi = ( int16_t )( SX1276LoRaGetPacketRssi( ) + 0.5 );
  88. //*rssi = SX1276LoRaReadRssi();
  89. *rssi = SX1276LoRaGetPacketRssi();
  90. return bufferLen;
  91. }
  92. return -1;
  93. }
  94. /************************************************
  95. 函数名称 : 应用层函数,SX1276_Send_Data_Listen_Ch
  96. 功 能 : Lora发送 阻塞函数,自动计算发送超时时间,并且在发送时进行CAD监听。
  97. 参 数 : buffer 发送缓存区,
  98. bufferLen 发送数据长度
  99. ldelay_ms,两次发送等待时间 单位ms
  100. 返 回 值 : 返回1发送成功,其他值发送失败
  101. 作 者 : sun
  102. *************************************************/
  103. uint8_t SX1276_Send_Data_Listen_Ch(uint8_t * buffer,uint16_t bufferLen,uint32_t ldelay_ms,uint8_t num)
  104. {
  105. uint32_t result = RF_IDLE;
  106. uint8_t send_r = 0;
  107. uint8_t temp = num ;
  108. while(temp--)
  109. {
  110. SX1276StartCad( );
  111. while( 1 )
  112. {
  113. result = SX1276Process( );
  114. if( result == RF_CHANNEL_ACTIVITY_DETECTED)
  115. {
  116. printf("RF_CHANNEL_ACTIVITY_DETECTED,temp=%d\r\n",temp);
  117. delay_ms(ldelay_ms);
  118. //delay_ms(10);
  119. //延时
  120. //goto cad_start;
  121. break;
  122. }
  123. else if( result == RF_CHANNEL_EMPTY)
  124. {
  125. //goto send_start; //信道时空的开始发送
  126. send_r = SX1276_Send_Data(buffer,bufferLen);
  127. if(send_r > 0)
  128. {
  129. return 1;
  130. }
  131. else
  132. {
  133. return 0;
  134. }
  135. }
  136. }
  137. if(temp == 0)
  138. {
  139. return 0; //信道一直忙,发送失败
  140. }
  141. }
  142. return 0;
  143. }
  144. /************************************************
  145. 函数名称 : 应用层函数,SX1276IsLoraChannelFree
  146. 功 能 : 判断环境RSSI,可用于检测信道是否忙,请自行测试界限值,一般无线都用此方法判断。
  147. 参 数 : int16_t rssiThresh 信道忙与不忙的界线值
  148. 返 回 值 : 返回1信道忙,信道不忙,
  149. 作 者 : sun
  150. *************************************************/
  151. bool SX1276IsLoraChannelFree( int16_t rssiThresh )
  152. {
  153. return rssiThresh > SX1276LoRaReadRssi() ? 0:1;
  154. }
  155. /************************************************
  156. 函数名称 : 应用层函数,SX1276_Sleep
  157. 功 能 : LoRa休眠函数 LoRa休眠后功耗 < 1uA,可直接调用收发函数唤醒
  158. 参 数 :
  159. 返 回 值 :
  160. 作 者 : sun
  161. *************************************************/
  162. void SX1276_Sleep(void)
  163. {
  164. SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
  165. }
  166. /************************************************
  167. 函数名称 : 应用层函数,SX1276_Cad_Listen
  168. 功 能 : CAD模式
  169. 参 数 :
  170. 返 回 值 : 1,监测到有效前导码,0无检测
  171. 作 者 : sun
  172. *************************************************/
  173. uint8_t SX1276_Cad_Listen(void)
  174. {
  175. uint32_t result =0 ;
  176. SX1276StartCad( );
  177. while( 1 )
  178. {
  179. result = SX1276Process( );
  180. if( result == RF_CHANNEL_ACTIVITY_DETECTED || result == RF_CHANNEL_EMPTY )
  181. break;
  182. }
  183. if( result == RF_CHANNEL_ACTIVITY_DETECTED )
  184. {
  185. return 1;
  186. }
  187. else
  188. {
  189. return 0;
  190. }
  191. }
  192. /************************************************
  193. 函数名称 : 应用层函数,SX1276_CAD_Task
  194. 功 能 : MCU唤醒后执行此代码可CAD检测接收数据
  195. 参 数 : Buffer 数据缓存区,Timeout 超时时间单位ms
  196. 返 回 值 : 没有接受到数据返回0,接收到数据返回数据长度
  197. 作 者 : sun
  198. *************************************************/
  199. uint16_t SX1276_CAD_Task( void *Buffer ,uint32_t Timeout,int8_t *snr,int16_t *rssi )
  200. {
  201. uint32_t result = RF_IDLE;
  202. uint16_t len =0 ;
  203. SX1276LoRaSetRxPacketTimeout( Timeout );
  204. SX1276StartCad( );
  205. while( 1 )
  206. {
  207. result = SX1276Process( );
  208. if( result == RF_CHANNEL_ACTIVITY_DETECTED || result == RF_CHANNEL_EMPTY )
  209. break;
  210. }
  211. if( result == RF_CHANNEL_ACTIVITY_DETECTED )
  212. {
  213. while( 1 )
  214. {
  215. result = SX1276Process( );
  216. if( result == RF_RX_DONE || result == RF_RX_TIMEOUT|| result == RF_RX_ID_ERROR )
  217. break;
  218. }
  219. if( result == RF_RX_DONE )
  220. {
  221. SX1276GetRxPacket( Buffer, ( uint16_t* )&len );
  222. *rssi = ( int16_t )( SX1276LoRaGetPacketRssi( ) + 0.5 );
  223. *snr = SX1276LoRaGetPacketSnr( );
  224. }
  225. }
  226. return len;
  227. }
  228. /************************************************
  229. 函数名称 : 应用层函数,SX1276_Send_Data_Sp
  230. 功 能 : Lora发送 非阻塞函数,自动计算发送超时时间,不判断是否发送成功,请在程序里自行判断。
  231. 参 数 : buffer 发送缓存区,
  232. bufferLen 发送数据长度
  233. 返 回 值 : 空
  234. 作 者 : sun
  235. *************************************************/
  236. void SX1276_Send_Data_Sp(uint8_t * buffer,uint16_t bufferLen )
  237. {
  238. uint32_t Timeout = 0;
  239. Timeout = SX1276GetLoraTimeOnAir(bufferLen);
  240. Timeout = 2*Timeout;
  241. SX1276LoRaSetTxPacketTimeout( Timeout );
  242. if(bufferLen > 128)
  243. {
  244. SX1276SetTxPacket( buffer, 128 ); //开始发送
  245. }
  246. else
  247. {
  248. SX1276LoRaSetPayloadLength(bufferLen);
  249. SX1276SetTxPacket( buffer, bufferLen ); //开始发送
  250. }
  251. }
  252. /************************************************
  253. 函数名称 : SX1276_Read_Data LoRa单次接函数
  254. 功 能 : 单信道接收,阻塞函数,接收指定敷在长度的数据,用于发送完成后开启短暂接收窗
  255. 参 数 : Buffer 接收到的数据
  256. timeout 接收超时时间
  257. snr 信噪比 输出接收当前包的信噪比
  258. rssi 信号强度 输出接收当前包的信噪比
  259. 返 回 值 : 接收到数据返回数据长度 失败返回-1
  260. 作 者 : sun
  261. *************************************************/
  262. void SX1276_Read_Data_Sp(uint32_t Timeout)
  263. {
  264. //SX1276LoRaSetRxSingleOn( 1 );
  265. SX1276LoRaSetRxPacketTimeout( Timeout );
  266. SX1276StartRx( );
  267. }
  268. /************************************************
  269. 函数名称 : SX1276_CAD_Start
  270. 功 能 : 启动CAD功能,请在程序中判断CAD结果,防止阻塞
  271. 作 者 : sun
  272. *************************************************/
  273. void SX1276_CAD_Start( void )
  274. {
  275. SX1276StartCad( );
  276. }
  277. /************************************************
  278. 创建队列
  279. *************************************************/
  280. sequeue_t *SX1276_Send_sq_init(void)
  281. {
  282. lora_tx_sq = Create_Empty_Sequeue(8,128);
  283. DEBUG1("lora_tx_sq: SQ=0x%08x,depth=%d,width=%d\r\n",(uint32_t)lora_tx_sq,lora_tx_sq->depth,lora_tx_sq->width);
  284. return lora_tx_sq;
  285. }
  286. /************************************************
  287. 发送,队列不为空时
  288. *************************************************/
  289. uint8_t SX1276_Send_sq(uint32_t ldelay_ms,uint8_t num)
  290. {
  291. uint8_t buffer[128];
  292. uint8_t bufferLen;
  293. static uint32_t loraSendCnt = 0;
  294. //DEBUG1("SX1276_Send_sq...\r\n");
  295. if(!Check_Seqeue_Empty(lora_tx_sq))
  296. {
  297. //SX1276_API_DEBUG("Seqeue is not Empty\r\n");
  298. delay_ms(10);
  299. bufferLen = 0;
  300. memset(buffer,0,sizeof(buffer));
  301. De_Queue(lora_tx_sq,buffer,sizeof(buffer),&bufferLen);
  302. SX1276_Send_Data_Listen_Ch(buffer,bufferLen,ldelay_ms,num);
  303. SX1276_API_DEBUG("loraSendCnt=%d\r\n",loraSendCnt++);
  304. LoRa_SendTimeCouter = TickCounter;
  305. }
  306. return 1;
  307. }