完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
收发都设置了每次发送一个字节,都开启了自动应答。看着发送端发送第一个字符,第二个字符,第三个字符,第四个字符逐个显示出来了,然后就显示发送失败了。而接收方只收到一两个字符(在串口显示出来)。但是如果接收方MCU复位,则可以继续收发,发出去的是新的四个,而“收到”(准确来说是通过串口显示出来的)却是上一次发送的第二个字符。接收方的MCU是C51
[C] 纯文本查看 复制代码 // 接收方的接收函数uchar nRF24L01_RxPacket(unsigned char* rx_buf){ uchar flag=0; uchar status; status=SPI_RD_Reg(NRFRegSTATUS);// 读取状态寄存其来判断数据接收状况if(status & 0x40)// 判断是否接收到数据{CE = 0;SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferSPI_WR_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器flag =1;//读取数据完成标志 }SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status); //接收到数据后RX_DR,TX_DS,MAX_RT都置高为1,通过写1来清除中断标志CE = 1;return flag;} [C] 纯文本查看 复制代码 [C] 纯文本查看 复制代码 // 接收方NRF初始化函数 [C] 纯文本查看 复制代码 void init_NRF24L01(void){ uchar buf[5]={0}; Delay_n10us(10); CE = 0; // chip enable CSN= 0; // Spi disable [C] 纯文本查看 复制代码 // 这一句似乎没什么用~~~~~ SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7 [C] 纯文本查看 复制代码 } [C] 纯文本查看 复制代码 [C] 纯文本查看 复制代码 [C] 纯文本查看 复制代码 // 接收方main函数void main(){uchar Tx_Buf;//发送的信息1 uchar Rx_Buf; //接收到的数据暂存Uart_init();init_NRF24L01();LED_NRFLink=0;//检查不到24l01则报警 while(NRF24L01_Check()){LED_NRFLink=0;delayms(500);LED_NRFLink=1;delayms(500);}LED_NRFLink=1;while(1){RX_Mode();//接收模式while(!nRF24L01_RxPacket(&Rx_Buf)); //等待接收数据 ,返回1则接收到数据 ,在等待接收数据期间,可以随时变成发送模式 // 通过串口发送数据SBUF=Rx_Buf;while(!ti);}} 发送方是原子哥的代码,只将TX_PLOAD_WIDTH从32改成了1。 请问这是什么问题? |
|
相关推荐
5个回答
|
|
发现原因了。首先要再描述一下我的问题:大概每发送4个,接收方只能收到一个或两个,之后发送端就显示失败了。如果复位MCU,则又可以收到,但是收到的是之前发送的四个的后面内容,当然,这时候发送方又发出了新的四个。
问题来了: ①发送方发送了四个,发送成功了吗?答:成功了,因为复位MCU可以收到前面的数据 ②接收方收到了多少?答:3个!!!如果小于3个,那么发送方在发送第三个的时候就会失败,不会显示4个字符。 ③为什么是复位MCU?猜测:程序跑飞了,或者卡住了。答:卡住了。 看上面的代码是串口发送回PC的,我的串口设置了中断服务函数: [C] 纯文本查看 复制代码 // 串口接收void interrupt_uart() interrupt 4 //串口中断优先等级为4{if(TI) TI=0; // 发送完成,清除该标志位if(RI){RI=0; // 先把接收标志位清零Command=SBUF; // 将收到的指令GCFlag=1;// 收到指令}} 其中的if(TI) TI=0; 在发送完成遇到TI置高时清零TI。而main函数中又有这样的代码: [C] 纯文本查看 复制代码 while(1){while(!nRF24L01_RxPacket(&Rx_Buf)); //等待接收数据 ,返回1则接收到数据 ,在等待接收数据期间,可以随时变成发送模式 // 通过串口发送数据SBUF=Rx_Buf;//while(!TI); // 死于此} while(!TI)还在等待TI置高。这就是为什么显示出来的字符数是一个或两个或……3,4都有可能。但是就是无法连续接收。这就是因为……人品!!有些时候中断吧TI清0的早,就显示一个,清0得晚就多几个。毕竟中断发生的时机虽然说都是在发送完成之后,但是实际上在发送完成的这个时刻main出于什么状态是不确定的。有些时候中断发生的是瞬间while已经发现了TI为高就过去了,有些时候中断发生while还没执行到判断就被中断打断了,之后中断清0了TI,while永远都出不来了。 虽然我之前也试过注释掉这个while,但也失败了,可以说是很多错误的集合吧。下面发出可用的RX_Mode函数和RxPacket函数,都是在C51下的代码。实际上这些代码也参照了原子哥的STM32的相关代码,看了他的接收模式配置和接收数据的流程。 [C] 纯文本查看 复制代码 void RX_Mode(void){ uchar buf[5]={0};CE = 0;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_WR_Reg(WRITE_REG + EN_AA, 01); // 频道0自动ACK应答允许SPI_WR_Reg(WRITE_REG + EN_RXADDR,0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_WR_Reg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置发射速率为2MHZ,发射功率为最大值0dBSPI_WR_Reg(WRITE_REG + CONFIG, 0x0F);//0x0F);CE = 1; Delay_n10us(20); //200us}//******************************************************************************************************///*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//*功能:数据读取后放如rx_buf接收缓冲区中//******************************************************************************************************/uchar nRF24L01_RxPacket(unsigned char* rx_buf){ uchar flag=0; uchar status; status=SPI_RD_Reg(NRFRegSTATUS);// 读取状态寄存其来判断数据接收状况SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status); //接收到数据后RX_DR,TX_DS,MAX_RT都置高为1,通过写1来清除中断标志if(status & RX_OK)// 判断是否接收到数据{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferdelayms(10);SPI_WR_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器flag =1;//读取数据完成标志 }return flag;} 以后会来发完整代码的。谢谢大家 |
|
|
|
有一些注释不匹配,不要在意这个细节~
|
|
|
|
帮顶。。。。。
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2573 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2367 浏览 5 评论
3216 浏览 3 评论
2841 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2795 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
673浏览 1评论
911浏览 0评论
1032浏览 0评论
675浏览 0评论
507浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 15:25 , Processed in 1.222068 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号