NRF24L01学习

时间:2024-04-30 23:16:48

一、工作模式

NRF24L01学习

PWR_UP和PRIM_RX在寄存器0x00中的第0位和第1位。

待机模式I:只是使用晶振工作,CE=0时是拉低?

待机模式II:部分时钟缓冲器处在工作模式。TX FIFO为空并且CE为高电平进入待机模式II。



然后在发送和接收时,NRF24L01有两种不同的模式,一种时ShockBurst,另一种时增强型ShockBurst,增强型多了应答。

两种模式的区别在EN_AA寄存器使能,是否开启自动应带就是区别。



自动应答(RX):收到有效的数据包后,系统进入发送模式发送确认信号。然后根据PRIM_RX和CE引脚决定

自动重发功能(ART)(TX):发送后如果没有收到确认信号,系统重发直到收到确认信号或超过重发次数。有新数据发送时丢包计数器复位。



数据通道:通过EN_RXADDR设置,默认通道0和1开启。

每个通道有自己的寄存器RX_ADDR_Px,地址通过此配置。

NRF24L01学习



中断:IRQ由低电平触发,寄存器中TX_DS, RX_DS或MAX_RT为高时触发中断。所有中断都可屏蔽。

二、NRF24L01中断初始化学习

demo例程的初始化顺序:

配置CONFIG寄存器(选择需要屏蔽的中断,并开启设备PWR_UP)。

设置EN_AA寄存器(开启通道0自动应答)

设置EN_RXADDR  (开启通道0接收)

设置SETUP_AW(设置接收和发送的地址宽度)

设置SETUP_RETUP(建立重发的时间和次数)

设置RF_CH            (设置NRF24L01的工作通道频率)

设置RF_SETUP       (设置工作的参数)

设置接收RX_ADDR_P0和发送TX_ADDR地址。



小马哥的写法

设置接收模式:

①设置CONIFG为接收模式

②需要清除中断,前后都CE拉低拉高



接收函数:

①读取RD_RX_PLOAD中的FIFO数据

②清除中断



发送函数:

①装载WR_TX_PLOAD数据进FIFO

②CONFIG设置为发送模式

③清中断



错误总结:①网上说可以用串口读出寄存器的值,来确认是否配置成功。我用printf函数打印出来全是0x00。最后发现我读取时的寄存器地址加了写地址的指令值,导致出错了。

②我初始化NRF24l01后,用EXTI_GenerateSWInterrupt(EXTI_Line11);软件触发中断。

最后停在了                B       .       //就停在这里了,是有中断没有处理。

                ENDP

                ALIGN

所以才发现EXTI15_10_Handler写错了T.T   应该是EXTI15_10_IRQHandler。

③我发现很难调试,需要两快一起调试。这大大增加了难度。http://www.openedv.com/posts/list/0/57110.htm

④用上面这种方法实现了遥控器对飞机的发送,但是开应答一直时MAX_TX。后来发现飞机对遥控器发送失败。因为遥控器初始化后Rx_FIFO不为空,无法触发中断。

SPI_Write_Reg(FLUSH_RX,0xFF);

SPI_Write_Reg(FLUSH_TX,0xFF);

加上这两句就没有问题了。



⑤然后在不应答的情况下,能够双向收发了。但是应答情况下一直时MAX_RT,我去太郁闷了。

原来之前在不应答的情况向想看看RF_CH通道不一样,能不能通--》结果可以。

但是在应答模式下,居然不通。自作孽啊,卧槽。浪费了好多时间,总算调通了。