yueqiumao 发布的文章

睡眠:关闭mcu核心
停机:关闭mcu核心,关闭1.8v区域时钟,关闭振荡器,电压调节器开启节能模式(可选)
待机:关闭mcu核心,关闭1.8v区域时钟,关闭振荡器,关闭电压调节器

L系列低功耗运行模式,降低电压调节器输出功率 (LPRUN)
L系列range,调整电压调节器输出电压 (VOS)

唤醒电路只有在待机模式启用时才启用,唤醒后待机电路就停止了。(WIC)

相关寄存器:
SEVONPEND
PDDS
LPDS
SLEEPDEEP
ULP (关闭参考电压)

nrf24 一共有三个中断,RX_DR(收到数据) TX_DS(数据发送成功) MAX_RT(最大重发次数),通过引脚 IRQ 输出,低电平有效。引脚貌似要给个上拉。
RX_DR 收到数据会立马触发,在重发模式下,相同包只会触发一次中断。
TX_DS 在非重发模式下,发送完数据就立马触发中断,在重发模式下则收到对方回复才会触发中断。
MAX_RT 只在重发机制下有效,发送到达最大次数依然没有收到对方回复就会触发中断。

对于 MAX_RT 中断标记,必须清除,否则无法再进行发送操作。TX FIFO中的有效载荷不会被删除 (有待验证) 一旦清零,则继续发送上一次的数据
IRQ引脚的电平恢复,是否需要清除所有标记还没尝试。尝试了在更新这里。

nrf24_status.png

坑1 数据只能接受一次
当开启自动重发模式时,如果后续数据包和先前收到的数据包PID和CRC都一致的话,会被认为是同一个包的重发包。
解决方法:数据包中加一个随机数,每次发送改变下。

坑2 接受到的数据可能会错位
看起来像是收到的数据全部右移了n位,通过分析发现原来是地址设置过于简单,导致nrf24识别错位。
解决方法:打开CRC校验或者设置复杂地址。

无线通讯中可能存在各种干扰,一次发射并不能100%送达,为了提高发射的成功率,nrf24提供了重发机制。发射一个数据包,必须收到对方响应才算发送完成,否则会进行多次尝试。
发送端通过配置寄存器 SETUP_RETR 开启发射重试机制,可配置重发超时时间,以及重发次数。
nrf24_setup_retr.png

接受端配置寄存器 EN_AA 开启对应管道的自动确认机制。
nrf24_en_aa.png

使用重发机制,双方的CRC都必须开启。
如果发射放 需要收ACK确认信号,则需要配置RX_ADDR_P0 的值等于TX_ADDR。
有一点需要注意的是,当重发次数到达最大还没发送成功,需要清理寄存器 STATUS 的 MAX_RT 位,否则无法再进行任何发射。