新手求助,NRF24L01java后端接收json数据不了数据

NRF24L01无线发射简易教程_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
NRF24L01无线发射简易教程
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩18页未读,
定制HR最喜欢的简历
你可能喜欢查看: 508|回复: 3
新手求助,NRF24L01接收不了数据
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间6 小时
我把Mini的程序移植到了C8T6,但一直显示无法成功通信。看了下论坛的帖子,把发送端的程序改成了如下语句&&
& &&&SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);& && && &&&//失能通道0自动应答
& &&&SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);& & //失能接收通道0
& &&&SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);& && &//失能自动重发
显示发送端可以成功发送数据,说明发送端没问题。但是接送端也同样按照那个帖子改成
& && &SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);& && && &&&//失能通道0自动应答
& && &SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);& & //接收要使能接收通道0
却没有办法接收数据,但是检测确是通过的。瞅了半天也不知道是哪里出了问题,求助大佬们这是怎么回事?
我们例程, 你试试 不改驱动,改接口代码即可。
主题帖子精华
金钱128720
在线时间1145 小时
我们例程, 你试试 不改驱动,改接口代码即可。
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间6 小时
本帖最后由 咸水河鱼 于
15:02 编辑
[C] 纯文本查看 复制代码#include &24l01.h&
#include &spi.h&
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
NRF24L01_CSN=0;
//使能SPI传输
status =SPI1_ReadWriteByte(reg);//发送寄存器号
SPI1_ReadWriteByte(value);
//写入寄存器的值
NRF24L01_CSN=1;
//禁止SPI传输
return(status);
//返回状态值
//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
NRF24L01_CSN = 0;
//使能SPI传输
SPI1_ReadWriteByte(reg);
//发送寄存器号
reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容
NRF24L01_CSN = 1;
//禁止SPI传输
return(reg_val);
//返回状态值
//在指定位置读出指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
u8 status,u8_
NRF24L01_CSN = 0;
//使能SPI传输
status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
for(u8_ctr=0;u8_ctr&u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//读出数据
NRF24L01_CSN=1;
//关闭SPI传输
//返回读到的状态值
//在指定位置写指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
u8 status,u8_
NRF24L01_CSN = 0;
//使能SPI传输
status = SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
for(u8_ctr=0; u8_ctr& u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //写入数据
NRF24L01_CSN = 1;
//关闭SPI传输
//返回读到的状态值
//初始化24L01的IO口
void NRF24L01_IO_Init(void)
GPIO_InitTypeDef GPIO_InitS
SPI_InitTypeDef
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
//PF8 9 推挽
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化指定IO
GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);//PF0 1下拉
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA4 输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//PA4下拉
SPI1_Init();
//初始化SPI
SPI_Cmd(SPI1, DISABLE); // SPI外设不使能
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD
//SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_M
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
//发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_L
//时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1E
//数据捕获于第1个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_S
//NSS信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
//定义波特率预分频的值:波特率预分频值为16
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;
//CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);
//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
//使能24L01
NRF24L01_CSN=1;
//SPI片选取消
void NRF24L01_Init(void)
NRF24L01_IO_Init();
NRF24L01_CE=0;
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA, 0x00);
//NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);
//使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);
//设置RF通信频率
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_CE=1;
//检测24L01是否存在
//返回值:0,成功;1,失败
u8 NRF24L01_Check(void)
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址
for(i=0;i&5;i++)if(buf!=0XA5)
if(i!=5)return 1;//检测24L01错误
//检测到24L01
//该函数初始化NRF24L01到RX模式
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
//当CE变高后,即进入RX模式,并可以接收数据了
void NRF24L01_RX_Mode(void)
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址,主要为了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_CE = 1; //CE为高,进入接收模式
//该函数初始化NRF24L01到TX模式
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR
//PWR_UP,CRC使能
//当CE变高后,即进入RX模式,并可以接收数据了
//CE为高大于10us,则启动发送.
void NRF24L01_TX_Mode(void)
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86最大自动重发次数:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);
//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
NRF24L01_CE=1;//CE为高,10us后启动发送
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, (u8*)TX_ADDRESS, TX_ADR_WIDTH);
// 装载帧头(对方的)地址
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF
NRF24L01_CE=1;//启动发送
while(NRF24L01_IRQ!=0);//等待发送完成
sta=NRF24L01_Read_Reg(STATUS);
//读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
if(sta&TX_OK)//发送完成
return TX_OK;
return 0//其他原因发送失败
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
sta=NRF24L01_Read_Reg(STATUS);
//读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
return RX_OK;
return 0//没收到任何数据
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间6 小时
我们例程, 你试试 不改驱动,改接口代码即可。
咦就好了!谢谢原子哥了,顺便再问问现在收发可以正常进行了,但是时不时就会出现丢包的情况,还有就是会有个一两秒的延迟,这个情况有办法改善吗
Powered by查看: 3009|回复: 8
nrf24l01发送模式的问题(求助)
nrf24l01所在的发射端,mcu一轮只能将1个字节的数据给24l01的缓冲区,假如我设定24l01de有效负载为3个字节,那么24l01是等3个字节满了再整体发送给接收端,还是先发1个字节给接收端,再等mcu给数据再发送下一个字节
是整体发送的
拿最简单的51来说,把你要发送的数据保存在一个数组里,然后将需要发送的数据写入数组,然后IO口模拟SPI时序,看DATASHEET些个发送函数,指针指向发送数组,main函数引用发送函数,就将数据发送出去了,接受段会依据地址接受的
蓝天de梦 发表于
拿最简单的51来说,把你要发送的数据保存在一个数组里,然后将需要发送的数据写入数组,然后IO口模拟SPI时序 ...
如果我用m8的硬件spi来做,好像只能一次发8位,这种情况怎么办?还是不管硬件,直接来个模拟spi。
jp_mx 发表于
如果我用m8的硬件spi来做,好像只能一次发8位,这种情况怎么办?还是不管硬件,直接来个模拟spi。
MEGA8有硬件SPI最好,比模拟的更快更稳,不需要IO模拟。SPI只是一种协议罢了,不是只能发一位,单个字节的话当然是8位一字节啦!但是要明白数据包和几个字节的区别。刚说了,建个数组,把要发送的数据写入数组,然后通过发送函数以SPI 时序发送,它会自动将数组里的几个数据发出去的,这是我写的发送函数。
其中的*tx_buf就是指针指向的发送数组TX_BUF[];
void TxPacket(unsigned char *tx_buf)
& & & & CE=0;
&&& & & & 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);
& & & & SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
& & & & SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
& & & & CE=1;
& & & & Delay_ms(50);
& & & & CE = 0;
& & & & while(IRQ);
& & & & sta=SPI_Read(STATUS);
& & & & if(TX_DS)
& & & & & & & & SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
& & & & & & & & CSN = 0;
& & & & & & & & SPI_RW(FLUSH_TX);
& & & & & & & & CSN = 1;
& & & & & & & & IRQ = 1;
& & & & & & & & Delay_us(100);
蓝天de梦 发表于
MEGA8有硬件SPI最好,比模拟的更快更稳,不需要IO模拟。SPI只是一种协议罢了,不是只能发一位,单个字节的 ...
噢,这样,太感谢了
蓝天de梦 发表于
MEGA8有硬件SPI最好,比模拟的更快更稳,不需要IO模拟。SPI只是一种协议罢了,不是只能发一位,单个字节的 ...
问下你那个程序,你那里是不是每次调用都要设置CE,接收端的地址那些。我在网上看的程序都是初始化才设置CE的,后面都不用改
jp_mx 发表于
问下你那个程序,你那里是不是每次调用都要设置CE,接收端的地址那些。我在网上看的程序都是初始化才设置 ...
地址初始化的时候设置一次就可以了,CE可以设置一次,但是模拟需要IRQ中断来告诉51时序,之前我CE不置位貌似也可以用,但是不稳定
蓝天de梦 发表于
地址初始化的时候设置一次就可以了,CE可以设置一次,但是模拟需要IRQ中断来告诉51时序,之前我CE不置位貌 ...
高手呀,哈哈~
Powered by求助:nrf24l01无法实现通信,急求答案~~~~ - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求助:nrf24l01无法实现通信,急求答案~~~~
15:50:13  
网购了两个nRF24l01模块,想做无线收发功能,控制器分别为89C52和STC12c5A60s2,无线模块接口接在P0口,IRQ接到P3^2,求助,接收端收不到信息,附程序,求大神解释一下~~~~~好几天还没解决;
接收端程序:
#include&reg52.h&
#include&api.h&
#define uint unsigned int
#define uchar unsigned char
#define LED P1
sbit key=P3^7;
/***************************************************/
#define TX_ADR_WIDTH& &5&&// 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4&&// 数据通道有效数据宽度
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};&&// 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar DATA = 0x01;
sbit&&RX_DR& &&&= sta^6;
sbit&&TX_DS& &&&= sta^5;
sbit&&MAX_RT = sta^4;
/**************************************************
函数: init_io()
& & 初始化IO
/**************************************************/
void init_io(void)
& & CE&&= 0;& && &&&// 待机
& & CSN = 1;& && &&&// SPI禁止
& & SCK = 0;& && &&&// SPI时钟置低
& & IRQ = 1;& && &&&// 中断复位
//& & LED = 0& && &&&// 关闭指示灯
/**************************************************
函数:delay()
描述:延时函数
**************************************************/
void delay(uint z)
& & while(z--)
& && &&&for(x=110;x&0;x--);
/**************************************************
函数:SPI_RW()
& & 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
& & 读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
& & for(i=0;i&8;i++)
& && &&&MOSI=(byte&0x80);
& && &&&byte&&=1;
& && &&&SCK=1;
& && &&&byte|=MISO;
& && &&&SCK=0;
& & return (byte);
/**************************************************
函数:SPI_RW_Reg()
& & 写数据value到reg寄存器
/**************************************************/
uchar SPI_RW_REG(uchar reg,uchar value)
& & CSN=0;
& & status=SPI_RW(reg);
& & SPI_RW(value);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Read()
& & 从reg寄存器读一字节
/**************************************************/
uchar SPI_READ(uchar reg)
& & uchar status,reg_
& & CSN=0;
& & SPI_RW(reg);
& & reg_val=SPI_RW(0);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Read_Buf()
& & 从reg寄存器读出bytes个字节,通常用来读取接收通道
& & 数据或接收/发送地址
/**************************************************/
uchar SPI_READ_BUF(uchar reg,uchar *pBUF,uchar byte)
& & uchar status,i;
& & CSN=0;
& & status=SPI_RW(reg);
& & for(i=0;i&i++)
& && &&&pBUF=SPI_RW(0);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Write_Buf()
& & 把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
& & 射通道数据或接收/发送地址
/**************************************************/
uchar SPI_WRITE_BUF(uchar reg,uchar *pBUF,uchar byte)
& & uchar status,i;
& & CSN=0;
& & status=SPI_RW(reg);
& & for(i=0;i&i++)
& && &&&SPI_RW(*pBUF++);
& & CSN=1;
& & return(status);& &
/**************************************************
函数:RX_Mode()
& & 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
/**************************************************/
void RX_MODE()
& & SPI_WRITE_BUF(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
& & SPI_RW_REG(WRITE_REG+EN_AA,0X01);
& & SPI_RW_REG(WRITE_REG+EN_RXADDR,0X01);
& & SPI_RW_REG(WRITE_REG+RF_CH,40);
& & SPI_RW_REG(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);
& & SPI_RW_REG(WRITE_REG+RF_SETUP,0X07);
& & SPI_RW_REG(WRITE_REG+CONFIG,0x0f);
/**************************************************
函数:TX_Mode()
& & 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
& & 130us后启动发射,数据发送结束后,发送模块自动转入接收
& & 模式等待应答信号。
/**************************************************/
void TX_MODE(uchar *BUF)
& & 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);
& & SPI_WRITE_BUF(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);
& & SPI_RW_REG(WRITE_REG+EN_AA,0X01);
& & SPI_RW_REG(WRITE_REG+EN_RXADDR,0X01);
& & SPI_RW_REG(WRITE_REG+SETUP_RETR,0X1A);
& & SPI_RW_REG(WRITE_REG+RF_CH,40);
& & SPI_RW_REG(WRITE_REG+RF_SETUP,0X07);
& & SPI_RW_REG(WRITE_REG+CONFIG,0x0E);
/**************************************************
函数:Check_ACK()
& & 检查接收设备有无接收到数据包,设定没有收到应答信
& & 号是否重发
/**************************************************/
uchar Check_ACK(bit clear)
& & while(IRQ);
& & sta = SPI_RW(NOP);& && && && && && &&&// 返回状态寄存器
& & if(MAX_RT)
& && &&&if(clear)& && && && && && && && & // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
& && && && &SPI_RW(FLUSH_TX);
& & SPI_RW_REG(WRITE_REG + STATUS, sta);&&// 清除TX_DS或MAX_RT中断标志
& & IRQ = 1;
& & if(TX_DS)
& && &&&return(0x00);
& && &&&return(0xff);
/**************************************************
函数:keyscan()
描述:检测是否有按键按下,按下则发送一字节数据
**************************************************
void keyscan()
& & if(key==0)
& && &&&delay(5);
& && &&&if(key==0)
& && && && &TX_BUF[0]=~DATA;
& && && && &TX_MODE(TX_BUF);
& && && && &LED=~DATA;
& && && && &Check_ACK(1);
& && && && &delay(500);
& && && && &LED=0XFF;
& && && && &while(!key);
& && && && &DATA&&=1;
& && && && &if(!DATA)
& && && && && & DATA=0x01;& &
************************************************/
void main()
& & init_io();
& & RX_MODE();
& & while(1)
& && &&&sta=SPI_READ(STATUS);
& && &&&if(RX_DR)
& && && && &SPI_READ_BUF(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);
& && && && &flag=1;
& && &&&SPI_RW_REG(WRITE_REG+STATUS,sta);
& && &&&if(flag)
& && && && &flag=0;
& && && && &LED=RX_BUF[0];
& && &&&}& && && && &
发送端程序
#include&reg52.h&
#include&api.h&
#define uint unsigned int
#define uchar unsigned char
#define LED P1
sbit key=P3^7;
//sbit beep=P2^5;
//sbit wela=P2^6;
//sbit dula=P2^7;
/***************************************************/
#define TX_ADR_WIDTH& &5&&// 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4&&// 数据通道有效数据宽度
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};&&// 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar DATA = 0x01;
sbit&&RX_DR& &&&= sta^6;
sbit&&TX_DS& &&&= sta^5;
sbit&&MAX_RT = sta^4;
/**************************************************
函数: init_io()
& & 初始化IO
/**************************************************/
void init_io(void)
& &// dula=0;
& &// wela=0;
& & CE&&= 0;& && &&&// 待机
& & CSN = 1;& && &&&// SPI禁止
& & SCK = 0;& && &&&// SPI时钟置低
& & IRQ = 1;& && &&&// 中断复位
//& & LED = 0& && &&&// 关闭指示灯
/**************************************************
函数:delay()
描述:延时函数
**************************************************/
void delay(uint z)
& & while(z--)
& && &&&for(x=110;x&0;x--);
/**************************************************
函数:SPI_RW()
& & 根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
& & 读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
& & for(i=0;i&8;i++)
& && &&&MOSI=(byte&0x80);
& && &&&byte&&=1;
& && &&&SCK=1;
& && &&&byte|=MISO;
& && &&&SCK=0;
& & return (byte);
/**************************************************
函数:SPI_RW_Reg()
& & 写数据value到reg寄存器
/**************************************************/
uchar SPI_RW_REG(uchar reg,uchar value)
& & CSN=0;
& & status=SPI_RW(reg);
& & SPI_RW(value);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Read()
& & 从reg寄存器读一字节
/**************************************************/
uchar SPI_READ(uchar reg)
& & uchar status,reg_
& & CSN=0;
& & SPI_RW(reg);
& & reg_val=SPI_RW(0);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Read_Buf()
& & 从reg寄存器读出bytes个字节,通常用来读取接收通道
& & 数据或接收/发送地址
/**************************************************/
uchar SPI_READ_BUF(uchar reg,uchar *pBUF,uchar byte)
& & uchar status,i;
& & CSN=0;
& & status=SPI_RW(reg);
& & for(i=0;i&i++)
& && &&&pBUF=SPI_RW(0);
& & CSN=1;
& & return(status);
/**************************************************
函数:SPI_Write_Buf()
& & 把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
& & 射通道数据或接收/发送地址
/**************************************************/
uchar SPI_WRITE_BUF(uchar reg,uchar *pBUF,uchar byte)
& & uchar status,i;
& & CSN=0;
& & status=SPI_RW(reg);
& & for(i=0;i&i++)
& && &&&SPI_RW(pBUF);
& & CSN=1;
& & return(status);& &
/**************************************************
函数:RX_Mode()
& & 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
/**************************************************/
void RX_MODE()
& & SPI_WRITE_BUF(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
& & SPI_RW_REG(WRITE_REG+EN_AA,0X01);
& & SPI_RW_REG(WRITE_REG+EN_RXADDR,0X01);
& & SPI_RW_REG(WRITE_REG+RF_CH,40);
& & SPI_RW_REG(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);
& & SPI_RW_REG(WRITE_REG+RF_SETUP,0X07);
& & SPI_RW_REG(WRITE_REG+CONFIG,0x0f);
/**************************************************
函数:TX_Mode()
& & 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
& & 130us后启动发射,数据发送结束后,发送模块自动转入接收
& & 模式等待应答信号。
/**************************************************/
void TX_MODE(uchar *BUF)
& & 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);
& & SPI_WRITE_BUF(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);
& & SPI_RW_REG(WRITE_REG+EN_AA,0X01);
& & SPI_RW_REG(WRITE_REG+EN_RXADDR,0X01);
& & SPI_RW_REG(WRITE_REG+SETUP_RETR,0X0A);
& & SPI_RW_REG(WRITE_REG+RF_CH,40);
& & SPI_RW_REG(WRITE_REG+RF_SETUP,0X07);
& & SPI_RW_REG(WRITE_REG+CONFIG,0x0e);
/**************************************************
函数:Check_ACK()
& & 检查接收设备有无接收到数据包,设定没有收到应答信
& & 号是否重发
/**************************************************/
uchar Check_ACK(bit clear)
& & while(IRQ);
& & sta = SPI_RW(NOP);& && && && && && &&&// 返回状态寄存器
& & if(MAX_RT)
& && &&&if(clear)& && && && && && && && & // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
& && && && &SPI_RW(FLUSH_TX);
& & SPI_RW_REG(WRITE_REG + STATUS, sta);&&// 清除TX_DS或MAX_RT中断标志
& & IRQ = 1;
& & if(TX_DS)
& && &&&return(0x00);
& && &&&return(0xff);
/**************************************************
函数:keyscan()
描述:检测是否有按键按下,按下则发送一字节数据
**************************************************/
void keyscan()
& & if(key==0)
& && &&&delay(5);
& && &&&if(key==0)
& && && && &TX_BUF[0]=~DATA;
& && && && &TX_MODE(TX_BUF);
& && && && &LED=~DATA;
& && && && &Check_ACK(1);
& && && && &delay(500);
& && && && &LED=0XFF;
& && && && &while(!key);
& && && && &DATA&&=1;
& && && && &if(!DATA)
& && && && && & DATA=0x01;& &
void main()
& & init_io();
//& & TX_MODE();
& & while(1)
& && &&&keyscan();& &
nRF24l01头文件
#ifndef _API_DEF_
#define _API_DEF_
// Define interface to nRF24L01
// Define SPI pins
sbit CE& &= P1^0;&&// Chip Enable pin signal (output)
sbit CSN&&= P1^1;&&// Slave Select pin, (output to CSN, nRF24L01)
sbit IRQ&&= P1^3;&&// Interrupt signal, from nRF24L01 (input)
sbit MISO = P1^4;&&// Master In, Slave Out pin (input)
sbit MOSI = P1^5;&&// Serial Clock pin, (output)
sbit SCK&&= P1^7;&&// Master Out, Slave In pin (output)
// SPI(nRF24L01) commands
#define READ_REG& & 0x00&&// Define read command to register
#define WRITE_REG& &0x20&&// Define write command to register
#define RD_RX_PLOAD 0x61&&// Define RX payload register address
#define WR_TX_PLOAD 0xA0&&// Define TX payload register address
#define FLUSH_TX& & 0xE1&&// Define flush TX register command
#define FLUSH_RX& & 0xE2&&// Define flush RX register command
#define REUSE_TX_PL 0xE3&&// Define reuse TX payload register command
#define NOP& && && &0xFF&&// Define No Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG& && &0x00&&// 'Config' register address
#define EN_AA& && & 0x01&&// 'Enable Auto Acknowledgment' register address
#define EN_RXADDR& &0x02&&// 'Enabled RX addresses' register address
#define SETUP_AW& & 0x03&&// 'Setup address width' register address
#define SETUP_RETR&&0x04&&// 'Setup Auto. Retrans' register address
#define RF_CH& && & 0x05&&// 'RF channel' register address
#define RF_SETUP& & 0x06&&// 'RF setup' register address
#define STATUS& && &0x07&&// 'Status' register address
#define OBSERVE_TX&&0x08&&// 'Observe TX' register address
#define CD& && && & 0x09&&// 'Carrier Detect' register address
#define RX_ADDR_P0&&0x0A&&// 'RX address pipe0' register address
#define RX_ADDR_P1&&0x0B&&// 'RX address pipe1' register address
#define RX_ADDR_P2&&0x0C&&// 'RX address pipe2' register address
#define RX_ADDR_P3&&0x0D&&// 'RX address pipe3' register address
#define RX_ADDR_P4&&0x0E&&// 'RX address pipe4' register address
#define RX_ADDR_P5&&0x0F&&// 'RX address pipe5' register address
#define TX_ADDR& &&&0x10&&// 'TX address' register address
#define RX_PW_P0& & 0x11&&// 'RX payload width, pipe0' register address
#define RX_PW_P1& & 0x12&&// 'RX payload width, pipe1' register address
#define RX_PW_P2& & 0x13&&// 'RX payload width, pipe2' register address
#define RX_PW_P3& & 0x14&&// 'RX payload width, pipe3' register address
#define RX_PW_P4& & 0x15&&// 'RX payload width, pipe4' register address
#define RX_PW_P5& & 0x16&&// 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17&&// 'FIFO Status Register' register address
#endif& &/* _API_DEF_ */
17:44:06  
这位朋友,我告你程序怎么调试。
首先排除硬件的问题,然后再修改程序。
做程序,不管多么简单,千万不要一下子把功能都写出来,要步步为营。一步一步来,看着慢,其实快。
硬件排除,89C52的P0口内部没有上拉电阻,需要外部接10K的上拉电阻,你接了吗?你写一个最简单的程序,把P0.1搞成高电平,用万用表量一下电平是不是高电平,再写一个程序把P0.1脚搞成低电平,用万用表量一下是不是低电平。
软件排除,给NRF24L01的寄存器里面写一个数据,再读出来,看看写进去的数和读出来的一样不?如果一样,再往下谈配置。如果不一样,你先搞成一样的吧,不一样,说明SPI通信都不对,更谈不上无线收发数据了。
上一步完成,你就可以配置NRF24L01了,两个NRF24L01通信需要满足的条件有:
& & 发射接收数据宽度相同(1~32个字节)
& & 发射接收地址相同(5个8位地址)
& & 发射接收频道相同(0~125)
& & 发射接收速率相同(2M 1M 250K)
看看你的是不是一样?
17:48:43  
我曾经写过一个比较完整的NRF24L01的资料,你看看
rationmcu.com/elecjc/226.html
10:30:49  
有加中断、加状态寄存器标志位清除吗?
10:32:42  
其实不建议你用STC的单片机调试nrf24l01,不能仿真,我用ARM、430、飞思卡尔等单片机都写过nrf,会出现比较多问题,但是仿真调试还是方便解决的
13:48:23  
其实不建议你用STC的单片机调试nrf24l01,不能仿真,我用ARM、430、飞思卡尔等单片机都写过nrf,会出现比较多问题,但是仿真调试还是方便解决的
您好 请问您做过飞思卡尔单片机吗,可以发源程序看一下吗&&谢谢了
等待验证会员
15:20:19  
这位朋友,我告你程序怎么调试。
首先排除硬件的问题,然后再修改程序。
做程序,不管多么简单,千万不要一下子把功能都写出来,要步步为营。一步一步来,看着慢,其实快。
思路是对的,但是依然接收不到数据
等待验证会员
14:06:28  
其实不建议你用STC的单片机调试nrf24l01,不能仿真,我用ARM、430、飞思卡尔等单片机都写过nrf,会出现比较多问题,但是仿真调试还是方便解决的
你好&&我用430单片机写无线通信的程序&&也接收不到数据&&能加你联系方式具体聊一下么&&我QQ;
等待验证会员
19:24:58  
能解决仿真吗?protuse一直找不到合适的封装库
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 c 接收post数据 的文章

 

随机推荐