玩NRF24L01时候,很多朋友反应调试模块有困难,调试不通的时候,不知道到底是芯片坏了还是收发芯片调试有BUG,现在把调试的方法一步步讲解一下,一劳永逸的解决这些问题。 分析步骤: 首先给芯片上电的时候,切记 VCC供电不要超过3.6V,否则芯片基本上报废了 (A)检查芯片是否被烧坏,烧录提供的发射(TX)代码,方法两种: 第一种,由于MISO脚的数据时读出来,所以用示波器看一下MISO脚是不是有波形,如果有,说明芯片没有被烧坏。
第二种,用SPI进行读写寄存器,如果写入的数据和读出来的数据一样,说明芯片没有问题。
(B)检查芯片发送端:
(1)从发送代码中找到 SPI_RW_Reg(WRITE_REG + EN_AA, xxxx); SPI_RW_Reg(WRITE_REG + EN_RXADDR, xxxx); SPI_RW_Reg(WRITE_REG + SETUP_RETR, xxxx); 把“xxxx”值改为如下值 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); // 关闭自动重发 (2)读取STATUS和FIFO_STATUS的值,在loop函数加入 status=SPI_Read(STATUS); fifostatus=SPI_Read(FIFO_STATUS); 如果status=0x2e,fifostatus=0x11,标志发送方成功,不成功检查硬件连接、时序等可能导致的问题,关于“status=0x2e,fifostatus=0x11”,请看芯片寄存器介绍,在此不一一解释。 (B)检查芯片接受端: (1)发送方不要撤离,用另一块主板连上另一个NRF2401。从接收代码中找到 SPI_RW_Reg(WRITE_REG + EN_AA, xxxx); SPI_RW_Reg(WRITE_REG + EN_RXADDR, xxxx); 把“xxxx”值改为如下值 SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 关闭通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 接收要使能接收通道0 (2)读取STATUS和FIFO_STATUS的值,在loop函数加入 status=SPI_Read(STATUS); fifostatus=SPI_Read(FIFO_STATUS); 如果接收方成功,STATUS和FIFO_STATUS值如下: status=0x40, 如果NRF24L01最大支持32字节宽度,即RX_PLOAD_WIDTH=32 Fifostatus 0x12------>0x11 如果NRF24L01支持小于32字节宽度,即RX_PLOAD_WIDTH<32 Fifostatus 0x10------>0x11 (3)发送接收方都调试成功后,把之前调试“xxxx”的值恢复还原,重新编译烧录代码测试。
|