/** ******************************** STM32F0xx ********************************* * @文件名 : LoraComm.c * @作者 : sun * @库版本 : V1.5.0 * @文件版本 : V1.0.0 * @日期 : 2016年06月04日 * @摘要 : LoraComm源文件 ******************************************************************************/ #include "LoraComm.h" #include "radio.h" #include "stdio.h" #include "usart.h" #include "sx1276-Hal.h" #include "sx1276.h" //#include "debug.h" #include "sx1276-LoRaMisc.h" #include "sx1276-LoRa.h" #define LENGTH_OF_DAT_PAYLOAD 25 /************************************************ 函数名称 : 应用层函数,Lora接收初始化函数 功 能 : Lora接收初始化函数 参 数 : SingleMode 单次接收还是循环接收,1为单次接收,0为循环接收, RF_Frequency 接收频率参数 Timeout 超时时间 返 回 值 : 无 作 者 : sun *************************************************/ void LoraReadInit(uint8_t SingleMode,uint32_t RF_Frequency,uint32_t Timeout, uint16_t preamble ) { Radio->LoRaSetRxSingleOn( SingleMode ); Radio->LoRaSetRFFrequency( RF_Frequency ); Radio->LoRaSetPreambleLength( preamble ); Radio->LoRaSetRxPacketTimeout( Timeout ); Radio->StartRx( ); } /************************************************ 函数名称 : 应用层函数,LoraWrite 功 能 : Lora发送 阻塞函数 参 数 : buffer 发送缓存区, bufferLen 发送数据长度 RF_Frequency 接收频率 返 回 值 : 无 作 者 : sun *************************************************/ uint8_t LoraWrite(uint8_t * buffer,uint16_t bufferLen,uint32_t RF_Frequency,uint16_t preamble,uint32_t Timeout ) { uint32_t result = 0; Radio->LoRaSetRFFrequency( RF_Frequency ); //设置发射频率 参数来自宏定义 Radio->LoRaSetPreambleLength( preamble ); Radio->LoRaSetTxPacketTimeout( Timeout ); if(bufferLen > MAXLOADLEN) { Radio->SetTxPacket( buffer, MAXLOADLEN ); //开始发送 } else { Radio->LoRaSetPayloadLength(bufferLen); Radio->SetTxPacket( buffer, bufferLen ); //开始发送 } while( 1 ) { result = Radio->Process( ); if( result == RF_TX_DONE || result == RF_TX_TIMEOUT ) break; } if( result == RF_TX_DONE ) { return 1; } return 0; } /************************************************ 函数名称 : ReceiverProcess 功 能 : 单信道接收,阻塞函数,接收指定敷在长度的数据 参 数 : preamble 前导码长度 timeout 接收超时时间 snr 信噪比 rssi 信号强度 返 回 值 : 接收到数据返回数据长度 失败返回-1 作 者 : sun *************************************************/ int16_t LoraSpecialRead( void *Buffer ,uint16_t PreambleLength,uint32_t Timeout, int8_t *snr,int16_t *rssi ) { uint32_t result; uint16_t bufferLen = 0; Radio->LoRaSetRxSingleOn( 0 ); Radio->LoRaSetRFFrequency( UPLINK_FREQUENCY ); Radio->LoRaSetRxPacketTimeout( Timeout ); Radio->LoRaSetPreambleLength( PreambleLength ); Radio->LoRaSetPayloadLength( LENGTH_OF_DAT_PAYLOAD ); Radio->StartRx( ); while( 1 ) { result = Radio->Process( ); if( result == RF_RX_DONE || result == RF_RX_TIMEOUT ) break; } if( result == RF_RX_DONE ) { Radio->GetRxPacket( Buffer, ( uint16_t* )&bufferLen ); *rssi = ( int16_t )( SX1276LoRaGetPacketRssi( ) + 0.5 ); *snr = SX1276LoRaGetPacketSnr( ); return bufferLen; } return -1; } /************************************************ 函数名称 : 应用层函数,LoraSpecialWrite 功 能 : Lora发送 把查询发送完成 请在程序里查询 防止阻塞 参 数 : buffer 发送缓存区, bufferLen 发送数据长度 RF_Frequency 接收频率 返 回 值 : 无 作 者 : sun *************************************************/ void LoraSpecialWrite(uint8_t * buffer,uint16_t bufferLen,uint32_t RF_Frequency,uint16_t preamble,uint32_t Timeout ) { Radio->LoRaSetRFFrequency( RF_Frequency ); //设置发射频率 参数来自宏定义 Radio->LoRaSetPreambleLength( preamble ); Radio->LoRaSetTxPacketTimeout( Timeout ); if(bufferLen > MAXLOADLEN) { Radio->SetTxPacket( buffer, MAXLOADLEN ); //开始发送 } else { Radio->LoRaSetPayloadLength(bufferLen); Radio->SetTxPacket( buffer, bufferLen ); //开始发送 } }