sohappyoh 发表于 2018-10-19 09:11:36

求教 24L01 手一摸通讯就正常是怎么回事?

本帖最后由 sohappyoh 于 2018-10-19 09:13 编辑

淘宝买的NRF24L01,分别有加PA和没加PA的,都一样,收发试验NOACK模式,掉包很严重,也不是距离太近信号太强的缘故,我手一摸天线,或者模块背面通讯就正常了!!!求教是什么原因?

下面是我的代码:

void SI24R1_Config(void)
{
    SPI_RW_Reg( WRITE_REG_CMD + SETUP_AW, 0x03 );               // 设置地址宽度为 5bytes
   
    SPI_Write_Buf( WRITE_REG_CMD + TX_ADDR, TX_ADDRESS, 5 );    // 发送地址
    SPI_Write_Buf( WRITE_REG_CMD + RX_ADDR_P0, RX_ADDRESS, 5 ); // 接收通道 0 地址
   
    SPI_RW_Reg( WRITE_REG_CMD + EN_RXADDR, 0x01 );            // 使能接收通道 0
   
    SPI_RW_Reg( WRITE_REG_CMD + RF_CH, 11 );                  // 选择射频信道
    SPI_RW_Reg( WRITE_REG_CMD + RX_PW_P0, TX_PLOAD_WIDTH );   // 设置负载长度,使用 PIPE0 接收

    SPI_RW_Reg( WRITE_REG_CMD + FEATURE, 0x01 );                // NO ACK
    SPI_RW_Reg( WRITE_REG_CMD + DYNPD, 0x00 );                  // 关闭 DPL_P0
   
    SPI_RW_Reg( WRITE_REG_CMD + RF_SETUP, 0x07 );               // 数据传输率 2Mbps 及功率
}

void SI24R1_TxMode(void)
{
    CE = 0;
    SPI_RW_Reg( FLUSH_TX_CMD, 0x00 );         //清除TX_FIFO寄存器
    SPI_RW_Reg( WRITE_REG_CMD + CONFIG, 0x0E ); //IRQ引脚不显示中断 上电 发射模式 1~16CRC校验
    CE = 1;
    delay_xus( 130 ); //从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130us
}

void SI24R1_RxMode(void)
{
    CE = 0;
    SPI_RW_Reg( FLUSH_RX_CMD, 0x00 );         //清除RX_FIFO寄存器
    SPI_RW_Reg( WRITE_REG_CMD + CONFIG, 0x0F ); //IRQ引脚不显示中断 上电 接收模式 1~16CRC校验
    CE = 1;
    delay_xus( 130 ); //从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130us
}



    if(rx) {
      rc++;
      SI24R1_Config();
      SI24R1_RxMode();   
      delayms_cnt2 = 0;
      do {
            status = SPI_Read( READ_REG_CMD + STATUS );
            SPI_RW_Reg( WRITE_REG_CMD + STATUS, status );
            if(status & RX_DR) {
                LedBlink( LED_GREEN );
                SI24R01_ReadFIFO( rxbuf );
                if( USB_Connected() )
                  USB_SendDat( ( u8 * )rxbuf, strlen( ( char * )rxbuf ) );
                break;
            }
      } while (delayms_cnt2<10);            
    } else {
      tc++;
      static u32 x=0;
      sprintf( ( char * )txbuf, "TX CNT=%d\r\n", x++ );
      SI24R1_Config();
      SI24R1_TxMode();
      CE = 0;
      SPI_Write_Buf( WR_TX_PLOAD_NOACK_CMD, txbuf, 32 );
      CE = 1;
      delay_xus(150);
      delayms_cnt2 = 0;
      do {
            status = SPI_Read( READ_REG_CMD + STATUS );
            SPI_RW_Reg( WRITE_REG_CMD + STATUS, status );
      } while(((status&TX_DS)==0)&&(delayms_cnt2<10));
      delay_xms(100);
    }

jlhgold 发表于 2018-10-19 10:39:48

接地或者天线匹配没做好吧

我做我的王 发表于 2018-10-19 10:48:21

供电不稳吧。供电输入加个大电容并上小电容

wye11083 发表于 2018-10-19 11:26:05

我做我的王 发表于 2018-10-19 10:48
供电不稳吧。供电输入加个大电容并上小电容

这个搞不好是IIC挂了。我被iic总线折腾了好几天了。设备上用了总共将近30cm的走线,其中20cm以上是FPC。然后有一个模组死活不工作或工作不正常,查IIC之类都正常。最后没办法,给IIC终端那里加了1nF电容抗干扰。疑似IIC终端没有加上拉,靠PCB上拉到设备端之后不稳定,偶尔会造成混乱。像LZ这应该查查IIC上拉是否正常。

如果确认IIC上拉是正常的,那就查查地是不是浮地。

hnywx 发表于 2018-10-19 15:31:05

天线不好吧,电容不匹配

散装805 发表于 2018-10-21 12:04:54

大部分是供电问题
页: [1]
查看完整版本: 求教 24L01 手一摸通讯就正常是怎么回事?