Comunicação sem fio com NRF24LE1 (Parte 13/14)

Comunicação sem fio com NRF24LE1 (Parte 13/14)

A invenção de rádio revolucionou o mundo. Foi uma ferramenta de sucesso para comunicar informações por meio de comunicação sem fio. Outra grande invenção foi o telefone. Você se lembra daqueles dias em que usávamos aqueles telefones fixos volumosos? Agora a era mudou. Os telefones fixos estão sendo substituídos pelos telefones celulares.
Temos que aceitar o fato de que a comunicação sem fio se tornou uma parte essencial da nossa vida. Se olharmos ao nosso redor, encontraremos muitos dispositivos que funcionam em comunicação sem fio, como mouse, teclado, teclas de fechadura, rádio, telefone sem fio e muito mais. Além disso, a comunicação sem fio às vezes é chamada de comunicação por radiofrequência (RF).
Protótipo de dispositivo de comunicação sem fio baseado em NRF24LE1
Fig. 1: Protótipo de dispositivo de comunicação sem fio baseado em NRF24LE1
Por que estamos apaixonado por comunicação sem fio? As respostas são óbvias. Primeiro, queremos nos livrar dos fios que ficam ao nosso redor e nos causam irritação. Em segundo lugar, queremos acesso remoto à informação. Estas são as razões que aumentaram a demanda pela comunicação sem fio. Não está longe o tempo em que a comunicação com fio se tornará obsoleta.
Este artigo é dedicado ao estabelecimento de comunicação sem fio entre dois módulos NRF. Começaremos com o código básico para transmitir um valor de 8 bits sem fio.
Vamos revisar algumas especificações sobre o transceptor RF usado no NRF24LE1.
Em primeiro lugar, funciona na frequência de 2,4 GHz, que se encontra na banda ISM de utilização gratuita para fins industriais, científicos e médicos. Além disso, usa modulação GMSK.
Em segundo lugar, a NRF funciona com taxas de dados de 250 Kbps, 1Mbps ou 2Mbps. Além disso, o NRF24LE1 é totalmente compatível com outras séries NRF24LXX. Estaremos usando nrfsdk (kit de desenvolvimento de software) fornecido pela Nordic Semiconductors Ltd.
Observação: consulte nossos artigos anteriores sobre este módulo para obter mais compreensão.
Discutiremos agora algumas funções integradas fornecidas pelo nrfsdk:
• hal_nrf_set_operation_mode – Esta função é usada para selecionar o modo TX ou RX
• hal_nrf_set_rx_payload_width – Para definir a largura da carga útil a ser recebida
• hal_nrf_set_power_mode – Esta função é usada para ligar o RF.
• hal_nrf_write_tx_payload – Esta função recebe dados de carga útil para serem transmitidos.
• CE_PULSE – Esta função inicia a transmissão
• CE_HIGH – Para habilitar o receptor
• hal_nrf_get_clear_irq_flags : Esta função lê e limpa flags de interrupção relacionados ao rádio.
• hal_nrf_rx_fifo_empty : Para verificar se o buffer Rx está vazio ou não.
• hal_nrf_flush_tx : Para liberar o buffer Tx FIFO
Imagem do dispositivo de comunicação sem fio baseado em NRF24LE1
Fig. 2: Imagem do dispositivo de comunicação sem fio baseado em NRF24LE1
A descrição de várias funções é:
Tabela listando várias funções do NRF24LE1
Fig. 3: Tabela listando várias funções do NRF24LE1
Essas funções foram usadas no código. O código é comentado para maior compreensão. Por favor, compartilhe seus comentários na seção de comentários abaixo.

Código-fonte do projeto

###

//Program to 



//Program to Rx

/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.

 *

 * The information contained herein is confidential property of Nordic

 * Semiconductor ASA.Terms and conditions of usage are described in detail

 * in NORDIC SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.

 *

 * Licensees are granted free, non-transferable use of the information. NO

 * WARRENTY of ANY KIND is provided. This heading must NOT be removed from

 * the file.

 *

 * $LastChangedRevision: 2211 $

 */


/** @file

 * @brief Enhanced ShockBurst Primary Receiver example

 * @defgroup esb_prx_example Enhanced ShockBurst Primary Receiver (PRX) example

 * @{

 * @ingroup nrf_examples

 *

 * @brief This example monitors for data and writes the first byte (byte 0) of the

 * received payloads to P0.

 *

 * The example shows the minimum required setup for receiving packets from a

 * primary transmitter (PTX) device.

 *

 * The following default radio parameters are being used:

 * - RF channel 2

 * - 2 Mbps data rate

 * - RX address 0xE7E7E7E7E7 (pipe 0) and 0xC2C2C2C2C2 (pipe 1)

 * - 1 byte CRC

 *

 * The project @ref esb_ptx_example can be used as a counterpart for transmitting the data.

 *

*/



#include "nrf24le1.h" // I/O header file for NRF24LE1

#include "hal_clk.h"  // library containing clock functions


#include  // standard integers library

#include "hal_nrf.h" // library containing wireless communication functions


// Global variables

uint8_t payload(3); // payload to be received


// main function

void main 

{


#ifdef MCU_NRF24LE1

  while(hal_clk_get_16m_source  != HAL_CLK_XOSC16M)

  {

    // Wait until 16 MHz crystal oscillator is running

  }

#endif


  #ifdef MCU_NRF24LU1P

  // Enable radio SPI

  RFCTL = 0x10;

  #endif


  // Set P0 as output

  P0DIR = 0;


  // Enable the radio clock

  RFCKEN = 1;


  // Enable RF interrupt

  RF = 1;

  // Enable global interrupt

  EA = 1;


  // Configure radio as primary receiver (PTX)

  hal_nrf_set_operation_mode(HAL_NRF_PRX);


  // Set payload width to 3 bytes

  hal_nrf_set_rx_payload_width((int)HAL_NRF_PIPE0, 3);


  // Power up radio

  hal_nrf_set_power_mode(HAL_NRF_PWR_UP);


  // Enable receiver

  CE_HIGH ;


      // infinite loop

  for(;;){}

}


// Radio interrupt

NRF_ISR 

{

  uint8_t irq_flags;


  // Read and clear IRQ flags from radio

  irq_flags = hal_nrf_get_clear_irq_flags ;


  // If data received

  if((irq_flags & (1<<(uint8_t)HAL_NRF_RX_DR)) > 0)

  {

    // Read payload

    while(!hal_nrf_rx_fifo_empty )

    {

      hal_nrf_read_rx_payload(payload);

    }


    // Write received payload(0) to port 0

    P0 = payload(0);

  }

}

/** @} */



//Program to Tx


/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.

 *

 * The information contained herein is property of Nordic Semiconductor ASA.

 * Terms and conditions of usage are described in detail in NORDIC

 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.

 *

 * Licensees are granted free, non-transferable use of the information. NO

 * WARRENTY of ANY KIND is provided. This heading must NOT be removed from

 * the file.

 *

 * $LastChangedRevision: 2513 $

 */

/** @file

 * @brief Enhanced ShockBurst Primary Transmitter example

 * @defgroup esb_ptx_example Enhanced ShockBurst Primary Transmitter (PTX) example

 * @{

 * @ingroup nrf_examples

 *

 * @brief This example sends packets continuously. The contents of P0 are

 * sent in the first payload byte (byte 0).

 *

 * The example shows the minimum required setup for transmitting packets to a

 * primary receiver (PRX) device.

 *

 * The following default radio parameters are being used:

 * - RF channel 2

 * - 2 Mbps data rate

 * - TX address 0xE7E7E7E7E7

 * - 1 byte CRC

 *

 * The project @ref esb_prx_example can be used as a counterpart for receiving the data.

 *

*/



#include "nrf24le1.h" // I/O header file for NRF24LE1

#include "hal_clk.h"  // library containing clock functions


#include  // standard integers library

#include "hal_nrf.h" // library containing wireless communication functions


#include  // standard boolean library


// Global variables

static bool volatile radio_busy;


// main function

void main(void)

{

  uint8_t payload(3); // payload to be transmitted


  #ifdef MCU_NRF24LE1

  while(hal_clk_get_16m_source  != HAL_CLK_XOSC16M)

  {

    // Wait until 16 MHz crystal oscillator is running

  }

  #endif


  #ifdef MCU_NRF24LU1P

  // Enable radio SPI

  RFCTL = 0x10U;

  #endif


  // Enable the radio clock

  RFCKEN = 1U;


  // Enable RF interrupt

  RF = 1U;


  // Enable global interrupt

  EA = 1U;


  // Power up radio

  hal_nrf_set_power_mode(HAL_NRF_PWR_UP);


   // infinite loop

  for(;;)

  {

    // Put P0 contents in payload(0)

    payload(0) = ~P0; // write compliment of Port0


    // Write payload to radio TX FIFO

    hal_nrf_write_tx_payload(payload, 3U);


    // Toggle radio CE signal to start transmission

    CE_PULSE ;


    radio_busy = true;

    // Wait for radio operation to finish

    while (radio_busy)

    {

    }

  }

}


// Radio interrupt

NRF_ISR 

{

  uint8_t irq_flags;


  // Read and clear IRQ flags from radio

  irq_flags = hal_nrf_get_clear_irq_flags ;


  switch(irq_flags)

  {

    // Transmission success

    case (1 << (uint8_t)HAL_NRF_TX_DS):

      radio_busy = false;

      // Data has been sent

      break;

    // Transmission failed (maximum re-transmits)

    case (1 << (uint8_t)HAL_NRF_MAX_RT):

      // When a MAX_RT interrupt occurs the TX payload will not be removed from the TX FIFO.

      // If the packet is to be discarded this must be done manually by flushing the TX FIFO.

      // Alternatively, CE_PULSE  can be called re-starting transmission of the payload.

      // (Will only be possible after the radio irq flags are cleared)

      hal_nrf_flush_tx ;

      radio_busy = false;

      break;

    default:

      break;

  }

}

/** @} */

###

Diagramas de circuito

Diagrama de circuito-NRF24LE1-Dispositivo de comunicação sem fio baseado em

Vídeo do projeto

블로그로 돌아가기

댓글을 남겨주세요

게시하기 전에 댓글의 승인을 받아야 합니다.