sx1276_api.c 7.8 KB

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