O módulo SX1276 aciona a transmissão de mensagens LoRa
- 1. Introdução à Tecnologia de Comunicação de Espectro de Espalhamento Sem Fio LoRa
- 2. Funções importantes envolvidas
-
- 1. RadioInit ( uint32_t freq, int8_t power, uint32_t txTimeout ) função de inicialização de radiofrequência
- 2. uint16_t ReadRadioRxBuffer(uint8_t *payload) Função de recepção de radiofrequência
- 3. Radio.Send (uint8_t *buffer, uint8_t size) função de envio de radiofrequência sem fio
- 4. Escreva as funções OnTxDone(), OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ), OnTxTimeout( void ), OnRxTimeout( void ), OnRxError( void ) para implementar as funções abstratas da estrutura RadioEvents_t
1. Introdução à Tecnologia de Comunicação de Espectro de Espalhamento Sem Fio LoRa
A tecnologia de modulação de rádio de rede de área ampla de baixa potência da Semtech "LoRa®" leva o nome dos links de dados de distância extremamente longa que a tecnologia permite. Os sinais LoRa podem viajar mais de 700 quilômetros. Em geral, no entanto, a comunicação LoRa atinge até 3 milhas ( 5 quilômetros ) em áreas urbanas e 10 milhas ( 15 quilômetros ) em áreas rurais.
O LoRa opera na camada física e permite que os dispositivos convertam dados em sinais de RF para enviar mensagens pelo ar usando comunicações de espectro espalhado chirp e bandas de frequência sub-gigahertz isentas de licença. Uma característica chave das soluções de Internet das Coisas (IoT) para dispositivos construídos com chipsets LoRa são seus requisitos de energia ultrabaixa . Sensores e outros dispositivos construídos com chips LoRa podem durar até 10 anos com uma única bateria.
Por sua vez, o LoRaWAN® está rapidamente se tornando o padrão de fato para implementações de LPWAN. Governado pela LoRa Alliance®, o padrão LoRaWAN é um protocolo de software assíncrono que usa a camada física LoRa . Usando LoRa e LoRaWAN, redes flexíveis de grande escala podem ser realizadas.
2. Funções importantes envolvidas
1. RadioInit ( uint32_t freq, int8_t power, uint32_t txTimeout ) função de inicialização de radiofrequência
void NS_RadioInit( uint32_t freq, int8_t power, uint32_t txTimeout, uint32_t rxTimeout)
{
NS_RadioEventsInit();//无线射频模块注册事件回调函数
NS_RadioSetTxRxConfig( freq, power, txTimeout );
Radio.Rx( rxTimeout );//设置LoRa模块为接收模式,同时设置超时时间,必要步骤
}
A inicialização é dividida em três etapas. A primeira etapa é registrar a função de retorno de chamada de evento para o módulo de rádio sem fio . A segunda etapa é definir a frequência da portadora e a potência de transmissão e inicializar os parâmetros de transmissão e recepção . A terceira etapa é configurar o módulo LoRa para o modo de recepção e tempo limite .
2. uint16_t ReadRadioRxBuffer(uint8_t *payload) Função de recepção de radiofrequência
uint16_t ReadRadioRxBuffer( uint8_t *payload)
{
uint16_t LengthTemp;
LengthTemp = LoRaBufferSize;
if(LengthTemp <= 0)
{
return 0;
}
LoRaBufferSize = 0;
//payload = LoRaBuffer;
memcpy( payload, LoRaBuffer, LengthTemp );
return LengthTemp;
}
As informações recebidas através da tecnologia de radiofrequência sem fio LoRa podem ser armazenadas na variável local do ponteiro de carga útil chamando a função ReadRadioRxBuffer .
3. Radio.Send (uint8_t *buffer, uint8_t size) função de envio de radiofrequência sem fio
void SX1276Send( uint8_t *buffer, uint8_t size )
{
uint32_t txTimeout = 0;
switch( SX1276.Settings.Modem )
{
case MODEM_FSK:
{
SX1276.Settings.FskPacketHandler.NbBytes = 0;
SX1276.Settings.FskPacketHandler.Size = size;
if( SX1276.Settings.Fsk.FixLen == false )
{
SX1276WriteFifo( ( uint8_t* )&size, 1 );
}
else
{
SX1276Write( REG_PAYLOADLENGTH, size );
}
if( ( size > 0 ) && ( size <= 64 ) )
{
SX1276.Settings.FskPacketHandler.ChunkSize = size;
}
else
{
memcpy1( RxTxBuffer, buffer, size );
SX1276.Settings.FskPacketHandler.ChunkSize = 32;
}
// Write payload buffer
SX1276WriteFifo( buffer, SX1276.Settings.FskPacketHandler.ChunkSize );
SX1276.Settings.FskPacketHandler.NbBytes += SX1276.Settings.FskPacketHandler.ChunkSize;
txTimeout = SX1276.Settings.Fsk.TxTimeout;
}
break;
case MODEM_LORA:
{
if( SX1276.Settings.LoRa.IqInverted == true )
{
SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_ON ) );
SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_ON );
}
else
{
SX1276Write( REG_LR_INVERTIQ, ( ( SX1276Read( REG_LR_INVERTIQ ) & RFLR_INVERTIQ_TX_MASK & RFLR_INVERTIQ_RX_MASK ) | RFLR_INVERTIQ_RX_OFF | RFLR_INVERTIQ_TX_OFF ) );
SX1276Write( REG_LR_INVERTIQ2, RFLR_INVERTIQ2_OFF );
}
SX1276.Settings.LoRaPacketHandler.Size = size;
// Initializes the payload size
SX1276Write( REG_LR_PAYLOADLENGTH, size );
// Full buffer used for Tx
SX1276Write( REG_LR_FIFOTXBASEADDR, 0 );
SX1276Write( REG_LR_FIFOADDRPTR, 0 );
// FIFO operations can not take place in Sleep mode
if( ( SX1276Read( REG_OPMODE ) & ~RF_OPMODE_MASK ) == RF_OPMODE_SLEEP )
{
SX1276SetStby( );
DelayMs( 1 );
}
// Write payload buffer
SX1276WriteFifo( buffer, size );
txTimeout = SX1276.Settings.LoRa.TxTimeout;
}
break;
}
SX1276SetTx( txTimeout );
}
No arquivo sx1276-board.c, atribua SX1276Send(uint8_t *buffer, uint8_t size ) para void ( *Send )( uint8_t *buffer, uint8_t size ) na estrutura do Radio ; completando assim a transmissão das informações LoRa.
4. Escreva as funções OnTxDone(), OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ), OnTxTimeout( void ), OnRxTimeout( void ), OnRxError( void ) para implementar as funções abstratas da estrutura RadioEvents_t
void OnTxDone( void )
{
Radio.Sleep( );
Radio.Rx( RX_TIMEOUT_VALUE );
}
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
{
Radio.Sleep( );
LoRaBufferSize = size;
memcpy( LoRaBuffer, payload, LoRaBufferSize );
RssiValue = rssi;
SnrValue = snr;
Radio.Rx( RX_TIMEOUT_VALUE );
}
void OnTxTimeout( void )
{
Radio.Sleep( );
Radio.Rx( RX_TIMEOUT_VALUE );
}
void OnRxTimeout( void )
{
Radio.Sleep( );
Radio.Rx( RX_TIMEOUT_VALUE );
}
void OnRxError( void )
{
Radio.Sleep( );
Radio.Rx( RX_TIMEOUT_VALUE );
}
Implementando a função de envio e recebimento de mensagens LoRa escrevendo funções de retorno de chamada
No experimento LoRa, aprendemos principalmente a aplicar as três funções de RadioInit(), Radio.Send(), ReadRadioRxBuffer() para realizar o experimento de controle do transceptor LoRa. Se você precisar de transmissão de mensagem estável e precisa, você pode adicionar ID de rede, endereço de endereço do dispositivo, verificação de CRC, etc. para encapsulá-lo em uma mensagem de mensagem específica para transmissão, consulte aqui