OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4844|回复: 0

求教:STM32与STC15L的NRF24L01无线通信收发问题!!

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-1-13
在线时间
3 小时
发表于 2013-1-13 16:11:57 | 显示全部楼层 |阅读模式
<p> 这两天在调试无线通信模块,选用NRF24L01,采用网上许多人的调试方式:关闭自动应答,让一方不停的发送,一方不停的接收,看STATUS状态。程序参考原子哥例程。目前调试出现这样一个非常奇怪的问题:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STM32发送,STC15L接收,通道0模式,发送数据正常(以LED标志),但反过来,以STC15L发送,STM32接收,却始终得不到结果;寄存器配置上相互参照,非常奇怪,怎么也出不来!下面贴上发送、接收端的配置:(STM32下,STC15L下配置一样)<br />
/*******************************************************************************<br />
* 函数名&nbsp; : NRF24L01_TxPacket<br />
* 功能描述: 启动NRF24L01发送一次数据<br />
* 输入参数: 待发送数据首地址<br />
* 输出参数:发送状态<br />
*******************************************************************************/<br />
uint8_t NRF24L01_TxPacket(uint8_t *txbuf)<br />
{<br />
&nbsp; <br />
&nbsp;NRF24L01_CE_L;<br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);&nbsp;/*写数据到 txbuf 32个字节*/<br />
&nbsp;&nbsp;NRF24L01_CE_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*启动发送*/&nbsp;&nbsp;&nbsp; <br />
&nbsp;while(NRF24L01_IRQ);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*等待发送完成*/<br />
&nbsp;status=NRF24L01_Read_Reg(STATUS);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*读取状态寄存器的值*/&nbsp;&nbsp;&nbsp; <br />
&nbsp;FIFO_Reg=NRF24L01_Read_Reg(NRF_FIFO_STATUS);<br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,status);&nbsp;&nbsp;&nbsp;&nbsp; /*清除TX_DS或MAX_RT中断标志*/<br />
&nbsp;if(status&amp;MAX_TX)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*达到最大重发次数*/<br />
&nbsp;{<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_TX,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*清除TX FIFO寄存器*/ <br />
&nbsp;&nbsp;return MAX_TX; <br />
&nbsp;}<br />
&nbsp;else if(status&amp;TX_OK)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*发送完成*/<br />
&nbsp;{<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_TX,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*清除TX FIFO寄存器*/<br />
&nbsp;&nbsp;return TX_OK;<br />
&nbsp;}<br />
&nbsp;else <br />
&nbsp;&nbsp;return 0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*其他原因发送失败*/<br />
}<br />
/*******************************************************************************<br />
* 函数名&nbsp; : NRF24L01_RxPacket<br />
* 功能描述: 启动NRF24L01接收一次数据<br />
* 输入参数: 待接收数据首地址<br />
* 输出参数:接收状态<br />
*******************************************************************************/<br />
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf)<br />
{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;status=NRF24L01_Read_Reg(STATUS);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*读取状态寄存器的值*/<br />
&nbsp;FIFO_Reg=NRF24L01_Read_Reg(NRF_FIFO_STATUS);&nbsp; &nbsp; <br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,status); /*清除RX_DR中断标志*/<br />
&nbsp;if(status&amp;RX_OK)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*接收到数据*/<br />
&nbsp;{<br />
&nbsp;&nbsp;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);/*读取数据*/<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_RX,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*清除RX FIFO寄存器*/ <br />
&nbsp;&nbsp;return RX_OK; <br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
&nbsp;else<br />
&nbsp;&nbsp;return 0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*没收到任何数据*/<br />
}<br />
/*******************************************************************************<br />
* 函数名&nbsp; : NRF24L01_RX_Mode<br />
* 功能描述: 初始化NRF24L01到接收模式,<br />
&nbsp;&nbsp;&nbsp;设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR<br />
&nbsp;&nbsp;&nbsp;当CE变高后,即进入RX模式,并可以接收数据<br />
* 输入参数: 无<br />
* 输出参数:无<br />
*******************************************************************************/&nbsp;&nbsp;&nbsp;&nbsp; <br />
void NRF24L01_RX_Mode(void)<br />
{<br />
&nbsp;NRF24L01_CE_L;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);/*写RX节点地址,接收数据宽度*/<br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp;<span style="color:#e53333;">NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x00);&nbsp;&nbsp;&nbsp; /*使能通道0的自动应答*/&nbsp;&nbsp;&nbsp;</span> <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);/*使能通道0的接收地址*/&nbsp; &nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*设置RF通道频率*/&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,TX_PLOAD_WIDTH);/*选择通道0的有效数据宽度*/ &nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07); /*设置RX发射参数,0db增益,1Mbps,低噪声增益开启*/&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);&nbsp; /*配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式 */<br />
&nbsp; &nbsp;NRF24L01_CE_H; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*CE为高,进入接收模式*/ <br />
&nbsp;Delay(250);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*130us后接收*/<br />
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
/*******************************************************************************<br />
* 函数名&nbsp; : NRF24L01_TX_Mode<br />
* 功能描述: 初始化NRF24L01到发送模式,<br />
&nbsp;&nbsp;&nbsp;设置TX地址,写TX数据宽度,选择RF频道,波特率和LNA HCURR<br />
&nbsp;&nbsp;&nbsp;当CE变高10us后,即进入TX模式,发送数据<br />
* 输入参数: 无<br />
* 输出参数:无<br />
*******************************************************************************/&nbsp; <br />
void NRF24L01_TX_Mode(void)<br />
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;NRF24L01_CE_L;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);&nbsp;&nbsp;&nbsp; /*写TX节点地址*/ <br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH); /*设置TX节点地址,主要为了使能ACK*/&nbsp;&nbsp; </p>
<p>&nbsp; &nbsp;<span style="color:#e53333;">NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x00);&nbsp;&nbsp;&nbsp;&nbsp; /*使能通道0的自动应答*/&nbsp;&nbsp;&nbsp; </span><br />
<span style="color:#e53333;">&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x00); /*使能通道0的接收地址*/&nbsp; </span><br />
<span style="color:#e53333;">&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x00);/*设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次*/</span><br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*设置RF通道工作频率为40*/<br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07);&nbsp; /*设置TX发射参数,0db增益,2Mbps,低噪声增益开启*/&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e);&nbsp;&nbsp;&nbsp; /*配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断*/<br />
&nbsp;NRF24L01_CE_H;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*CE为高,10us后启动发送*/<br />
&nbsp;Delay(10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*10us后发送*/<br />
}<br />
/*结束*/<br />
在主程序就是简单的调用发送、接收包程序。原子哥帮忙看看问题出在哪?调试2天了...<br />
</p>
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表