求助NRF24l01无线模块的程序

求助NRF24l01无线模块的程序,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9272218.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存