大哥些,求助啊。关于NRF24L01+ 的问题,能发送,不能接收

jiangm55 2013-11-23 12:27:03
单片机:STC89C52RC 无线模块:NRF24L01+ (注意带加号)
本人在网上找了N多代码,就是不能成功。接收端始终接收不到数据包,接收端采用中断方式接收。
就是一个发一个收;
发送端初始化如下:
sbit IRQ =P3^2;
sbit MISO =P1^3;
sbit MOSI =P1^4;
sbit SCK =P1^5;
sbit CSN =P1^6;
sbit CE =P1^7;
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //


发送模式
void TX_Mode()
{
CE = 0;
inerDelay_us(10);
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);// 为了应答接收设备,接收通道0地址和发送地址相同
SPI_RW_Reg(WRITE_REG + EN_AA,0x00);// 0x01); // 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电
CE = 1;
inerDelay_us(130);
}
发送函数:
void nRF24L01_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); // 装载数据

CE=1; //置高CE,激发数据发送
inerDelay_us(100);
}


接收端:
sbit IRQ =P3^2;
sbit MISO =P1^3;
sbit MOSI =P1^4;
sbit SCK =P1^5;
sbit CSN =P1^6;
sbit CE =P1^7;
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //

接收模式设置:
void RX_Mode(void)
{
CE = 0;
inerDelay_us(100)
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//0x01); // 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40);//40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
CE = 1; // 拉高CE启动接收设备
inerDelay_us(200);
}
采用中断方式接收。IRQ连接P3^2引脚
void NRF_IRQ() interrupt 0 //视乎从来没有进入中断函数

{
cnt++;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(WRITE_REG+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
LCD_Clear();//清屏
LCD_Write_String(1,0,uchartostr(cnt,str))//只是看看收到有没有中断

if(cnt==250)
cnt=1;
Delay(10);

}
...全文
1032 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
香皂 2015-11-02
  • 打赏
  • 举报
回复
我的情况和你一样,但是我加了电容之后还是一样,没有解决
香皂 2015-11-02
  • 打赏
  • 举报
回复
我的情况和你一样,但是我加了电容之后还是一样,没有解决
香皂 2015-11-02
  • 打赏
  • 举报
回复
我的情况和你一样,但是我加了电容之后还是一样,没有解决
island0209 2014-01-16
  • 打赏
  • 举报
回复
发送端,CE=1后要判一下发送完了吗?发完要关闭CE脚的。否则耗电,也会对下次发送带来影响。 另外2.4G的周边电容很重要,摆放方式尽量按照参考设计来。
johnroot 2014-01-15
  • 打赏
  • 举报
回复
电源杂波影响很大(首先处理好滤波),CE = 0后延时100uS有改善、IO口加10K下拉电阻
Chaos? 2014-01-03
  • 打赏
  • 举报
回复
我也是你的问题,发送端一直正常发送,接收端IRQ引脚一直为高电平,就是没有中断产生。。。郁闷啊~楼主真是电源的问题吗???
jiangm55 2013-11-25
  • 打赏
  • 举报
回复
问题已经解决,电路问题,加个稳压电容就对了
jiangm55 2013-11-23
  • 打赏
  • 举报
回复
读了状态啊 ,以下十进制状态 STATUS:14 CONFIG:111 FIF0:17 CD:0(偶尔闪到1)
lbing7 2013-11-23
  • 打赏
  • 举报
回复
接收端配置接收状态后,读一下状态寄存器,确认芯片运行状态

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧