完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
请教各位:
最近调NRF24L01,发现NRF24L01只能上电之后接收一次(模拟SPI),从网上查了之后,也已经清空接收缓冲去了,电源也已经加了滤波电容,不知道还会有什么原因? /* 接收端初始化 */ void RX_Mode(void) { CE_Low; //CE=0; delay1us(10); SPI_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, RX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(NRF_WRITE_REG + EN_AA, 0x01); // Enable Auto.Ackipe0 SPI_RW_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0 SPI_RW_Reg(NRF_WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans... SPI_RW_Reg(NRF_WRITE_REG + RF_CH, 40); // Select RF channel 40 SPI_RW_Reg(NRF_WRITE_REG + RX_PW_P0,TX_PLOAD_WIDTH);//选择通道0的有效数据宽度 SPI_RW_Reg(NRF_WRITE_REG + RF_SETUP, 0x0f); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR SPI_RW_Reg(NRF_WRITE_REG + CONFIG, 0x0f);//0x0e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled.. CE_High; //CE = 1 Set CE pin high to enable RX device delayus(100); } /*接收函数,返回1表示有数据收到,否则没有数据接收到**/ unsigned char nRF24L01_RxPacket(unsigned char *rx_buf) { unsigned char sta,revale=0; SPI_RW_Reg(NRF_WRITE_REG + CONFIG, 0x0f); sta = SPI_Read(STATUS); // read register STATUS's value if(sta&0x40) //if(RX_DS) // if receive data ready (RX_DR) interrupt { CE_Low; // stand by mode SPI_Read_Buf(RD_RX_PLOAD, rx_buf, WR_TX_PLOAD); // read receive payload from RX_FIFO buffer revale = 1; CSN_Low; SPI_RW(FLUSH_RX); CSN_High; } SPI_RW_Reg(NRF_WRITE_REG+STATUS,sta); // clear RX_DR or TX_DS or MAX_RT interrupt flag return revale; } |
|
相关推荐
15个回答
|
|
|
|
|
|
原子哥认为会是什么原因呢
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
发送端main函数: TX_Mode(); while(1) { for(ni=0; ni<3; ni++) { nRF24L01_TxPacket(nrf_buf + 4*ni); while(1) { status = SPI_Read(STATUS); if(TX_DS & status) //如果发送成功则清掉标志位,出去执行另外的发送 { SPI_RW_Reg(NRF_WRITE_REG+STATUS,0XFF); SPI_RW(FLUSH_TX); LED2_CROSS; break; } if(MAX_RT & status) //如果达到最大重传,则说明发送失败了,清掉寄存器,因为发送失败,发送缓冲区的东西还在里面 //需要手动清掉,本次发送失败,下次继续 { SPI_RW_Reg(NRF_WRITE_REG+STATUS,0XFF); SPI_RW(FLUSH_TX); LED3_CROSS; break; } Delay_Us(100); } Delay_Ms(500); } 接受main函数: RX_Mode(); while(1) { status = nRF24L01_RxPacket(nrf_buf1); if(status) { LED2_CROSS; Show_Nrf(20, 80); memset(nrf_buf1, 0, 4); } LED1_CROSS; Delay_Ms(500); } 发送函数: /****************发送函数***************************/ void nRF24L01_TxPacket(unsigned char *tx_buf) { CE_Low; // CE=0; delay1us(10); SPI_RW_Reg(NRF_WRITE_REG+STATUS,0XFF); // SPI_Read(STATUS); //SPI_Write_Buf(NRF_WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // WritesTX_Address to nRF24L01 SPI_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //RX_Addr0 same as TX_Adr for Auto.Ack SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload SPI_RW_Reg(NRF_WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) &rim:TX. MAX_RT & TX_DS enabled.. SPI_Read(CONFIG); CE_High; //CE=1启动发送 delay1us(10); } 接收函数: /*接收函数,返回1表示有数据收到,否则没有数据接收到**/ unsigned char nRF24L01_RxPacket(unsigned char *rx_buf) { unsigned char sta,revale=0; SPI_RW_Reg(NRF_WRITE_REG + CONFIG, 0x0f); SPI_Read(CONFIG); sta = SPI_Read(STATUS); // read register STATUS's value if(sta&0x40) //if(RX_DS) // if receive data ready (RX_DR) interrupt { CE_Low; // stand by mode SPI_Read_Buf(RD_RX_PLOAD, rx_buf, WR_TX_PLOAD); // read receive payload from RX_FIFO buffer revale = 1; CSN_Low; SPI_RW(FLUSH_RX); CSN_High; } SPI_RW_Reg(NRF_WRITE_REG+STATUS,sta); // clear RX_DR or TX_DS or MAX_RT interrupt flag sta = SPI_Read(FIFO_STATUS); // read register STATUS's value return revale; } |
|
|
|
1.我的只是在接收方换了一块NRF24L01就好了。 2.我发现楼主给的程序还是有些问题的: 2-1. 楼主的 程序 //CE_Low; // 不应该有这一句 SPI_Read_Buf(RD_RX_PLOAD, rx_buf, WR_TX_PLOAD); // read receive payload from RX_FIFO buffer revale = 1; CE置低是有必要的,NRF24L01的寄存器都是在待机模式下(即CE拉低)读取或配置的。读完寄存器后还要把CE拉高! 2-2. 经试验,程序的 CSN_Low; SPI_RW(FLUSH_RX); CSN_High 也是没必要的,因为下一包数据会自动冲掉FIFO缓冲区的数据。 3.楼主的程序总体上是对的,和网上大多数差不多。我觉得实验时配置寄存器的话按照网上的都能调通,前提是要确定有两块好的NRF24L01啊,要不然后面的实验都是坑... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
给楼主一个大赞啊,去掉那一句拉低就行了,不过为嘛又说是有必要的呢?
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2544 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2331 浏览 5 评论
3158 浏览 3 评论
2802 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2761 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
608浏览 1评论
853浏览 0评论
968浏览 0评论
621浏览 0评论
447浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 04:49 , Processed in 1.386507 second(s), Total 106, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号