NRF24L01模块STM32调试心得-调试顺序

前言

需要参考之前的文章,这片文章对之前的调试顺序做个说明

环境:

芯片:STM32F103C8T6

Keil:V5.24.2.0


1.调试顺序

在初次写代码时,调试不通时,无法确认是发射端还是接收端,也无法确认自己的程序逻辑是否正确,所以我们需要先进行单端的测试,方便我们进行调试,优先选择发送端.

至于怎么去调发送方,先说下发送方的工作流程:

·配置寄存器使芯片工作于发送模式后拉高CE端至少10us

·读状态寄存器STATUS

·判断是否是发送完成标志位置位

·清标志

·清数据缓冲

网上的程序我也看过,大多都是成品,发送方发送-等应答-(自动重发)-触发中断。可是这样的流程就已经把接收方给牵涉进来了,就是说一定要接收方正确收到数据并且回送应答信号之后发送方才能触发中断,结束一次完整的发送。可是这跟我们的初衷不相符,我们想单独调试发送,完全抛开接收,这样就要去配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。

复制代码
       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自动应答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);    //失能接收通道0

       SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);      //失能自动重发

寄存器描述:

EN_AA

SETUP_RETR

EN_RXADDR

有了以上这三个配置,发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送,可是怎么样才知道发送是否成功呢,要用到另外两个寄存器,STATUS和FIFO_STATUS。

有了以上这三个配置,发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送,可是怎么样才知道发送是否成功呢,要用到另外两个寄存器,STATUS和FIFO_STATUS。

我们可以通过读取STATUS的值来判断是哪个事件触发了中断,寄存器4、5、6位分别对应自动重发完成中断,数据发送完成中断,数据接收完成中断。也就是说,在之前的配置下,如果数据成功发送,那么STATUS的值应该为0x2e 。这样就可以作为一个检测标准,另外一个标准可以看FIFO_STATUS寄存器,第5位的描述:发送缓冲器满标志,1为满,0为有可用空间;第4位的描述:发送缓冲器空标志,1为空,0为有数据;同样可以看到接收缓冲器的对应标志。这样在数据发送成功后,发送寄存器当然应该是空的,接收缓冲因为在之前已经失能,所以也应该是空,也就是说成功发送之后的FIFO_STATUS寄存器值应该是0x11

然后调试接收端,同样的思路

复制代码
       SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           //失能通道0自动应答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    //接收要使能接收通道0

使用和发送方一样的方法:观察STATUS和FIFO_STATUS的值,对照寄存器描述,接收正确时STATUS的值应该是0x40,对于FIFO_STATUS的情况就多了些,因为数据宽度的不同也会造成寄存器的值不一样,24L01最大支持32字节宽度,就是说一次通讯最多可以传输32个字节的数据,在这种情况下,接收成功读数据之前寄存器值应该为0x12,读数据之后就会变成0x11;如果数据宽度定义的小于32字节,那么接收成功读数据之前寄存器值应该为0x10,读数据之后就会变成0x11。大家可以试着分析下,对照数据手册分析每个位的状态就可以得到结果。

好了,到这里对nRF24L01的调试基本上就算通了,但是要明白这些只是调试方法,最终的产品如果不加上应答和重发的话那么数据的稳定性是很难保证的,所以在基本的通讯建立之后就要把发送的配置改为:

复制代码
       SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);             //使能接收通道0自动应答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);      //使能接收通道0        

       SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);      //自动重发10次,间隔500us

接收方的配置也要更改:

复制代码
       SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);           //失能通道0自动应答

       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);    //接收要使能接收通道0

这样发送和接收就进入了一个标准状态,发送-等应答-(自动重发)-触发中断;接收-应答-触发中断,一切按部就班,程序里加上自己的应用部分就能实现很多功能了

相关推荐
济61717 分钟前
ROS开发专栏---视觉图像数据的获取实验--适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
kebidaixu19 分钟前
SPI四种模式
stm32
俊基科技25 分钟前
矿用对讲降噪改造实战|A-68 语音模块解决井下高噪回音、啸叫难题
嵌入式硬件·语音识别·ai降噪·回声消除·矿用通信·语音 dsp
Hall_IC30 分钟前
STM32F407VGT6产线急需?粤科源兴现货库存随时调拨,保障交期不延误
stm32·单片机·嵌入式硬件
Wxinxiaozhang31 分钟前
GD32L235 更换外部晶振(8M → 16M)导致 MCU 无法启动的原因分析与解决方法
单片机·嵌入式硬件
嵌入式ZYXC31 分钟前
第8章:PCB Layout基础与实物打样——把你的设计变成一块真正的板子
stm32·单片机·嵌入式硬件·物联网
zlinear数据采集卡44 分钟前
模拟输入限流保护电路深度解析:从理论原理到ZLinear采集卡的实战设计
c语言·单片机·嵌入式硬件·fpga开发·自动化
踏着七彩祥云的小丑1 小时前
嵌入式测试学习第 27 天:网络基础:IP、子网掩码、TCP/UDP基础
单片机·嵌入式硬件
三佛科技-134163842123 小时前
PL3380 (PL338X系列)输出5V100MA非隔离AC-DC降压恒压输出芯片典型应用电路 与LP2601对比
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
DS小龙哥3 小时前
基于STM32设计的物联网智能插座
stm32·嵌入式硬件·物联网