摘要
使用Arduino IDE将下面的代码烧写到开发板“LGT8F328P-LQFP32 MiniEVB”或“Arduino nano”中,可实现在开发板1的串口输入待发送的数据,两个无线收发模块G01-S之间通讯完成后,开发板2的串口输出接收到的数据。
环境
软件
IDE:Arduino IDE 2.2.1
硬件
两个无线收发模块:G01-S(芯片是Si24R1)
开发板1:Arduino nano(芯片是Atmega168)
开发板2:LGT8F328P-LQFP32 MiniEVB
接线
G01-S的【GDN】引脚接开发板的【GND】
G01-S的【IRQ】引脚接开发板的【D8】
G01-S的【MISO】引脚接开发板的【D12】
G01-S的【MOSI】引脚接开发板的【D11】
G01-S的【SCK】引脚接开发板的【D13】
G01-S的【CSN】引脚接开发板的【D10】
G01-S的【CE】引脚接开发板的【D9】
G01-S的【VDD】引脚接开发板的【3V3】
代码
// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum
/** 发送模式定义 */
enum
{
TX_MODE_1 = 0, //发送模式1,发送固定的字符串
TX_MODE_2 //发送模式2,发送串口接收到的数据
};
typedef enum ModeType
{
MODE_TX = 0,
MODE_RX
}nRf24l01ModeType;
typedef enum SpeedType
{
SPEED_250K = 0,
SPEED_1M,
SPEED_2M
}nRf24l01SpeedType;
typedef enum PowerType
{
POWER_F18DBM = 0,
POWER_F12DBM,
POWER_F6DBM,
POWER_0DBM
}nRf24l01PowerType;
// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum// enum
/** NRF24L01定义 */
//
//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令
#define NRF_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址
#define NRF_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节
#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节
#define FLUSH_TX 0xE1 //清除TX FIFO寄存器,发射模式下使用
#define FLUSH_RX 0xE2 //清除RX FIFO寄存器,接收模式下使用
#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送
#define R_RX_PL_WID 0x60
#define NOP 0xFF //空操作,可以用来读状态寄存器
#define W_ACK_PLOAD 0xA8
#define WR_TX_PLOAD_NACK 0xB0
//SPI(NRF24L01)寄存器地址
#define CONFIG 0x00 //配置寄存器地址,bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define EN_AA 0x01 //使能自动应答功能 bit0~5 对应通道0~5
#define EN_RXADDR 0x02 //接收地址允许 bit0~5 对应通道0~5
#define SETUP_AW 0x03 //设置地址宽度(所有数据通道) bit0~1: 00,3字节 01,4字节, 02,5字节
#define SETUP_RETR 0x04 //建立自动重发;bit0~3:自动重发计数器;bit4~7:自动重发延时 250*x+86us
#define RF_CH 0x05 //RF通道,bit0~6工作通道频率
#define RF_SETUP 0x06 //RF寄存器,bit3:传输速率( 0:1M 1:2M);bit1~2:发射功率;bit0:噪声放大器增益
#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit1~3:接收数据通道号(最大:6);bit4:达到最多次重发次数
//bit5:数据发送完成中断;bit6:接收数据中断
#define MAX_TX 0x10 //达到最大发送次数中断
#define TX_OK 0x20 //TX发送完成中断
#define RX_OK 0x40 //接收到数据中断
#define OBSERVE_TX 0x08 //发送检测寄存器,bit7~4:数据包丢失计数器;bit3~0:重发计数器
#define CD 0x09 //载波检测寄存器,bit0:载波检测
#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等
#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与地址相等
#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define NRF_FIFO_STATUS 0x17 //FIFO状态寄存器;bit0:RX FIFO寄存器空标志;bit1:RX FIFO满标志;bit2~3保留
//bit4:TX FIFO 空标志;bit5:TX FIFO满标志;bit6:1,循环发送上一数据包.0,不循环
#define DYNPD 0x1C
#define FEATRUE 0x1D
//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令//寄存器操作命令
//
//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义
#define MASK_RX_DR 6
#define MASK_TX_DS 5
#define MASK_MAX_RT 4
#define EN_CRC 3
#define CRCO 2
#define PWR_UP 1
#define PRIM_RX 0
#define ENAA_P5 5
#define ENAA_P4 4
#define ENAA_P3 3
#define ENAA_P2 2
#define ENAA_P1 1
#define ENAA_P0 0
#define ERX_P5 5
#define ERX_P4 4
#define ERX_P3 3
#define ERX_P2 2
#define ERX_P1 1
#define ERX_P0 0
#define AW_RERSERVED 0x0
#define AW_3BYTES 0x1
#define AW_4BYTES 0x2
#define AW_5BYTES 0x3
#define ARD_250US (0x00<<4)
#define ARD_500US (0x01<<4)
#define ARD_750US (0x02<<4)
#define ARD_1000US (0x03<<4)
#define ARD_2000US (0x07<<4)
#define ARD_4000US (0x0F<<4)
#define ARC_DISABLE 0x00
#define ARC_15 0x0F
#define CONT_WAVE 7
#define RF_DR_LOW 5
#define PLL_LOCK 4
#define RF_DR_HIGH 3
//bit2-bit1:
#define PWR_18DB (0x00<<1)
#define PWR_12DB (0x01<<1)
#define PWR_6DB (0x02<<1)
#define PWR_0DB (0x03<<1)
#define RX_DR 6
#define TX_DS 5
#define MAX_RT 4
//for bit3-bit1,
#define TX_FULL_0 0
#define RPD 0
#define TX_REUSE 6
#define TX_FULL_1 5
#define TX_EMPTY 4
//bit3-bit2, reserved, only '00'
#define RX_FULL 1
#define RX_EMPTY 0
#define DPL_P5 5
#define DPL_P4 4
#define DPL_P3 3
#define DPL_P2 2
#define DPL_P1 1
#define DPL_P0 0
#define EN_DPL 2
#define EN_ACK_PAY 1
#define EN_DYN_ACK 0
#define IRQ_ALL ( (1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT) )
//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义//位定义
/** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 */
#define DYNAMIC_PACKET 1 //1:动态数据包, 0:固定
#define FIXED_PACKET_LEN 32 //包长度
#define REPEAT_CNT 15 //重复次数
#define INIT_ADDR 0x34,0x43,0x10,0x10,0x01
/** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 *//** 配置和选项定义 */
const char *g_ErrorString = "RF24L01 is not find !...\n";
const char *g_Ashining = "gisemi\n";
uint8_t g_TxMode = 0, g_UartRxFlag = 0;
uint8_t g_UartRxBuffer[ 32 ] = { 0 };
uint8_t g_RF24L01RxBuffer[ 32 ] = { 0 };
// inslude the SPI library:
#include <SPI.h>
// set pin 10 as the slave select for the digital pot:
const byte CSN = 10;
const byte CE = 9;
const byte IRQ = 8;
//CSN
//CSN
//CSN
void set_csn_output()
{
pinMode(CSN, OUTPUT);
}
void set_csn_low()
{
digitalWrite(CSN, LOW);
}
void set_csn_high()
{
digitalWrite(CSN, HIGH);
}
//CSN
//CSN
//CSN
//CE
//CE
//CE
void set_ce_output()
{
pinMode(CE, OUTPUT);
}
void set_ce_high()
{
digitalWrite(CE, HIGH);
}
void set_ce_low()
{
digitalWrite(CE, LOW);
}
//CE
//CE
//CE
//IRQ
//IRQ
//IRQ
void set_irq_input()
{
pinMode(IRQ, INPUT);
}
void set_irq_low()
{
digitalWrite(IRQ, LOW);
}
void set_irq_high()
{
digitalWrite(IRQ, HIGH);
}
//IRQ
//IRQ
//IRQ
//串口初始化
void drv_uart_init()
{
Serial.begin(9600);
Serial.setTimeout(1000); // 字节之间到达时间间隔超过1000ms后,available()函数返回
}
//SPI初始化
void drv_spi_init()
{
SPI.begin();
}
//引脚初始化
void NRF24L01_Gpio_Init()
{
// CE 配置为输出 //使能设备
set_ce_output();
set_ce_low();
// IRQ配置为输入 //清中断
set_irq_input();
set_irq_high(); // 输入引脚也可以设置高低电平
// CSN配置为输出 //取消SPI片选
set_csn_output();
set_csn_high();
}
/**
* @brief :NRF24L01写指定长度的数据
* @param :
* @reg:地址
* @pBuf:写入的数据地址
* @len:数据长度
* @note :数据长度不超过255,地址在设备中有效
* @retval:写状态
*/
void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
{
uint8_t i;
// RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //写命令 地址
SPI.transfer(NRF_WRITE_REG | RegAddr); //写命令 地址
for( i = 0; i < len; i ++ )
{
//drv_spi_read_write_byte( *( pBuf + i ) ); //写数据
SPI.transfer( *( pBuf + i ) ); //写数据
}
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
}
/**
* @brief :NRF24L01读指定长度的数据
* @param :
* @reg:地址
* @pBuf:数据存放地址
* @len:数据长度
* @note :数据长度不超过255,地址在设备中有效
* @retval:读取状态
*/
void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len )
{
uint8_t btmp;
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //读命令 地址
SPI.transfer( NRF_READ_REG | RegAddr ); //读命令 地址
for( btmp = 0; btmp < len; btmp ++ )
{
//*( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF ); //读数据
*( pBuf + btmp ) = SPI.transfer( 0xFF ); //读数据
}
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
}
/**
* @brief :串口发送数据
* @param :
* @TxBuffer:发送数据首地址
* @Length:数据长度
* @note :无
* @retval:无
*/
void drv_uart_tx_bytes( uint8_t* TxBuffer, uint8_t Length )
{
while( Length-- )
{
char c = *TxBuffer;
Serial.print(c);
TxBuffer++;
}
}
/**
* @brief :NRF24L01检测
* @param :无
* @note :无
* @retval:无
*/
void NRF24L01_check( void )
{
uint8_t i;
uint8_t buf[5]={ 0XA5, 0XA5, 0XA5, 0XA5, 0XA5 };
uint8_t read_buf[ 5 ] = { 0 };
while( 1 )
{
NRF24L01_Write_Buf( TX_ADDR, buf, 5 ); //写入5个字节的地址
NRF24L01_Read_Buf( TX_ADDR, read_buf,5 ); //读出写入的地址
for( i = 0; i < 5; i++ )
{
if( buf[ i ] != read_buf[ i ] )
{
break; //读出的值和写入的置不同
}
}
if( 5 == i )
{
drv_uart_tx_bytes((char*)"exist\n",6);
break; //读出的字符串与写入的字符串相同,判断为设备存在
}
else
{
drv_uart_tx_bytes( (uint8_t *)g_ErrorString, 25 ); //检测不到设备,输出警告信息
}
// drv_delay_ms( 500 ); //500MS检测一次
delay( 500 ); //500MS检测一次
}
}
/**
* @brief :NRF24L01读状态寄存器
* @param :无
* @note :无
* @retval:RF24L01状态
*/
uint8_t NRF24L01_Read_Status_Register( void )
{
uint8_t Status;
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS ); //读状态寄存器
Status = SPI.transfer( NRF_READ_REG + STATUS ); //读状态寄存器
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
return Status;
}
/**
* @brief :NRF24L01清中断
* @param :
@IRQ_Source:中断源
* @note :无
* @retval:清除后状态寄存器的值
*/
uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source )
{
uint8_t btmp = 0;
IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); //中断标志处理
btmp = NRF24L01_Read_Status_Register(); //读状态寄存器
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( NRF_WRITE_REG + STATUS ); //写状态寄存器命令
SPI.transfer( NRF_WRITE_REG + STATUS ); //写状态寄存器命令
//drv_spi_read_write_byte( IRQ_Source | btmp ); //清相应中断标志
SPI.transfer( IRQ_Source | btmp ); //清相应中断标志
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
return ( NRF24L01_Read_Status_Register()); //返回状态寄存器状态
}
/**
* @brief :NRF24L01写寄存器
* @param :无
* @note :地址在设备中有效
* @retval:读写状态
*/
void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value )
{
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //写命令 地址
SPI.transfer( NRF_WRITE_REG | RegAddr ); //写命令 地址
//drv_spi_read_write_byte( Value ); //写数据
SPI.transfer( Value ); //写数据
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
}
/**
* @brief :NRF24L01读寄存器
* @param :
@Addr:寄存器地址
* @note :地址在设备中有效
* @retval:读取的数据
*/
uint8_t NRF24L01_Read_Reg( uint8_t RegAddr )
{
uint8_t btmp;
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //读命令 地址
SPI.transfer( NRF_READ_REG | RegAddr ); //读命令 地址
//btmp = drv_spi_read_write_byte( 0xFF ); //读数据
btmp = SPI.transfer( 0xFF ); //读数据
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
return btmp;
}
/**
* @brief :设置发送地址
* @param :
* @pAddr:地址存放地址
* @len:长度
* @note :无
* @retval:无
*/
void NRF24L01_Set_TxAddr( uint8_t *pAddr, uint8_t len )
{
len = ( len > 5 ) ? 5 : len; //地址不能大于5个字节
NRF24L01_Write_Buf( TX_ADDR, pAddr, len ); //写地址
}
/**
* @brief :设置接收通道地址
* @param :
* @PipeNum:通道
* @pAddr:地址存肥着地址
* @Len:长度
* @note :通道不大于5 地址长度不大于5个字节
* @retval:无
*/
void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t *pAddr, uint8_t Len )
{
Len = ( Len > 5 ) ? 5 : Len;
PipeNum = ( PipeNum > 5 ) ? 5 : PipeNum; //通道不大于5 地址长度不大于5个字节
NRF24L01_Write_Buf( RX_ADDR_P0 + PipeNum, pAddr, Len ); //写入地址
}
/**
* @brief :RF24L01模块初始化
* @param :无
* @note :无
* @retval:无
*/
void RF24L01_Init( void )
{
uint8_t addr[5] = {INIT_ADDR};
//RF24L01_SET_CE_HIGH();
set_ce_high();
NRF24L01_Clear_IRQ_Flag( IRQ_ALL );
//#if DYNAMIC_PACKET == 1
if(DYNAMIC_PACKET == 1){
NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) ); //使能通道1动态数据长度
NRF24L01_Write_Reg( FEATRUE, 0x07 );
NRF24L01_Read_Reg( DYNPD );
NRF24L01_Read_Reg( FEATRUE );
}
//#elif DYNAMIC_PACKET == 0
else{
//L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); //固定数据长度
//#endif //DYNAMIC_PACKET
}
NRF24L01_Write_Reg( CONFIG, /*( 1<<MASK_RX_DR ) |*/ //接收中断
( 1 << EN_CRC ) | //使能CRC 1个字节
( 1 << PWR_UP ) ); //开启设备
NRF24L01_Write_Reg( EN_AA, ( 1 << ENAA_P0 ) ); //通道0自动应答
NRF24L01_Write_Reg( EN_RXADDR, ( 1 << ERX_P0 ) ); //通道0接收
NRF24L01_Write_Reg( SETUP_AW, AW_5BYTES ); //地址宽度 5个字节
NRF24L01_Write_Reg( SETUP_RETR, ARD_4000US |
( REPEAT_CNT & 0x0F ) ); //重复等待时间 250us
NRF24L01_Write_Reg( RF_CH, 60 ); //初始化通道
NRF24L01_Write_Reg( RF_SETUP, 0x26 );
NRF24L01_Set_TxAddr( &addr[0], 5 ); //设置TX地址
NRF24L01_Set_RxAddr( 0, &addr[0], 5 ); //设置RX地址
}
/**
* @brief :设置模式
* @param :
* @Mode:模式发送模式或接收模式
* @note :无
* @retval:无
*/
void RF24L01_Set_Mode( nRf24l01ModeType Mode )
{
uint8_t controlreg = 0;
controlreg = NRF24L01_Read_Reg( CONFIG );
if( Mode == MODE_TX )
{
controlreg &= ~( 1<< PRIM_RX );
}
else
{
if( Mode == MODE_RX )
{
controlreg |= ( 1<< PRIM_RX );
}
}
NRF24L01_Write_Reg( CONFIG, controlreg );
}
int RF24L01_GET_IRQ_STATUS()
{
return digitalRead(IRQ);
}
/**
* @brief :NRF24L01发送一次数据
* @param :
* @txbuf:待发送数据首地址
* @Length:发送数据长度
* @note :无
* @retval:
* MAX_TX:达到最大重发次数
* TX_OK:发送完成
* 0xFF:其他原因
*/
uint8_t NRF24L01_TxPacket( uint8_t *txbuf, uint8_t Length )
{
uint8_t l_Status = 0;
uint16_t l_MsTimes = 0;
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( FLUSH_TX );
SPI.transfer( FLUSH_TX );
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
//RF24L01_SET_CE_LOW( );
set_ce_low();
NRF24L01_Write_Buf( WR_TX_PLOAD, txbuf, Length ); //写数据到TX BUF 32字节 TX_PLOAD_WIDTH
// RF24L01_SET_CE_HIGH( ); //启动发送
set_ce_high();
while( 0 != RF24L01_GET_IRQ_STATUS())
{
// drv_delay_ms( 1 );
delay(1);
if( 500 == l_MsTimes++ ) //500ms还没有发送成功,重新初始化设备
{
NRF24L01_Gpio_Init( );
RF24L01_Init( );
RF24L01_Set_Mode( MODE_TX );
break;
}
}
l_Status = NRF24L01_Read_Reg(STATUS); //读状态寄存器
NRF24L01_Write_Reg( STATUS, l_Status ); //清除TX_DS或MAX_RT中断标志
if( l_Status & MAX_TX ) //达到最大重发次数
{
NRF24L01_Write_Reg( FLUSH_TX,0xff ); //清除TX FIFO寄存器
return MAX_TX;
}
if( l_Status & TX_OK ) //发送完成
{
return TX_OK;
}
return 0xFF; //其他原因发送失败
}
/**
* @brief :串口接收数据
* @param :
* @RxBuffer:发送数据首地址
* @note :无
* @retval:接收到的字节个数
*/
uint8_t drv_uart_rx_bytes( uint8_t* RxBuffer )
{
// uint8_t l_RxLength = 0;
// uint16_t l_UartRxTimOut = 0x7FFF;
// while( l_UartRxTimOut-- ) //在超时范围内检测数据
// {
// if( 0 != RI ) //检测是否接收到数据
// {
// RI = 0; //清标志位
// *RxBuffer = SBUF; //读数据
// RxBuffer++;
// l_RxLength++;
// l_UartRxTimOut = 0x7FFF;//重置超时检测
// }
// }
// return l_RxLength; //等待超时,数据接收完成
uint8_t l_RxLength = 0;
uint16_t l_UartRxTimOut = 0x7FFF;
while( l_UartRxTimOut-- ) //在超时范围内检测数据
{
if(Serial.available() ) //检测是否接收到数据
{
// RI = 0; //清标志位
// *RxBuffer = SBUF; //读数据
*RxBuffer = Serial.read(); //读数据
RxBuffer++;
l_RxLength++;
l_UartRxTimOut = 0x7FFF;//重置超时检测
}
}
if(l_RxLength!=0)
{
Serial.print("l_RxLength:");
//drv_uart_tx_bytes(RxBuffer,l_RxLength);
Serial.println(l_RxLength);
}
return l_RxLength; //等待超时,数据接收完成
// uint8_t l_RxLength = 0;
// l_RxLength = Serial.available();
// for(int i=0;i<l_RxLength;i++)
// {
// *RxBuffer = Serial.read();
// RxBuffer++;
// }
// if(l_RxLength!=0)
// {
// Serial.print("l_RxLength:");
// //drv_uart_tx_bytes(RxBuffer,l_RxLength);
// Serial.println(l_RxLength);
// }
// return l_RxLength;
}
/**
* @brief :NRF24L01接收数据
* @param :
* @rxbuf:接收数据存放地址
* @note :无
* @retval:
* 0:接收完成
* 1:没有接收到数据
*/
uint8_t NRF24L01_RxPacket( uint8_t *rxbuf )
{
uint8_t l_Status = 0, l_RxLength = 0, l_100MsTimes = 0;
//RF24L01_SET_CS_LOW( ); //片选
set_csn_low(); //片选
//drv_spi_read_write_byte( FLUSH_RX );
SPI.transfer( FLUSH_RX );
//RF24L01_SET_CS_HIGH( ); //取消片选
set_csn_high(); //取消片选
while( 0 != RF24L01_GET_IRQ_STATUS( ))
{
//drv_delay_ms( 100 );
delay(100);
if( 30 == l_100MsTimes++ ) //3s没接收过数据,重新初始化模块
{
NRF24L01_Gpio_Init( );
RF24L01_Init( );
RF24L01_Set_Mode( MODE_RX );
break;
}
}
l_Status = NRF24L01_Read_Reg( STATUS ); //读状态寄存器
NRF24L01_Write_Reg( STATUS,l_Status ); //清中断标志
if( l_Status & RX_OK) //接收到数据
{
l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID ); //读取接收到的数据个数
NRF24L01_Read_Buf( RD_RX_PLOAD,rxbuf,l_RxLength ); //接收到数据
NRF24L01_Write_Reg( FLUSH_RX,0xff ); //清除RX FIFO
return l_RxLength;
}
return 0; //没有收到数据
}
void setup() {
//串口初始化
drv_uart_init( );
//SPI初始化
drv_spi_init( );
//RF24L01引脚初始化
NRF24L01_Gpio_Init( );
//检测nRF24L01
NRF24L01_check();
RF24L01_Init();
if(1)
{
// 发送
RF24L01_Set_Mode( MODE_TX ); //发送模式
while(1)
{
g_TxMode = 1; // 串口输入要发送的数据
// g_TxMode = 0; // 发送固定字符
//发送
if( TX_MODE_1 == g_TxMode )
{
NRF24L01_TxPacket( (uint8_t *)g_Ashining, 7 ); //模式1发送固定字符,1S一包
// drv_delay_ms( 500 );
// drv_delay_ms( 500 );
// led_red_flashing( );
delay(1000);
}
else
{
//查询串口数据
int i = drv_uart_rx_bytes( g_UartRxBuffer );
if( 0 != i )
{
NRF24L01_TxPacket( g_UartRxBuffer, i );
//led_red_flashing( );
}
}
}
}
else
{
// 接收
RF24L01_Set_Mode( MODE_RX ); //接收模式
while( 1 )
{
int i = NRF24L01_RxPacket( g_RF24L01RxBuffer ); //接收字节
if( 0 != i )
{
//led_green_flashing( );
drv_uart_tx_bytes( g_RF24L01RxBuffer,i ); //输入接收到的字节
}
}
}
}
void loop() {
delay(1000);
}
ps:大部分代码来自淘宝客服