feifanxp 发表于 2012-10-29 21:18:43

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

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

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

        P2=0x00;   

        while(1)
        {                       
                SetRX_Mode(); //无按键直接跳转到接收,一直循环。
                nRF24L01_RxPacket(RxBuf);
                if(RX_DR==0)        //如果收到数据
                {
                        if(RxBuf==0x01)        //打开开关
                        {
                                LED1=0;
                                Delay(5000);
                        }
                        else if(RxBuf==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
}

lcw_swust 发表于 2012-10-29 21:52:15

SetRX_Mode(); 函数的代码呢

feifanxp 发表于 2012-10-29 22:18:42

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;
}

夏日么么茶 发表于 2012-10-30 13:21:25

这我也遇到过,暂时没解决呢,你解决了记得发表下呐

feifanxp 发表于 2012-10-30 14:49:42

夏日么么茶 发表于 2012-10-30 13:21 static/image/common/back.gif
这我也遇到过,暂时没解决呢,你解决了记得发表下呐

必须的!

feifanxp 发表于 2012-10-30 15:48:13

额,暂时算是解决了,每次发送两次,中间间隔100ms,但是魂蛋啊到底为神马!

lcw_swust 发表于 2012-10-30 15:54:54

SetRX_Mode(); //无按键直接跳转到接收,一直循环。
这句放在while(1)之前试试

feifanxp 发表于 2012-10-30 16:53:42

lcw_swust 发表于 2012-10-30 15:54 static/image/common/back.gif
SetRX_Mode(); //无按键直接跳转到接收,一直循环。
这句放在while(1)之前试试

成了,果然把SetRX_Mode()放在循环外面就好了。{:lol:}
页: [1]
查看完整版本: 神了个奇了,51+NRF24L01每次都要发送两条同样指令才有反应