完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 awellpoint 于 2018-11-4 07:53 编辑
问题:使用stc89c52+NRF24L01向STM32f103发送数据失败,按照网上调试经验,先屏蔽自动应答,自动重发,撇开接收端,单独调试发送端,判断发送中断,数据还是发送不出去。 现象:初始时判读模块是否存在,读写TX_ADDR寄存器相等,证明spi读写时序无问题,单次发送STATUS寄存器为0x0e,FIFO_STATUS寄存器为0x01;TX_DS未中断置1,TX_FIFO为还有数据。 发送模式和发送函数代码: void NRF24L01_TX_Mode(void) { // NRF24L01_CE=0; NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为40 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断 //调试时失能应答重发 这样发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00); //使能通道0的自动应答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 // NRF24L01_CE=1;//CE为高,10us后启动发送 } >u8 NRF24L01_TxPacket(u8 *txbuf) { u8 sta=0,fifosta=0; NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); NRF24L01_CE=0; NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节 NRF24L01_CE=1; Delay10us();//NRF24L01_CE=1 10u后启动发送 sta=NRF24L01_Read_Reg(NRF_READ_REG+STATUS); //读取状态寄存器的值(读出来为0x0e) Lcd1602_WriteString(2,1,"STA:0x"); Lcd1602_WriteChar(2,7,(sta/16>9)?(sta/16+'A'):(sta/16+'0')); Lcd1602_WriteChar(2,8,(sta%16>9)?(sta%16-10+'A'):(sta%16+'0')); ledport=sta; Lcd1602_WriteString(2,10,"FO:0x"); fifosta=NRF24L01_Read_Reg(NRF_READ_REG+NRF_FIFO_STATUS);(FIFO状态寄存器读出来为0x01) Lcd1602_WriteChar(2,15,(fifosta/16>9)?(fifosta/16+'A'):(fifosta/16+'0')); Lcd1602_WriteChar(2,16,(fifosta%16>9)?(fifosta%16-10+'A'):(fifosta%16+'0')); ledport=fifosta; NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志 if(sta&MAX_TX)//达到最大重发次数 { NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 return MAX_TX; } if(sta&TX_OK)//发送完成 { return TX_OK; } return 0xff;//其他原因发送失败 } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
575 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
554 浏览 0 评论
500 浏览 1 评论
482 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
817 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11642 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 22:29 , Processed in 0.572405 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号