NRF24L01双向通讯不成功,请教

2020-01-13 18:34发布

本帖最后由 指端轻语 于 2013-5-24 00:20 编辑

好吧中午发的帖子没人理。我这么问吧

1、A模块通过无线模块向B模块发送一条指令,B接收到了之后将自己的一些数据发给A模块;
2、紧接步骤1,B模块也向A模块发送一条指令,A模块接收到之后做某个特定的动作;
3、重复以上两步骤

以上过程能成功么?
我现在遇到的问题是,1能成功,但是执行2步骤时需要连续重复3-4次执行才能成功,成功之后再进行1步骤又不会成功,多试几次又会成功·····很郁闷的说


据说这个问题是由于无线模块在发送完数据后还会一直不停地发送···我试了以下三种方法都不行
1.每次发送完设置ce=0也不行。
2.每次发送完让它成待机模式行不行。
3.每次发送完马上设成接收模式,接收完马上设成发送模式,也不行。

不会自动重发的问题吧,我都没建立自动重发功能
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
skype
2020-01-13 22:33
一是A模块发发送时设置成自动重发有ACK模式,B模块设置成接收模式:
A:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0x01);                                                                      // Enable Auto.Ack:Pipe0
        //4 使能PIPE0
        nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0x01);                                                                  // Enable Pipe0
        //5 配置自动重发次数
        nrf24_Writer_REG(WRITE_REG + SETUP_RETR, 0x2f);                                                                 // 500us + 86us, 10 retrans...1a(0xff发射超时最大70MS,发射最小只要1MS)
B:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0x01);                                                                      // Enable Auto.Ack:Pipe0
        //4 使能PIPE0
        nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0x01);                                                                  // Enable Pipe0
A发射成功没有要看REG 0x07,如A模块启动发送后
void nrf24_Send_Data(int8_t *pbuf, uint8_t len)
{
        Standby_Mode_1();  //StandBy I模式
        //多字节写入是从低到高字节
        nrf24_Write_Buf(WRITE_REG + RX_ADDR_P0, (int8_t*)Tx_addr, TX_ADR_WIDTH);         // 装载接收端地址
        nrf24_Writer_REG(FLUSH_TX, 0x00);
        //写TX有效数据,1-32字节,写操作从字节0开始
        nrf24_Write_Buf(WR_TX_PLOAD, pbuf, len);                                                                                                         // Writes data to TX payload
        nrf24_Writer_REG(WRITE_REG + CONFIG, 0x0e);                                                                              // IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                                                                                                                                                                                                                                           //置高CE,激发数据发送
}

下面就开始查询REG 0x07的状态,再根据状态做处理:
int8_t Get_RF_Status(void)
{
        uint8_t status;
        int8_t ret;
        status = nrf24_Read_REG(STATUS);
        if (status & 0x10)
        {//数据多次重发,无ACK
                nrf24_Writer_REG(FLUSH_TX, 0);
                nrf24_Writer_REG(FLUSH_RX, 0);
                ret = -1;    //再启动A模块发送数据
        }
        else if (status & 0x20)
        {//发送成功
                ret = 0;  //转到接收模式
        }
        else if (status & 0x40)
        {//收到数据
                ret = 1;//转到发送模式
        }
        status = nrf24_Read_REG(STATUS);
        nrf24_Writer_REG(WRITE_REG + STATUS, status);  
        return ret;
}

一周热门 更多>