NRF24L01

一.SPI协议

二.SPI指令

SPI指令设置 用于SPI接口的常用命令见下表。
向寄存器写数据(写寄存器指令+寄存器地址,写入数据)
伪代码
soft_spi_write_8bit_register函数向指定寄存器写入一个数据
soft_spi_write_8bit_register(soft_spi_obj, W_REGISTER(写指令)+ 寄存器地址, 写入数据);

 三.工作模式

四.发送端寄存器配置

 (1)写Rx节点地址RX_ADDR_P0

soft_spi_write_8bit_registers函数向指定寄存器写入多个数据

soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收地址

(2)使能AUTO ACK EN_AA

  这里只使用了通道0所以只用使能通道0自动应答,配置为0x01

(3)使能PIPE 0 EN_RXADDR

这里只使用了通道0所以只用使能接收通道0,配置为0x01

(4)设置通信频率RF_CH

设置射频通道频率40

(5)设置接收通道0有效数据宽度Rx_Pw_P0

 

  这里只使用了接收数据通道0设置接收地址有效数据的宽度32

(6)配置发射参数(低噪放大增益、发射功率、无线速率)

设置射频寄存器,这里我设置的使0x0F,即传输速率1-2Mbps,发射功率0dBm,低噪声放大器增益

(7)配置24L01基本参数以及切换工作模式

配置寄存器通常配置为0x0F,IRQ引脚低电平产生中断,CRC校验,上电接收模式

五.发射端寄存器配置

 (1)写Tx节点地址TX_ADDR

soft_spi_write_8bit_registers函数向指定寄存器写入多个数据

soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//写发送地址

 (2)写Rx节点地址RX_ADDR_P0

soft_spi_write_8bit_registers函数向指定寄存器写入多个数据

soft_spi_write_8bit_registers(soft_spi_obj, W_REGISTER(写指令)+ RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收地址

(3)使能AUTO ACK EN_AA

  这里只使用了通道0,所以只用使能通道0自动应答,配置为0x01

(4)使能PIPE 0 EN_RXADDR

这里只使用了通道0所以只用使能接收通道0,配置为0x01

(5)配置自动重发次数SETUP_RETR

这里设置的是0x1A,自动重发延时500us + 86us 自动重发计数10次

(6)设置通信频率RF_CH

设置射频通道频率40

(7)配置发射参数(低噪放大增益、发射功率、无线速率)

设置射频寄存器,这里我设置的使0x0F,即传输速率1-2Mbps,发射功率0dBm,低噪声放大器增益

 (8)设置接收通道0有效数据宽度Rx_Pw_P0

  这里只使用了接收数据通道0设置接收地址有效数据的宽度32

(9)配置24L01基本参数以及切换工作模式

 

这里是发送端,所以第0位为配置为0,寄存器通常配置为0x0E,IRQ引脚低电平产生中断,CRC校验,上电发送模式

六.接收端代码

通过判断状态寄存器第6位是否是1来判断是否接收到了数据

void main(void)
{
    uchar sta;
    init_io();                                //初始化IO引脚
    delay_ms(1000);
    RX_Mode();                                //配置为接收模式
    while(1)
    {
       sta=SPI_Read(STATUS);        //读取芯片的状态寄存器
      if((sta & 0x40) != 0)        //是否发生了接收数据完成的中断
      {                                                //是的话,将收到的数据存到数组rx_buf里
           SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
      }
        SPI_RW_Reg(FLUSH_RX,0xff);    //清除接收缓冲器
        SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除接收中断标志
        delay_ms(1000);
    }
}

七.发送端代码

数据发送完成IRQ引脚为低电平

void main(void)
{
    unsigned char sta;
    delay_ms(1000);
    init_io();        //引脚初始化
   delay_ms(1000);
    TX_Mode();        //发送端初始化
    while(1)
    {
        CE = 0;
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); //将数据送入发射缓冲区
        CE = 1;
        while(IRQ);
        sta=SPI_Read(STATUS);
        SPI_RW_Reg(FLUSH_TX, 0xff);                                                    //清除发射缓冲区
        SPI_RW_Reg(WRITE_REG+STATUS,sta);                                   //清除各种中断标志
        delay_ms(1000);
    }
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值