神了个奇了,51+NRF24L01每次都要发送两条同样指令才有反应

2020-02-02 09:35发布

用51+NRF24L01控制继电器开关,发送端发送0x01代表开,0x10代表关,但是不知道怎么搞的每次都得发送两条一样的命令才有反应,发一条开、一条关就木有反应。程序用的是myqiang1990的一对一程序,程序本体运行良好,就是不知道为什么会变成这样。
下面贴出主程序:
void main(void)
{
        unsigned char TxBuf[20]={0};  
        unsigned char RxBuf[20]={0};

        delayms(100);
        init_NRF24L01() ;
        Delay(6000);

        P2=0x00;     

        while(1)
        {                       
                SetRX_Mode(); //无按键直接跳转到接收,一直循环。
                nRF24L01_RxPacket(RxBuf);
                if(RX_DR==0)        //如果收到数据
                {
                        if(RxBuf[1]==0x01)        //打开开关
                        {
                                LED1=0;
                                Delay(5000);
                        }
                        else if(RxBuf[1]==0x10)//关闭开关
                        {
                                LED1=1;
                                Delay(5000);
                        }
                        SPI_RW_Reg(FLUSH_RX,0x00);                 //冲马桶
                }
        }

}

初始化函数:
//NRF24L01初始化
void init_NRF24L01(void)
{
delayms(1);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lcw_swust
1楼-- · 2020-02-02 12:16
SetRX_Mode(); 函数的代码呢
feifanxp
2楼-- · 2020-02-02 16:04
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
delayms(1);
}

//*****************************************************************************************************/
//函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存器来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
        CE = 0; //SPI使能
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
        revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标志
return revale;
}
夏日么么茶
3楼-- · 2020-02-02 20:55
这我也遇到过,暂时没解决呢,你解决了记得发表下呐
feifanxp
4楼-- · 2020-02-02 21:28
 精彩回答 2  元偷偷看……
feifanxp
5楼-- · 2020-02-02 23:11
额,暂时算是解决了,每次发送两次,中间间隔100ms,但是魂蛋啊到底为神马!
lcw_swust
6楼-- · 2020-02-03 03:12
SetRX_Mode(); //无按键直接跳转到接收,一直循环。
这句放在while(1)之前试试

一周热门 更多>