NRF2401发送数据成功怎么nrf24l01接收不到数据据

NRF2401+芯片的ACK带数据返回功能的理解和总结
NRF2401+芯片的ACK带数据返回功能的理解和总结
NRF2401+芯片主要特点:
& 工作在2.4~2.5GHz频段;
无线数据传输率可达1~2MHz;
SPI接口速率0~8MHz;
125可选工作频道(可跳频);
工作电压1.9~3.6V;
& 增强型ShockBurst&模式;
&&&&当NRF2401+模块工作在增强型ShockBurst&模式时,可以使用自动应答和自动重发功能,当然这些都不具有诱惑力,最多提高了数据传输的效率和稳定性,数据传输依然是单方向的。增强型ShockBurst&模式下有一种ACK带数据返回的功能,这个功能很强大,不需要人为的在程序中切换接收和发送状态,只需要通过寄存器简单的配置,就可以实现数据的双向传输,对于平常的学习,尤其是利用上位机调试参数,非常方便。本文主要介绍这种模式的配置以及自己对过程的理解、总结和一些疑问。
一、SPI指令和一部分寄存器如下:
&&SPI指令:
& &部分寄存器:
二、增强型ShockBurst&模式下ACK带数据返回功能的配置过程解释:
&1、关于ACK带数据返回功能需要的额外配置:
参考手册部分:
由手册可知,如果要使用ACK带数据返回功能,必须额外满足:
~使能动态数据长度,即接收和发送数据长度可变,详见主接收设备配置部分解释;
~主接收端将随ACK返回的数据利用W_ACK_PAYLOADAY指令放入发送缓冲区,详见后文;
&&~置位FEATURE寄存器中的位EN_ACK_PAY,使能ACK带数据返回功能;
~最大重发时间间隔的设置步进值为250us,设置为500us适用于0~32任意长度字节的负载数据;(感觉翻译很别扭,上面的英文意思倒是很清晰!!)
&注:此程序配置中一个主发送设备,一个主接收设备,均使用通道0进行数据传输;
&&& 2、主发送设备的配置过程解析
&: void NRF_TX_Mode(void)
//功能&&&&&&:
初始化NRF2401+模块为发送模式
//输入参数: 无
//返回参数: 无
void NRF_TX_Mode(void)
//CE拉低,配置寄存器&&&
NRF_CE_LOW();&&
// 写TX节点地址(1)
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);&&&
写RX节点地址&(2)&&
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);&&
使能通道0的自动应答(3)&
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);&&&&
使能通道0的接收地址(4)&
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);&
//设置自动重发间隔时间:500us最大自动重发次数:10次(5)&
SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
设置RF频率,手册有详细解释(6)&
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,50);&&&&&&
// 设置TX发射参数,0db增益,2Mbps,低噪声增益开启(7)&
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);&&&&
//清除发送和接收缓冲区(8)&&
SPI_NRF_WriteReg(FLUSH_TX,0xff);
SPI_NRF_WriteReg(FLUSH_RX,0xff);
//IRQ收发完成中断开启,16位CRC,主发送(9)&
SPI_NRF_WriteReg(NRF_WRITE_REG + CONFIG_NRF,
0x0e);&&&&&
//Active命令(10)&&
SPI_NRF_RW(0x50);
SPI_NRF_RW(0x73);
//使能动态数据长度(11)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1c,0x01);
//使能ACK带数据返回功能(12)&
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1d,0x06);
//CE拉高,进入发送模式(13)&&
NRF_CE_HIGH();
程序解释:
(1)仅用于主发送设备,写主发送设备发送节点地址,地址通过软件设定,可通过操作寄存器SETUP_AW修改地址宽度(1~5字节),寄存器复位之后,默认地址宽度为5字节;
&&主发送设备的发送节点地址必须和主接收设备的接收节点地址一致,否则接收不到数据。
通道0和1有5个字节宽度;
通道2~5的高32位必须和通道1相同,低8位可以通过软件设置;
参考手册寄存器部分:
(2)写接收节点地址,只有通道0可以用来接收ACK信号或ACK+返回数据,此地址必须和主发送设备的发送节点地址相同,即和(1)的相同。
(3)通道0的自动应答,必须;
(4)使能通道0的接收地址,必须;
(5)最大重发间隔时间至少设置为500us,最大重发次数1~15;
&参考手册:ARD=500&s will be long enough for any payload
(6)设置通信频率,取值为0~125,取值50,即NEF模块的射频频率为2.450GHz;
&参考手册:
& &上文大概意思是:可以通过给寄存器RF_CH这个寄存器写入参数0~125,使得NRF模块射频通道的通信频率在2.400GHz~2.525GHz范围内,射频信道的频率分辨率为1MHz,为了防止信道发生重叠,不同信道之间的射频频率相差至少2MHz,
射频信道的频率由下列公式计算:
2400 + rf_ch [MHz]
为了能够彼此通信,发射机和接收机的射频信道的频率必须相同,即寄存器RF_CH设置一致。
(7)设置发射参数,具体参考手册寄存器部分;
(8)清除发送和接收缓冲区,如果不进行清除,测试可用;
(9)配置中断和CRC校验等,CRC校验8位和16位均可;
(10)激活命令,用于激活R_RX_PL_WID、W_ACK_PAYLOAD&、W_TX_PAYLOAD_NOACK;
&参考手册SPI指令部分:
& 从手册中可以看到,使用ACTIVE(0x50)指令并写入数据0x73可以激活R_RX_PL_WID、W_ACK_PAYLOAD&指令和W_TX_PAYLOAD_NOACK&(存在于寄存器FEATURE)状态,使用&R_RX_PL_WID指令可以得到接收到的数据长度;W_ACK_PAYLOAD&&指令仅用于主接收设备,存储将要和ACK一起返回的数据,PPP的取值范围为000~101,表示0~6六个数据通道,所以W_ACK_PAYLOAD&&指令的取值范围为0xa8~0xad,分别表示0~6六个通道,具体使用在主接收部分讲解。
(11)操作寄存器DYNPD使能通道0的动态数据长度;
&ACK带数据返回功能必须使用动态数据长度,详见静态和动态数据长度介绍部分。
(12)置位寄存器
FEATURE寄存器里的 EN_DPL&和
EN_ACK_PAY状态位;
从下面的参考手册可以得知,要想使能通道0的动态数据长度,还需要使能EN_DPL位;
&置位&EN_ACK_PAY状态位的目的是使能ACK带数据返回功能。
&&参考手册寄存器部分:
(13)进入发送模式。
// 函数名& : void NRF_Tx_Dat(u8
*txbuf , u8 datlen)
// 功能&&&
:发送数据
// 输入参数: txbuf(需要发送的数据包),datlen(数据长度)
// 返回参数: 无
void NRF_Tx_Dat(u8
*txbuf , u8 datlen)
CE拉低,将数据写入缓冲区&
NRF_CE_LOW();
& // 写数据到TX BUF 最大32个字节 (14)
SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,datlen);
// CE为高,发送数据包(15)
NRF_CE_HIGH();
(14)使用W_TX_PAYLOAD指令将要发送的数据写入发送缓冲区;
(15)CE置高10us后,主发送设备开始发送数据;
// 函数名& : void
Nrf_Check_Event(u8 *rxbuf)
// 功能&&&
:接收ACK返回的数据,并清除相应中断标志位
// 输入参数: txbuf(需要发送的数据包),datlen(数据长度)
// 返回参数: 无
&注:此函数在主程序中每隔2ms执行一次,检测是否接收到和ACK一起返回的数据
void Nrf_Check_Event(u8 *rxbuf)
&//得到中断标志位(16)
SPI_NRF_ReadReg(NRF_READ_REG + STATUS);
& //得到数据长度(17)
&&u8 rx_len
= SPI_NRF_ReadReg(R_RX_PL_WID);
&&if(rx_len&33)
接收返回数据
SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,rx_len);
解析收到数据
Data_Receive_Anl(rxbuf,rx_len);&&&&&&&&&
清空接收缓冲区
&&&SPI_NRF_WriteReg(FLUSH_RX,0xff);
清空发送缓冲区
&&&SPI_NRF_WriteReg(FLUSH_TX,0xff);
// 清除中断标志位(18)
&SPI_NRF_WriteReg(NRF_WRITE_REG +
STATUS, sta);
(16)初始化过程中使能了发送成功、接收成功、达到最大重发次数中断,此处目的是得到中断标志位,从而执行相应的操作;
(17)从上面的指令部分可以得知,利用R_RX_PL_WID指令可以得到接收到的数据的长度;
(18)中断标志位必须清除。
&3、主接收设备的配置过程解析
//函数名& &: void
NRF_RX_Mode(void)//功能&&&&&&:
初始化NRF2401+模块为发送模式
//输入参数: 无
//返回参数: 无
void NRF_RX_Mode(void)
NRF_CE_LOW();&
&//写TX节点地址(1)
SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);&&&
&//写RX节点地址(2)
SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
& //使能通道0的自动应答(3) & &
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);&&&
& //使能通道0的接收地址(4)
SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);
//设置RF通信频率(5) &&
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,50);&&&&&
//设置自动重发间隔时间:500最大自动重发次数:10次(6)
&&//&SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);
&//选择通道0的有效数据宽度(静态数据长度需要配置,动态数据长度不需要配置)(7)
//SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);&&&&&
//设置RX发射参数,0db增益,2Mbps,低噪声增益开启(8)
SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);
SPI_NRF_WriteReg(FLUSH_TX,0xff);
SPI_NRF_WriteReg(FLUSH_RX,0xff);
IRQ收发完成中断开启,16位CRC,主接收(9)
SPI_NRF_WriteReg(NRF_WRITE_REG + CONFIG,
&&// ACTIVE
&SPI_NRF_RW(0x50);
SPI_NRF_RW(0x73);
&//使能动态数据长度(11)&
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1c,0x01);
//使能ACK带数据返回功能 (12)
SPI_NRF_WriteReg(NRF_WRITE_REG+0x1d,0x06);
//CE拉高,进入接收模式(13)
NRF_CE_HIGH();
(1)寄存器TX_ADDR
for a PTX device only”,即用于主发送设备,主接收设备配置这个寄存器不起作用;
(2)配置主接收设备的接收数据节点地址,必须和主发送设备的发送端节点数据地址相同,否则接收不到数据;
(3)使能通道0的自动应答,因为主发送设备通过通道0进行数据发送;
从手册中可以看到,如果使能ACK,则需要使能相应通道的自动应答;
参考手册部分:
(4)使能通道0的接收地址,目的是能接受数据;
(5)取值50,即NEF主接收模块的射频频率为2.450GHz;
&主发送模块的射频频率必须和主接收模块的射频频率相同;
&详见主发送部分介绍;
(6)设置”最大重发次数“和”自动重发延时“;
&如手册所示,只应用于主发送端,主接收端不需要配置;
&所谓“自动重发”是指,当发送端在特定的时间内没有接收到返回的ACK时,则重新发送刚才的数据,直到达到最大重发次数;
&参考手册部分:
(7)配置接收数据长度;
只有静态数据长度模式下需要配置,动态数据长度模式下不需要配置;
&参考手册部分:
通过手册可知,在增强型ShockBurst&模式下,传输数据长度(最大32字节)有静态和动态两种模式,所谓静态指每次发送的数据长度固定,所谓动态是指每次发送的数据可随意长度,但是在ACK带数据返回模式下,只能使用动态数据长度。
&静态数据长度模式下,主接收端可通过配置RX_PW_P0寄存器,设置接收数据长度,接收数据长度必须和发送端发送的数据长度相等;
&动态数据长度模式下,接收端(无论是主接收端还是主发送端处于接受模式时)可以使用用R_RX_PL_WID(0110
0000)指令得到接收数据长度;
& &为了使能动态数据长度模式,FEATURE寄存器中的EN_DPL位必须置位(无论主发送端还是主接收端),同时主发送端的寄存器DYNPD中的位DPL_P0必须置位,主接收端寄存器DYNPD中的位DPL_PX必须置位(用到哪个通道置位哪个通道)。
(8)参数配置,必须和主发送设备一致,详见手册;
(9)基本配置;
&必须和主发送端设置一致;
(10)(11)(12)详见主发送端配置说明;
(13)CE置高130us后,主接收设备开始检测是否有数据需要接收;
//函数名& &: void
NRF_Tx_Dat_AP(u8 * tx_buf, u8
len)//功能&&&&&&:
ACK带数据返回函数
//输入参数: tx_buf(发送数据包),len(数据长度)
//返回参数: 无
NRF_Tx_Dat_AP(u8 * tx_buf, u8 len)
CE拉低,将数据写入缓冲区&
NRF_CE_LOW();&&
// 写数据到TX BUF
最大32个字节(14)&&&&
SPI_NRF_WriteBuf(0xa8, tx_buf,
CE为高,发送数据包&&&
NRF_CE_HIGH();
(14)ACK带数据返回时,使用W_ACK_PAYLOAD(10101PPP)指令存储将要返回的数据,PPP表示通道0~5,取值为001~101;如果同时有六个设备(主发送)与一个设备(主接收)进行通信,则0xac表示接收端此时使用的是第4通道带数据返回;
// 函数名& : u8
Nrf_Check_Event(u8 *rxbuf)//
:接收数据,并清除相应中断标志位
// 输入参数: txbuf(接收的数据包),datlen(数据长度)
// 返回参数: sta (中断标志位)
Nrf_Check_Event(u8 *rxbuf)
&& u8 sta = 0;
SPI_NRF_ReadReg(STATUS);
&if(sta & RX_DR)//接收中断
&//得到数据长度
&&u8 rx_len =
SPI_NRF_ReadReg(R_RX_PL_WID);
//读取数据
&&SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,rx_len);
&&SPI_NRF_WriteReg(FLUSH_RX,NOP);
&if(sta & TX_DS)
&if(sta & MAX_RT)
&&if(sta &
&&&SPI_NRF_WriteReg(FLUSH_TX,0xff);
&// 清除中断标志位&
&SPI_NRF_WriteReg(NRF_WRITE_REG + STATUS,
三、增强型ShockBurst&模式下多机通信:
这部分主要介绍一下多机通信,即一个主接收设备与六个主发送设备进行通信,当然大多数情况下,我们用不到这个,这部分的主要目的理解接收数据地址和发送数据地址之间的关系。
参考手册部分:
这部分主要提到多机通信的过程中,所有设备的如下设置要一致:
~CRC使能;
~CRC配置(8位或16位);
~接收数据地址宽度;
~RF_CH配置相同,即射频频率需要配置一致;
~无线数据传输速率;
~低噪声放大器增益;
置位寄存器EN_RXADDR相应位可以使能相应的数据通道,数据通道地址可以通过RX_ADDR_PX寄存器来进行配置;
参考手册部分:
&貌似写不下了~~~~~~~~下一篇接着扒~
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。君,已阅读到文档的结尾了呢~~
NRF2401使用详解NRF2
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
NRF2401使用详解
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口关于nRF2401的问题,为什么发射器能正常发射,接收机接收不到?_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:127,930贴子:
关于nRF2401的问题,为什么发射器能正常发射,接收机接收不到?收藏
如题,一楼拜度娘
单片机,亚马逊网上书店,850多万种中外精品图书,一网打尽!书到付款,送货上门!亚马逊正版图书低价特惠,特价图书1折起!
二楼发射器程序发射器:很简单,3.3v 5v vcc各接了104,470电容。然后接了一个LED小灯,晶振12.000.发射器能正常工作#include&STC15F2K60S2.h& sbit CE=P0^0;sbit CSN=P0^1;sbit SCK=P0^2;sbit MOSI=P0^3;sbit MISO=P0^4;sbit IRQ=P0^5;sbit LED=P2^7;#define TX_ADR_WIDTH 5#define RX_ADR_WIDTH 5#define TX_PLOAD_WIDTH 32#define RX_PLOAD_WIDTH 32unsbit RX_DR = sta^6;sbit TX_DS = sta^5;sbit MAX_RT = sta^4;bit flag = 0;bit cnt = 0;unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0x00, 0x01, 0x02, 0x03, 0x04,0x05, 0x06, 0x07, 0x08, 0x09,0x0a, 0x0b, 0x0c, 0x0d, 0x0e,0x0f, 0x10, 0x11, 0x12, 0x13,0x14, 0x15, 0x16, 0x17, 0x18,0x19, 0x1a, 0x1b, 0x1c, 0x1d,0x1e, 0x1f};//发送数据unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据/*--NRF24L01寄存器指令----------------------------------------------*/#define READ_REG 0x00//读配置寄存器指令#define WRITE_REG 0x20//写配置寄存器指令#define RD_RX_PLOAD 0x61//读接收数据#define WR_TX_PLOAD 0xa0//写待发数据#define FLUSH_TX 0xe1//清除发送FIFO寄存器#define FLUSH_RX 0xe2//清除接受FIFO寄存器#define REUSE_TX_PL 0xe3//定义重复装载数据指令#define NOP 0xff//保留/*--SPI 寄存器地址--------------------------------------------------*/#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01//自动应答功能设置#define EN_RXADDR 0x02//可用信道设置#define SETUP_AW 0x03//收发地址宽度设置#define SETUP_RETR 0x04//自动重发功能设置#define RF_CH 0x05//工作频率设置#define RF_SETUP 0x06//发射速率、功耗功能设置#define STATUS 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栈入栈出状态寄存器设置void Delay_us(unsigned int time){while(time - 1){time --;}}unsigned char SPI_RW(unsigned char byte) {unsigned Bit_Cfor(Bit_Count = 0; Bit_Count & 8; Bit_Count++){MOSI = (byte & 0x80); byte = (byte && 1);SCK = 1;byte |= MISO;SCK = 0;}return(byte);}void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num){unsigned char Byte_CCSN = 0;SPI_RW(address);for(Byte_Count = 0; Byte_Count & Byte_N Byte_Count++){SPI_RW(*pBuf++);}CSN = 1;}unsigned char SPI_RW_Reg(unsigned char address, unsigned char command){CSN = 0;SPI_RW(address);status = SPI_RW(command);CSN = 1;return(status);}void Init_NRF24L01(void){CE = 0;CSN = 1;SCK = 0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);SPI_RW_Reg(WRITE_REG + RF_CH, 0);SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);CE = 1;}void mode1(){CE = 0;SPI_Write_Buf(WR_TX_PLOAD, Tx_Buf, TX_PLOAD_WIDTH);CE = 1;Delay_us(200);CE = 0;SPI_RW_Reg(FLUSH_TX, 0x00);sta = SPI_RW_Reg(READ_REG+FIFO_STATUS,0x00);//发送 TxBuf 中的数据SPI_RW_Reg(WRITE_REG+STATUS, 0xff);//清除状态标志CE = 1;}void main(void){unsigned char temp = 0;CLK_DIV |= 0x01;LED = 1;Init_NRF24L01();while (1){mode1();if(!sta^4){LED = 0;}else{LED = 1;}}}
三楼接收机程序3.3v 5v vcc各接了104,470电容。接了一个LED小灯,晶振12.000,P0口接的是数码管,P1口接的是NRF6个引脚,P2口接的是共阳引脚。#include&STC12C5A60S2.h&sbit CE=P1^0;sbit CSN=P1^1;sbit SCK=P1^2;sbit MOSI=P1^3;sbit MISO=P1^4;sbit IRQ=P1^5;sbit LED=P3^7;#define TX_ADR_WIDTH 5#define RX_ADR_WIDTH 5#define TX_PLOAD_WIDTH 32#define RX_PLOAD_WIDTH 32
unssbit RX_DR = sta^6;sbit TX_DS = sta^5;sbit MAX_RT = sta^4;unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,0xee, 0xff};//发送数据unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};unsigned char LEDnum[]={0xff,0xff,0xff,0xff};unsigned char test1[] = {0x18, 0xba, 0x65, 0xdc};/*--NRF24L01寄存器指令----------------------------------------------*/#define READ_REG 0x00//读寄存器指令#define WRITE_REG 0x20//写寄存器指令#define RD_RX_PLOAD 0x61//读取接收数据指令#define WR_TX_PLOAD 0xa0//写待发数据指令#define FLUSH_TX 0xe1//冲洗发送FIFO指令#define FLUSH_RX 0xe2//冲洗接受FIFO指令#define REUSE_TX_PL 0xe3//定义重复装载数据指令#define NOP 0xff//保留/*--SPI 寄存器地址--------------------------------------------------*/#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01//自动应答功能设置#define EN_RXADDR 0x02//可用信道设置#define SETUP_AW 0x03//收发地址宽度设置#define SETUP_RETR 0x04//自动重发功能设置#define RF_CH 0x05//工作频率设置#define RF_SETUP 0x06//发射速率、功耗功能设置#define STATUS 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栈入栈出状态寄存器设置void Delay_us(unsigned char time){while(time){time --;}}unsigned char SPI_RW(unsigned char byte)
{unsigned Bit_Cfor(Bit_Count = 0; Bit_Count & 8; Bit_Count++){MOSI = (byte & 0x80);byte = (byte && 1);SCK = 1;byte |= MISO;SCK = 0;}return(byte);}unsigned char SPI_RW_Reg(unsigned char address, unsigned char command){CSN = 0;//CSN 拉低,启动SPI通信SPI_RW(address);//选择要操作的寄存器status = SPI_RW(command);//向选择的寄存器中写入数据CSN = 1;//CSN 拉高,终止SPI通信return(status);//返回2401 reg寄存器的状态}void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num){unsigned char Byte_CCSN = 0;SPI_RW(address);for(Byte_Count = 0; Byte_Count & Byte_N Byte_Count++){SPI_RW(pBuf[Byte_Count]);}CSN = 1;}void Init_NRF24L01(void){CE = 0;CSN = 1;SCK = 0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);SPI_RW_Reg(WRITE_REG + RF_CH, 0);SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);CE = 1;Delay_us(150);}unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num){unsigned char status, Byte_CCSN = 0;status = SPI_RW(reg);for(Byte_Count = 0; Byte_Count & Byte_N Byte_Count++){pBuf[Byte_Count] = SPI_RW(0x00);}CSN = 1;return(status);}void nRF24L01_RxPacket(unsigned char *rx_buf){CE = 0;sta = SPI_RW_Reg(READ_REG+STATUS, 0x00);if(sta==0x40){ LED = 0;SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG+STATUS, 0xff); Delay_us(150);}CE = 1;}void main(void){Delay_us(255);CLK_DIV |= 0x01;EA = 1;TMOD = 0x01;ET0 = 1;TH0 = 0TL0 = 0x17;TR0 = 1;P2M0 = 0x0f;P2M1 = 0x00; LED = 1;Init_NRF24L01();while(1){nRF24L01_RxPacket(Rx_Buf);LEDnum[0]=LEDchar[Rx_Buf[2]%16];LEDnum[1]=LEDchar[Rx_Buf[2]/16%16];LEDnum[2]=LEDchar[Rx_Buf[3]%16];LEDnum[3]=LEDchar[Rx_Buf[3]/16%16];} }void Interrupttimer0 () interrupt 1{TH0 = 0TL0 = 0x17;P0 = 0switch (pin){case 0: P2 &= 0xf0; P2 |= 0x01; pin++; P0 = LEDnum[0];case 1: P2 &= 0xf0; P2 |= 0x02; pin++; P0 = LEDnum[1];case 2: P2 &= 0xf0; P2 |= 0x04; pin++; P0 = LEDnum[2];case 3: P2 &= 0xf0; P2 |= 0x08; pin=0; P0 = LEDnum[3];default: }
从声音上听,两个发射器用同样的.c发射频率好像不一样。。。。。求解。。。
自己顶,直到问题解决
帮你顶,直到伸手成功。
手在伸长一些就解决了
我去,你既然没法接受怎么知道自己的发射程序是对的?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 nrf2401 的文章

 

随机推荐