yueqiumao 发布的文章

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 位,否则无法再进行任何发射。

nrf24链路层接受数据时,发现数据包地址和自己的接受地址一致时才会收取。nrf24一共可以设置6个接受地址。接受地址在nrf24中被包装成管道的概念。每个管道都可以单独配置,开启关闭,不同的地址,是否启用自动回复功能(重发机制),使用动态还是静态的负载长度。如果使用的是动态长度,则管道收取到的数据长度也会保存在对应管道的寄存器里。

nrf24_rx_addr.png

需要注意的是2-6号管道共用1号管道的前四字节地址。也就是说他们和1号管道地址只有一字节的差别。