LoraComm.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /**
  2. ******************************** STM32F0xx *********************************
  3. * @文件名 : LoraComm.c
  4. * @作者 : sun
  5. * @库版本 : V1.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年06月04日
  8. * @摘要 : LoraComm源文件
  9. ******************************************************************************/
  10. #include "LoraComm.h"
  11. #include "radio.h"
  12. #include "stdio.h"
  13. #include "usart.h"
  14. #include "sx1276-Hal.h"
  15. #include "sx1276.h"
  16. //#include "debug.h"
  17. #include "sx1276-LoRaMisc.h"
  18. #include "sx1276-LoRa.h"
  19. #define LENGTH_OF_DAT_PAYLOAD 25
  20. /************************************************
  21. 函数名称 : 应用层函数,Lora接收初始化函数
  22. 功 能 : Lora接收初始化函数
  23. 参 数 : SingleMode 单次接收还是循环接收,1为单次接收,0为循环接收,
  24. RF_Frequency 接收频率参数
  25. Timeout 超时时间
  26. 返 回 值 : 无
  27. 作 者 : sun
  28. *************************************************/
  29. void LoraReadInit(uint8_t SingleMode,uint32_t RF_Frequency,uint32_t Timeout, uint16_t preamble )
  30. {
  31. Radio->LoRaSetRxSingleOn( SingleMode );
  32. Radio->LoRaSetRFFrequency( RF_Frequency );
  33. Radio->LoRaSetPreambleLength( preamble );
  34. Radio->LoRaSetRxPacketTimeout( Timeout );
  35. Radio->StartRx( );
  36. }
  37. /************************************************
  38. 函数名称 : 应用层函数,LoraWrite
  39. 功 能 : Lora发送 阻塞函数
  40. 参 数 : buffer 发送缓存区,
  41. bufferLen 发送数据长度
  42. RF_Frequency 接收频率
  43. 返 回 值 : 无
  44. 作 者 : sun
  45. *************************************************/
  46. uint8_t LoraWrite(uint8_t * buffer,uint16_t bufferLen,uint32_t RF_Frequency,uint16_t preamble,uint32_t Timeout )
  47. {
  48. uint32_t result = 0;
  49. Radio->LoRaSetRFFrequency( RF_Frequency ); //设置发射频率 参数来自宏定义
  50. Radio->LoRaSetPreambleLength( preamble );
  51. Radio->LoRaSetTxPacketTimeout( Timeout );
  52. if(bufferLen > MAXLOADLEN)
  53. {
  54. Radio->SetTxPacket( buffer, MAXLOADLEN ); //开始发送
  55. }
  56. else
  57. {
  58. Radio->LoRaSetPayloadLength(bufferLen);
  59. Radio->SetTxPacket( buffer, bufferLen ); //开始发送
  60. }
  61. while( 1 )
  62. {
  63. result = Radio->Process( );
  64. if( result == RF_TX_DONE || result == RF_TX_TIMEOUT )
  65. break;
  66. }
  67. if( result == RF_TX_DONE )
  68. {
  69. return 1;
  70. }
  71. return 0;
  72. }
  73. /************************************************
  74. 函数名称 : ReceiverProcess
  75. 功 能 : 单信道接收,阻塞函数,接收指定敷在长度的数据
  76. 参 数 : preamble 前导码长度
  77. timeout 接收超时时间
  78. snr 信噪比
  79. rssi 信号强度
  80. 返 回 值 : 接收到数据返回数据长度 失败返回-1
  81. 作 者 : sun
  82. *************************************************/
  83. int16_t LoraSpecialRead( void *Buffer ,uint16_t PreambleLength,uint32_t Timeout, int8_t *snr,int16_t *rssi )
  84. {
  85. uint32_t result;
  86. uint16_t bufferLen = 0;
  87. Radio->LoRaSetRxSingleOn( 0 );
  88. Radio->LoRaSetRFFrequency( UPLINK_FREQUENCY );
  89. Radio->LoRaSetRxPacketTimeout( Timeout );
  90. Radio->LoRaSetPreambleLength( PreambleLength );
  91. Radio->LoRaSetPayloadLength( LENGTH_OF_DAT_PAYLOAD );
  92. Radio->StartRx( );
  93. while( 1 )
  94. {
  95. result = Radio->Process( );
  96. if( result == RF_RX_DONE || result == RF_RX_TIMEOUT )
  97. break;
  98. }
  99. if( result == RF_RX_DONE )
  100. {
  101. Radio->GetRxPacket( Buffer, ( uint16_t* )&bufferLen );
  102. *rssi = ( int16_t )( SX1276LoRaGetPacketRssi( ) + 0.5 );
  103. *snr = SX1276LoRaGetPacketSnr( );
  104. return bufferLen;
  105. }
  106. return -1;
  107. }
  108. /************************************************
  109. 函数名称 : 应用层函数,LoraSpecialWrite
  110. 功 能 : Lora发送 把查询发送完成 请在程序里查询 防止阻塞
  111. 参 数 : buffer 发送缓存区,
  112. bufferLen 发送数据长度
  113. RF_Frequency 接收频率
  114. 返 回 值 : 无
  115. 作 者 : sun
  116. *************************************************/
  117. void LoraSpecialWrite(uint8_t * buffer,uint16_t bufferLen,uint32_t RF_Frequency,uint16_t preamble,uint32_t Timeout )
  118. {
  119. Radio->LoRaSetRFFrequency( RF_Frequency ); //设置发射频率 参数来自宏定义
  120. Radio->LoRaSetPreambleLength( preamble );
  121. Radio->LoRaSetTxPacketTimeout( Timeout );
  122. if(bufferLen > MAXLOADLEN)
  123. {
  124. Radio->SetTxPacket( buffer, MAXLOADLEN ); //开始发送
  125. }
  126. else
  127. {
  128. Radio->LoRaSetPayloadLength(bufferLen);
  129. Radio->SetTxPacket( buffer, bufferLen ); //开始发送
  130. }
  131. }