[Concorrência da Internet das Coisas - Análise da Função do Driver LoRa]

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

Acho que você gosta

Origin blog.csdn.net/a6662580/article/details/123461009
Recomendado
Clasificación