
NRF24L01/NRF24L01+是挪威NordicVLSI公司出品的一款新型射频收发器件,采用4 mm×4 mmQFN20封装;NRF24L01/NRF24L01+工作在ISM频段:24~2524 GHz。且内置频率合成器、功率放大器、晶体振荡器、调制器等功能,并融合增强型ShockBurst技术,其中地址、输出功率和通信频道可通过程序进行配置,适合用于多机通信。NRF24L01/NRF24L01+功耗很低,在以-6 dBm的功率发射时,工作电流也只有9 mA;而对应接收机的工作电流只有123 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。NRF24L01/NRF24L01+在业界领先的低功耗特点使其特别适合采用钮扣电池供电的24G应用,整个解决方案包括链路层和MultiCeiver功能提供了比现有的nRF24XX更多的功能和更低的电源消耗,与目前的蓝牙技术相比在提供更高速率的同时,而只需花更小的功耗最新采用的nRF24L01+与nRF24L01兼容,并增加250kbps低速功能。
NRF24L01/NRF24L01+基本特性
工作电压:19-36V
调制方式: GFSK
最大发射功率: 0dBm
最大传输数率:2Mbps
瞬间最大工作电流: <15mA
工作频率:(2400-2524GHZ)
==========================================
1低电压工作19-36V
2掉电模式下的功耗400nA
3待机模式下的功耗32uA
4130us 的快速切换和唤醒时间
5具有片内稳压器oltage regulators
62Mbit/s速率下接收时的峰值电流125mA
72Mbit/s速率下@0dBm输出时的峰值电流11mA
8MultiCeiverMT硬件提供同时6个接收机的功能,2Mbit/s 使得高质量的VoIP 成为可能业界领先的低功耗NRF24L01/NRF24L01+特别适合采用钮扣电池供电的24G应用,整个解决方案包括链路层和MultiCeiver功能提供了比现有的 nRF24XX 更多的功能和更低的电源消耗,与目前的蓝牙技术相比
在提供更高速率的同时,而只需花更小的功耗
9开阔通信距离60米左右,室内30米左右
==========================================
NRF24L01系列无线模组:
板载天线NRF24L01/NRF24L01+模块:htt p:/ /itemtaoba oc om/it emh tmid=8487822260
外置天线NRF24L01/NRF24L01+模块:htt p:/ /itemtaoba oc om/ite mh tmid=1035140242
功率放大NRF24L01/NRF24L01+模块:htt p:/ /itemtaoba oc om/ite mh tmid=4073639196
USB 接口NRF24L01/NRF24L01+模块:htt p:/ /itemtaoba oc om/it emh tmid=1993121052
NRF24L01+&430-RFID系列无线模块:htt p:/ /itemtaoba oco m/it emht mid=8274101190
NRF24L01+&51--RFID系列无线模块:htt p:/ /itemtaoba oco m/ite mht mid=8753654192
NRF24L01/NRF24L01+无线应用评估:htt p:/ /itemtaoba oco m/it emht mid=278987910
发送端发送数据时,数据包内地址采用“发送通道TX_ADD”的地址,这个地址为接收端的几个接收通道中的一个,接收端对应的通道接收到数据后,进行应答,应答包内地址采用对应接收通道的地址即为发送端的发送通道地址。
而发送端默认使用通道0最为应答接收,故发送端通道0地址要设置为发送通道地址。(上面一大堆通信,其实用的都是一个地址,这个地址分别被用来作为发送端发送通道地址,发送端某一接收通道地址,发送端接收通道0地址)。关于应答,无需设置接收端的发送通道地址,因为应答是硬件实现,不是软件设置。
// SPI(nRF24L01) 命令定义
#define READ_REG 0x00 // 定义读寄存器命令
#define WRITE_REG 0x20 // 定义写寄存器命令
#define RD_RX_PLOAD 0x61 // 定义接收有效载荷寄存器
#define WR_TX_PLOAD 0xA0 // 定义发送有效载荷寄存器
#define FLUSH_TX 0xE1 // 定义清除发送寄存器命令
#define FLUSH_RX 0xE2 // 定义清除接收寄存器命令
#define REUSE_TX_PL 0xE3 // 定义复用发送有效载荷寄存器命令
#define NOP1 0xFF // 定义空 *** 作,用于读取状态寄存器
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 // “配置寄存器”地址
#define EN_AA 0x01 // “使能自动应答寄存器”地址
#define EN_RXADDR 0x02 // “使能接收地址寄存器”地址
#define SETUP_AW 0x03 // “设置地址长度寄存器”地址
#define SETUP_RETR 0x04 // “设置自动重发寄存器”地址
#define RF_CH 0x05 // “RF(射频)频道寄存器”地址
#define RF_SETUP 0x06 // “RF(射频)设置寄存器”地址
#define STATUS_24L01 0x07 // “状态寄存器”地址
#define OBSERVE_TX 0x08 // “?寄存器”地址
#define CD 0x09 // “发现载波寄存器”地址
#define RX_ADDR_P0 0x0A // “通道0接收寄存器”地址
#define RX_ADDR_P1 0x0B // "通道1接收寄存器"地址
#define RX_ADDR_P2 0x0C // "通道2接收寄存器"地址
#define RX_ADDR_P3 0x0D // "通道3接收寄存器"地址
#define RX_ADDR_P4 0x0E // "通道4接收寄存器"地址
#define RX_ADDR_P5 0x0F // "通道5接收寄存器"地址
#define TX_ADDR 0x10 // ”发送寄存器“地址
#define RX_PW_P0 0x11 // ”通道0有效载荷(数据)长度寄存器“地址
#define RX_PW_P1 0x12 // ”通道1有效载荷长度寄存器“地址
#define RX_PW_P2 0x13 // ”通道2有效载荷长度寄存器“地址
#define RX_PW_P3 0x14 // ”通道3有效载荷长度寄存器“地址
#define RX_PW_P4 0x15 // ”通道4有效载荷长度寄存器“地址
#define RX_PW_P5 0x16 // ”通道5有效载荷长度寄存器“地址
#define FIFO_STATUS 0x17 // “FIFO状态寄存器的寄存器”地址
//-------------------------------
#define TX_ADR_WIDTH 5 //发送地址字节数
#define RX_PLOAD_WIDTH 16 //接收数据字节数
#define TX_PLOAD_WIDTH 16 //发送数据字节数
#define MAX_CONTROL_NUMBER 2 //2 line concrol 2 relay remote control
#define NOP _nop_();
#define NOP5 NOP;NOP;NOP;NOP;NOP;
#define NOP10 NOP5;NOP5;
#define NOP20 NOP10;NOP10;
#define delay_130us() NOP20;NOP20;NOP20;NOP20;NOP20;NOP20;NOP10;
#define uchar unsigned char
#define BYTE unsigned char
sbit CE = P2^2;
sbit CSN = P2^3;
sbit SCK = P2^4 ;
sbit MOSI = P2^5;
sbit MISO = P2^6 ; //数据输入引脚
sbit IRQ_24L01= P2^7 ;//spi通讯端口定义
/---------------------------------/
unsigned char TX_ADDRESS[5]={
0x1,0x02,0x03,0x04,0x05
};
unsigned char RX_ADDRESS[5]={
0x01,0x02,0x03,0x04,0x05
};
/_________________________________/
void nRF24L01_Config(void); // 配置函数
uchar SPI_RW(uchar byte); // 写一个字节到24L01,同时读出一个字节
//uchar SPI_READ_Reg(BYTE reg); // 读出寄存器的值
uchar SPI_RW_Reg(BYTE reg, BYTE value); // 向寄存器reg写一个字节,同时返回状态字节
uchar SPI_Read_Buf(BYTE reg, BYTE pBuf, BYTE bytes); //nRF24L01读出字节
uchar SPI_Write_Buf(BYTE reg, BYTE pBuf, BYTE bytes); //nRF24L01写入字节
unsigned char nRF24L01_RxPacket(unsigned char rx_buf); //nRF24L01数据接收
void nRF24L01_TxPacket(unsigned char tx_buf); //nRF24L01数据发送
bit rec_validate_end(void); //接收数据完成后进行校正处理
void set_24L01_rec_mode(void);
//void test_24l01_irq(void); //测试nRF24L01
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01数据读/写
函数功能:写一个字节到24L01,同时读出一个字节
设计时间:
设 计 者:
------------------------------/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
bit_ctr=0;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (byte & 0x80); // wait output 'byte', MSB to MOSI
byte = (byte << 1); // shift next bit into MSB
SCK = 1; // Set SCK high
//--------------------------
MISO=1;
NOP5;
///-------------------------
byte |= MISO; // read capture current MISO bit
SCK = 0; // then set SCK low again
}
return(byte); // return read byte
}
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01数据读取
函数功能:向寄存器reg写一个字节,同时返回状态字节
设计时间:
设 计 者:
------------------------------/
//
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{
uchar status_24L01;
status_24L01 = 0;
CSN = 0; // CSN low, init SPI transaction
status_24L01 = SPI_RW(reg); // select register 选择通道
SPI_RW(value); // and write value to it
CSN = 1; // CSN high again
return(status_24L01); // return nRF24L01 status byte
}
//读数据
uchar SPI_Read_Buf(BYTE reg, BYTE pBuf, BYTE bytes)
{
uchar status_24L01,byte_ctr;
status_24L01 = 0;
byte_ctr = 0;
CSN = 0; // Set CSN low, init SPI tranaction
status_24L01 = SPI_RW(reg); // Select register to write to and read status byte
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); //选择信号通道?
CSN = 1;
return(status_24L01); // return nRF24L01 status byte
}
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01
函数功能:写入bytes字节的数据
设计时间:
设 计 者:
------------------------------/
uchar SPI_Write_Buf(BYTE reg, BYTE pBuf, BYTE bytes)
{
uchar status_24L01,byte_ctr;
status_24L01=0;
byte_ctr=0;
CSN = 0;
status_24L01 = SPI_RW(reg);
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) //
SPI_RW(pBuf++); //;需要发送的数据在PBUF表格里;
//;需要发送的字节数载bytes;
//对其 *** 作的命令在reg里
CSN = 1; // Set CSN high again
return(status_24L01); //
}
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01__set_24L01_rec_mode
函数功能:写寄存器命令;并寄存器配置地址
设计时间:
设 计 者:
------------------------------/
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01 nRF24L01_RxPacket
函数功能:接收函数,返回1表示有数据收到,否则没有数据接受到
设计时间:
设 计 者: 测试通过
------------------------------/
unsigned char nRF24L01_RxPacket(unsigned char rx_buf)
{
unsigned char sta,revale=0;
sta =0;
revale=0;
// set in RX mode
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX RX_DR enabled
CE = 1; // Set CE pin high to enable RX device
delay_130us();
sta=SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // read register STATUS's value
//读取nRF24L01所处于的状态
if(sta&0x40) // if receive data ready (RX_DR) interrupt 如果准备接收数据则中断1;
{
CE = 0; // stand by mode
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
// read receive payload from RX_FIFO buffer
//读取16个字节的数据最大32BIT
revale =1;
}
SPI_RW_Reg(WRITE_REG+STATUS_24L01,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
return revale;
}
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01
函数功能:发送函数
设计时间:
设 计 者:
------------------------------/
void nRF24L01_TxPacket(unsigned char tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 发送5个地址24l01
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for AutoAck
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX MAX_RT & TX_DS enabled
CE=1;
NOP20;
CE=0;
}
/-----------------------------
公司名称:xxxxxx
函数名称:nRF24L01 nRF24L01_Config
函数功能:配置函数
设计时间:
设 计 者:
------------------------------/
void nRF24L01_Config(void)
{
//initial io of 24L01
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX RX_DR enabled
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //Enable auto_ack Pipe0
// SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); //DISable auto_ack Pipe0
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03); // Setup address width=5 bytes
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans
SPI_RW_Reg(WRITE_REG + RF_CH, 0x02); //channel 2
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
CE=1;
}
/------------------------------/
bit rec_validate_end(void)
{
if(IRQ_24L01==1)return 0;
// if(nRF24L01_RxPacket(remote_buf)&0x01)return (1);
else return (0);
}
void set_24L01_rec_mode(void)
{
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX RX_DR enabled
RX_ADDRESS[0]=0XF0;
RX_ADDRESS[1]=0XF0;
RX_ADDRESS[2]=0XF0;
RX_ADDRESS[3]=0XF0;
RX_ADDRESS[4]=0XC0;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, &RX_ADDRESS[0], TX_ADR_WIDTH);
CE = 1; // Set CE pin high to enable RX device
}
故障有各样的原因,需要从外到内、从机械到电气、从软件到硬件逐步进行检查测试和判断。但更重要的是要注意防范,要改善不良的使用环境,改变不良的使用习惯,坚持按科学合理的使用程序开机、关机和 *** 作。电脑工作时,尤其是读写数据时不能突然关机,否则可能会损坏驱动器(硬盘、软驱等);不能在机器工作时搬动机器。当然,即使机器未工作时,也应尽避免搬动机器,因为过大的震动会对硬盘一类的配件造成损坏。另外,关机时必须先关闭所有的程序,再按正常的顺序退出,否则有可能损坏应用程序。总而言之,电脑出现的故障,既有复杂故障也有简单故障,其中大部分故障都有一定的蛛丝马迹,甚至是一些十分明显的外观表现,比如电容器体积膨胀、未装散热片的非功率型集成块的表面出现严重发热现象等。实际上,只要我们能够通过“望、闻、听、切”并认真分析,其中的大部分故障完全可以采用简单的方法来顺利解决的。
第一,用串口,将发送过来的数据通过NRF24L01接收送给单片机再通过串口通信送给PC机,可以串口调试工具接收到数据,如果要做其他用处就得另写上位机程序。一般要串口线,还要安装驱动,程序编写简单,但通用性差。
第二,用usb通信,将发送过来的数据通过NRF24L01接收,送给单片机,再通过usb接口芯片将数据送给pc机。程序编写难些,要编写固件程序。不过这样制作的东西通用性好,那台电脑上都能用,并且即插即用,不要安装驱动,方便,如果模拟键盘的话数据能在txt文档中直接查看。(我推荐一款usb接口芯片,南京沁恒公司的ch375,可以免费申请,还有技术支持,很不错,我用过。可以先用HID设备枚举来实现,程序编写相对简单,实现的速度相对较低,60多kb/s,对于低速设备完全够用。也可以用集成了usb接口芯片的51单片机来做,飞利浦有一款)
拜托,串口通信怎么能用while来做
要进中断进行数据处理啊,写个标志位,在接收中断结束前置位,然后在外部的while里判断这个标志位都可以
你在主循环里清除中断标志是不能清除串口缓冲数据的,这样就导致下次发送的数据无法接收,因为接受缓冲区是满的,这个要对缓冲区进行读取 *** 作后才会清除你还是把datasheet文件好好看看吧,接收数据后要对缓冲寄存器进行读取 *** 作来清除数据
以上就是关于求助NRF24l01无线模块的程序全部的内容,包括:求助NRF24l01无线模块的程序、nRF24L01接收地址怎么修改、加强版51单片机STC12C5A60S2用NRF24L01发送一个字节的C语言程序 邮箱wmb007@126.com等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)