完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
先讲一下整个过程。利用51控制nrf24l10发送数据,然后STM32控制nrf24l10接收。发送设置时发送32个字节,我在stm32接收程序中添加了一句中加了 一句for(k=0;k<32;k++)
printf("the data is %dt",tmp_buf[k]); 现在情况是,通过按51板子上的按键可以向stm32发送数据,但是出现了两个大问题。一是发送32个字节,但是串口助手会收到64个字节,很奇怪。于是我在接收程序中添加了一个接收次数m,让串口助手显示m,发现m是2,也就是接收了两次。问题二:stm32总是接收上次按键按下发送的内容。比如,我设置按键1发送数组中第一个为1其他为0 ,设置按键2发送数组第二个位1其他为0。我按按键1,接收正确,但是再按按键2,出现上次发送的数据。再按才能出现按键2应该出现的内容。第三次如果按按键1,会出现按键2该出现的内容。 一个星期,我快崩溃了。 下面贴出代码: 51单片机发送数据,其设置内容 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); 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, 0x0f); // SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CE=1; inerDelay_us(10); sta=SPI_Read(STATUS); // read register STATUS's value SPI_RW_Reg(WRITE_REG+STATUS,sta); // clear interrupt flag(TX_DS) stm32接收端设置 void NRF24L01_RX_Mode(void) { NRF24L01_CE=0; NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40); NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH); NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f); NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f); NRF24L01_CE = 1; } 接收程序 u8 NRF24L01_RxPacket(u8 *rxbuf) { u8 sta; SPI2_SetSpeed(SPI_BaudRatePrescaler_8); sta=NRF24L01_Read_Reg(STATUS); NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); if(sta&RX_OK) { NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH); NRF24L01_Write_Reg(FLUSH_RX,0xff); return 0; } return 1; } 至于各个寄存器的地址都是一样的,这个我自己对了一遍。stm32就是原子中的源码,自己在主函数中添加了一段串口助手显示程序。 while(1) { u8 k; if(NRF24L01_RxPacket(tmp_buf)==0) { m++; tmp_buf[32]=0; LCD_ShowString(0,190,239,32,16,tmp_buf); for(k=0;k<32;k++) printf("the data is %dt",tmp_buf[k]); printf("the m is%d",m); }else delay_us(100); t++; if(t==10000) { t=0; LED0=!LED0; } }; 求求给意见啊。谢谢啦。 |
|
相关推荐
5个回答
|
|
帮顶。。。。
|
|
|
|
回复【2楼】发烧友:
----------------------------- 今天早上第二个问题已解决了,是出在51程序上面,发现51发送程序少了清除发送缓存的内容,真是该死。 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); 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, 0x0f); // SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CE=1; inerDelay_us(10); while(IRQ!=0); sta=SPI_Read(STATUS); // read register STATUS's value SPI_RW_Reg(WRITE_REG+STATUS,0xff); // clear interrupt flag(TX_DS) SPI_RW_Reg(FLUSH_TX,0x00);//这是添加的语句, } 希望以后遇到这个问题同学能够及时看到,因为看到几个51控制nfr的程序中都没有这一项。好吧再来看看怎么解决第一个问题! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2543 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2331 浏览 5 评论
3156 浏览 3 评论
2801 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2759 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
608浏览 1评论
853浏览 0评论
966浏览 0评论
620浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 16:48 , Processed in 1.191273 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号