nrf24L01多发一收调试心得

背景

近期项目中要应用到一个多发一收通信场景,考虑到成本及功能问题,最后决定使用nrf24L01模块。经过多次的踩坑最终实现了相应的通信功能,现将相关的调试心得分享一下,留作笔记,同时也希望能帮助到其他初次使用该模块的朋友。

注意事项

遵循先调试好发送端再调试接收端的原则。具体的调试方法及例程网上都有现成的,所以这里只讲一些注意事项。

  • 学会利用STATUS状态寄存器,这里我们在进行调试的时候,主要用来判断发送状态和接收状态,在发送模式下当发送成功时读取该寄存器时返回的值应该为0x20,在接收模式下当接收到数据时该寄存器中的值应该是0x40。

  • NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//写TX节点地址,此处写入的是目的地址

  • 通信两端配置要写协调一致,如果需要自动应答功能,发送端需要设置接收接收端ACK响应的数据通道地址和自动重发参数。而接收端也要开启相应的自动响应功能,也就是配置EN_AA寄存器。

  • 在多发一收模式下,接收端的配置样例如下:
    void NRF_RX_Mode(void)
    {
    NRF24L01_CE = 0;
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_Test_Addr0, RX_ADR_WIDTH);

    SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_Test_Addr1, RX_ADR_WIDTH);
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_Test_Addr2, 1); //1-5通道只有低8位可写,高32位1-5通道相同

    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 禁止接收所有通道自动应答
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x07); // 使能接收通道0,1,2

    SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40

    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度
    SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); // 接收通道1选择和发送通道相同有效数据宽度
    SPI_RW_Reg(WRITE_REG + RX_PW_P2, RX_PLOAD_WIDTH); // 接收通道1选择和发送通道相同有效数据宽度

    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
    NRF24L01_CE = 1; // 拉高CE启动接收设备
    Dly_us(200);
    }

-相应的发送端地址配置如下:
//低位先写入,相关介绍看数据手册
const u8 TX_ADDRESS0[RX_ADR_WIDTH]={0xE7,0xD3,0xF0,0x35,0x77}; //目的地址
const u8 TX_ADDRESS1[RX_ADR_WIDTH]={0xc2,0xc2,0xc2,0xc2,0xc2}; //目的地址
const u8 TX_ADDRESS2[RX_ADR_WIDTH]={0xc3,0xc2,0xc2,0xc2,0xc2}; //目的地址

最后

附上通信成功的测试图(三发一收)
nrf24L01多发一收调试心得_第1张图片

你可能感兴趣的:(嵌入式)