OpenEdv-开源电子网

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

STM32控制nrf24l10出现的问题,都头疼一个星期了。

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-8-16
在线时间
0 小时
发表于 2014-9-17 16:22:03 | 显示全部楼层 |阅读模式
5金钱
先讲一下整个过程。利用51控制nrf24l10发送数据,然后stm32控制nrf24l10接收。发送设置时发送32个字节,我在stm32接收程序中添加了一句中加了&nbsp;一句for(k=0;k&lt;32;k++)<br />
printf("the data is %d\t",tmp_buf[k]);<br />
现在情况是,通过按51板子上的按键可以向stm32发送数据,但是出现了两个大问题。一是发送32个字节,但是串口助手会收到64个字节,很奇怪。于是我在接收程序中添加了一个接收次数m,让串口助手显示m,发现m是2,也就是接收了两次。问题二:stm32总是接收上次按键按下发送的内容。比如,我设置按键1发送数组中第一个为1其他为0 ,设置按键2发送数组第二个位1其他为0。我按按键1,接收正确,但是再按按键2,出现上次发送的数据。再按才能出现按键2应该出现的内容。第三次如果按按键1,会出现按键2该出现的内容。<br />
一个星期,我快崩溃了。<br />
下面贴出代码:<br />
51单片机发送数据,其设置内容<br />
void nRF24L01_TxPacket(unsigned char * tx_buf)<br />
{<br />
CE=0;<br />
<br />
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); &nbsp; &nbsp;//&nbsp;<br />
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);&nbsp;<br />
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);&nbsp;<br />
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); &nbsp; &nbsp; &nbsp;//&nbsp;<br />
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); &nbsp;//&nbsp;<br />
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //<br />
SPI_RW_Reg(WRITE_REG + RF_CH, 40); &nbsp; &nbsp; &nbsp; &nbsp;//&nbsp;<br />
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); &nbsp; //&nbsp;<br />
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); &nbsp; &nbsp; //&nbsp;<br />
CE=1;<br />
inerDelay_us(10);<br />
<br />
sta=SPI_Read(STATUS);        // read register STATUS's value<br />
SPI_RW_Reg(WRITE_REG+STATUS,sta);        // clear interrupt flag(TX_DS)<br />
<br />
stm32接收端设置<br />
void NRF24L01_RX_Mode(void)<br />
{<br />
NRF24L01_CE=0;         &nbsp;<br />
&nbsp;         NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);<br />
&nbsp;<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); &nbsp;&nbsp;<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40); &nbsp; &nbsp;&nbsp;<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);<br />
&nbsp;         NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);<br />
&nbsp;         NRF24L01_CE = 1;<br />
}                                                &nbsp;<br />
接收程序<br />
u8 NRF24L01_RxPacket(u8 *rxbuf)<br />
{<br />
u8 sta;                 &nbsp; &nbsp;                                                         &nbsp;&nbsp;<br />
SPI2_SetSpeed(SPI_BaudRatePrescaler_8); &nbsp;&nbsp;<br />
sta=NRF24L01_Read_Reg(STATUS);&nbsp;<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);<br />
if(sta&amp;RX_OK)<br />
{<br />
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);<br />
NRF24L01_Write_Reg(FLUSH_RX,0xff);<br />
return 0;&nbsp;<br />
}         &nbsp;&nbsp;<br />
return 1;<br />
}                                        &nbsp; &nbsp;&nbsp;<br />
<br />
<br />
至于各个寄存器的地址都是一样的,这个我自己对了一遍。stm32就是原子中的源码,自己在主函数中添加了一段串口助手显示程序。<br />
while(1)<br />
{        u8 k; &nbsp;                 &nbsp; &nbsp;                 &nbsp; &nbsp;                                &nbsp;<br />
if(NRF24L01_RxPacket(tmp_buf)==0)<br />
{<br />
m++;<br />
tmp_buf[32]=0;<br />
LCD_ShowString(0,190,239,32,16,tmp_buf);&nbsp;<br />
for(k=0;k&lt;32;k++)<br />
printf("the data is %d\t",tmp_buf[k]);<br />
printf("the m is%d",m);<br />
}else delay_us(100);         &nbsp;&nbsp;<br />
t++;<br />
if(t==10000)<br />
{<br />
t=0;<br />
LED0=!LED0;<br />
}                                  &nbsp; &nbsp;<br />
}; <br />
<br />
<br />
求求给意见啊。谢谢啦。<br />
<br />
<br />

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-17 23:16:24 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-8-16
在线时间
0 小时
 楼主| 发表于 2014-9-18 09:00:01 | 显示全部楼层
回复【2楼】正点原子:
<br>-----------------------------
<br>今天早上第二个问题已解决了,是出在51程序上面,发现51发送程序少了清除发送缓存的内容,真是该死。
<br>void&nbsp;nRF24L01_TxPacket(unsigned&nbsp;char&nbsp;*&nbsp;tx_buf)
<br>{
<br>        CE=0;
<br>       
<br>        SPI_Write_Buf(WRITE_REG&nbsp;+&nbsp;TX_ADDR,&nbsp;TX_ADDRESS,&nbsp;TX_ADR_WIDTH);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;
<br>        SPI_Write_Buf(WRITE_REG&nbsp;+&nbsp;RX_ADDR_P0,&nbsp;TX_ADDRESS,&nbsp;TX_ADR_WIDTH);&nbsp;
<br>                SPI_Write_Buf(WR_TX_PLOAD,&nbsp;tx_buf,&nbsp;TX_PLOAD_WIDTH);&nbsp;
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;//&nbsp;
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;SETUP_RETR,&nbsp;0x1a);&nbsp;//
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_CH,&nbsp;40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_SETUP,&nbsp;0x0f);&nbsp;&nbsp;&nbsp;//&nbsp;
<br>        SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;CONFIG,&nbsp;0x0e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;
<br>        CE=1;
<br>        inerDelay_us(10);
<br>        while(IRQ!=0);
<br>        sta=SPI_Read(STATUS);        //&nbsp;read&nbsp;register&nbsp;STATUS's&nbsp;value
<br>        SPI_RW_Reg(WRITE_REG+STATUS,0xff);        //&nbsp;clear&nbsp;interrupt&nbsp;flag(TX_DS)
<br>        SPI_RW_Reg(FLUSH_TX,0x00);//这是添加的语句,
<br>}
<br>
<br>
<br>
<br>
<br>希望以后遇到这个问题同学能够及时看到,因为看到几个51控制nfr的程序中都没有这一项。好吧再来看看怎么解决第一个问题!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2014-9-18 14:13:43 | 显示全部楼层
回复【3楼】lixiang3700:
<br>---------------------------------
<br>能发送接收,问题就不大了,多检查一下代码。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-8-16
在线时间
0 小时
 楼主| 发表于 2014-9-18 19:17:36 | 显示全部楼层
回复【4楼】TinyBoy:
<br>---------------------------------
<br>这段时间一直再查,所有的设置都是正确,但是就是一下发送64个字节,但是我设置的是32个字节。搞不懂啊。快崩溃了。
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2014-9-19 08:28:09 | 显示全部楼层
回复【5楼】lixiang3700:
<br>---------------------------------
<br>
<br>检测是不是发送了2次。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 15:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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