请教老鸟->NRF24L01+ 无法兼容24L01原有代码

2020-01-23 14:46发布

以前24L01的代码已经经过多个平台的使用,只需要底层的SPI驱动函数即可正常通讯。但换成24L01+后就不能通讯了,调了两天没有结果,板子是自己送出去做的,用24L01测试没有问题。硬件连接没有问题,发送端和接受端状态寄存器返回值均为0x0e。上网找了一些24L01+的代码,移植过去也是一样的结果。这个东西很不好调试,所以想请教一下有用过这两款芯片的老鸟们它们在配置寄存器方面有什么差异?是否可以提供局部的代码参考一下呢,谢谢。以下是不带+正常通讯的部分代码
  1. void SetRX_Mode(u8 num)
  2. {
  3.         CE_L;
  4.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, num);
  5.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);           // IRQ收发完成中断响应,16位CRC ,主接收
  6.         delay_us(200);
  7.         CE_H;
  8. }
  9. u8 nRF24L01_RxPacket(unsigned char* rx_bufn,u8 num)
  10. {
  11.     u8 sta;
  12.     u8 revale=0;
  13.     CE_L;           //SPI使能
  14.     sta=SPI_Read(STATUS);   // 读取状态寄存其来判断数据接收状况
  15.     if(sta & RX)                // 判断是否接收到数据
  16.     {
  17.         CE_L;           //SPI使能
  18.         SPI_Read_Buf(RD_RX_PLOAD,rx_bufn,num);// read receive payload from RX_FIFO buffer
  19.         revale =1;  //读取数据完成标志
  20.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  21.         SPI_Read(FLUSH_RX);
  22.     }
  23.     CE_H;
  24.     return revale;
  25. }

  26. void nRF24L01_TxPacket(u8 * tx_buf,u8 num)
  27. {
  28.         u8 temp = SPI_Read(STATUS);
  29.         temp &= 0x31;
  30.         if(temp)
  31.         {
  32.                 SPI_Read(FLUSH_TX);
  33.                 SPI_RW_Reg(WRITE_REG+STATUS,temp);
  34.         }
  35.         SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  36.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  37.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, num);                          // 装载数据
  38.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  39.         CE_H;                 //置高CE,激发数据发送
  40.         delay_us(20);
  41.         CE_L;        //StandBy I模式
  42.         delay_us(100);
  43.         SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  44. }
  45. void SPI_init(void)
  46. {
  47.     SPI0CFG   = 0x40;
  48.     SPI0CN    = 0x0D;
  49.     SPI0CKR   = 0x04;

  50. }


  51. void init_NRF24L01(void)
  52. {
  53.     delay_us(10000);
  54.     SPI_init();
  55.     CE_L;    // chip enable
  56.            SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地?
  57.                 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址       
  58.                 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许
  59.                 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21
  60.                 SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  61.                 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为4字节
  62.                 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1Mkbps,发射功率为最大值0dB
  63.                 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x01);
  64. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。