天线|RF射频
直播中

刘杰

7年用户 1292经验值
私信 关注
[问答]

STM8S+24L01,一对一通讯不了怎么办

//发送程序
void NRFSetTxMode(u8*TxDate)
{
        CE=0;
           NRFWriteTxDate(WRITE_REG+TX_ADDR,TxAddr,5);        //发送地址设置
        NRFWriteTxDate(WRITE_REG+RX_ADDR_P0,TxAddr,5);
        NRFWriteTxDate(W_TX_PAYLOAD,TxDate,4);  //写入数据
        
          NRFWriteReg(WRITE_REG+EN_AA,0x01);  //设置为0X00就能发送成功,返回0X2E
          NRFWriteReg(WRITE_REG+EN_RXADDR,0x01);  //使能接受通道0应答
          NRFWriteReg(WRITE_REG+SETUP_RETR,0x0a);  //自动重发设置
          NRFWriteReg(WRITE_REG+RF_CH,0x40);       //射频通道设置
          NRFWriteReg(WRITE_REG+RF_SETUP,0x07);   //传输设置速率
        NRFWriteReg(WRITE_REG+CONFIG,0x0e);      //上电,发射模式
        CE=1;
        delay_ms(100);        
}
u8 CheckACK()
{
        sta=NRFReadReg(STATUS);  
        UART1_sendchar(sta);        //打印状态值
        if(sta&0x30)            // STATUS寄存器的4、5位置1
        {
           NRFWriteReg(WRITE_REG+STATUS,0xff);  // 清除TX_DS或MAX_TR中断标志
           CSN=0;
           NRFSPI(FLUSH_TX);//清空FIFO
          CSN=1;
           return(0);
        }
        else
           return(1);
}
void main()
{
       unsigned char i=0;   
       gpio_init();
       Init_UART1();
        delay_ms(100);
        NRF24L01Int();  //初始化引脚
        delay_ms(10);   
       NRF24L01Int();
        while (1)
        {  
          NRFSetTxMode(TxDate);//发送数据
          while(CheckACK());        //检测是否发送完毕
        }
}
//接受程序
void NRFSetRXMode()
{
        CE=0;
          NRFWriteTxDate(WRITE_REG+RX_ADDR_P0,TxAddr,5);  //接受通道0使用
          NRFWriteReg(WRITE_REG+EN_AA,0x01);                    //使能通道0应答
          NRFWriteReg(WRITE_REG+EN_RXADDR,0x01);           //使能接受通道0
          NRFWriteReg(WRITE_REG+RF_CH,0x40);                  //选择射频通道
          NRFWriteReg(WRITE_REG+RX_PW_P0,4);                //通道的有效数据宽度
          NRFWriteReg(WRITE_REG+RF_SETUP,0x07);            //数据传输数率
        NRFWriteReg(WRITE_REG+CONFIG,0x0f);               //上电、接受模式
          CE = 1;
        delay_ms(10);   
}
void GetDate()                                 
{
     u8 i;
    sta=NRFReadReg(STATUS);
    if(sta%0x40)  //是否接受到数据               
     {
           CE=0;
           NRFReadRxDate(R_RX_PAYLOAD,rx_buf,4);  //读数据
           for(i=0;i<4;i++)
              UART1_sendchar(rx_buf);        //打印给串口
           NRFWriteReg(WRITE_REG+STATUS,0xff);  //清状态寄存器
           CSN=0;
           NRFSPI(FLUSH_RX);                    //清空FIFO
           CSN=1;                 
     }
}
void main()
{
        u8 i=0;  
        gpio_init();
        Init_UART1();
        delay_ms(100);
        NRF24L01Int();
        delay_ms(100);
        while (1)
        {     
          NRFSetRXMode();//设为接收模式
          GetDate();//接收数据
        }
}  
现象:1:2个模块写在某一寄存器写数据,再读出来是一样的(说明读写时序和24L01模块是好的,对吧?)
          2:2个模块都烧写发射程序,改这句 "NRFWriteReg(WRITE_REG+EN_AA,0x00); //不使能通道0应答”,改为0x00,取消自动应答后都能发射出去,状态值为0x2e.
问题:
        烧写上面的发射程序和接受程序“NRFWriteReg(WRITE_REG+EN_AA,0x01);”都使能自动应答,发射端:发射状态值1E,接受端:接受不到数据。请问我的代码有问题么?该怎么调试?我的方法没错吧?

回帖(1)

张蕾

2020-7-21 15:08:51
帮顶
举报

更多回帖

发帖
×
20
完善资料,
赚取积分