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

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

相关推荐
良许Linux15 分钟前
32岁入行STM32迟吗?
stm32·单片机·嵌入式硬件
m0_466607701 小时前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang5 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭5 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记9 天前
MCU编程
单片机·嵌入式硬件
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit9 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习
HX科技10 天前
STM32给FPGA的外挂FLASH进行升级
stm32·嵌入式硬件·fpga开发·flash·fpga升级
Suagrhaha10 天前
驱动入门的进一步深入
linux·嵌入式硬件·驱动
国科安芯10 天前
基于ASP4644多通道降压技术在电力监测系统中集成应用与发展前景
嵌入式硬件·硬件架构·硬件工程