天线|RF射频
直播中

徐夕武

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

nrf24l01接收函数放在定时器中断里出什么问题了?

                                         
                                                                            void main()

{

    nRF24L01_Set_TX_Mode(0);//接收

    USART_Init();

    //timer0Init();

    while(1)

    {

         order=Check_Rec();  

    }

}


void timer0() interrupt 1 using 1

{

    //order=Check_Rec();

    count++;

    if(count==20)count=0;

}




uchar Check_Rec()

{     

    uchar status;

    uchar RX_Buffer[6];

    sta=SPI_R_byte(READ_REG+STATUS);

    if(RX_DR)

   {  

      CE=0;  

      SPI_R_DBuffer(RD_RX_PLOAD,RX_Buffer,RX_PLOAD_WIDTH);

      SendDate(sta);//串口发送一个字节数据

      SPI_W_Reg(WRITE_REG+STATUS,0xff);

      CSN=0;

      SPI_W_Reg(FLUSH_RX,0xff);//SPI写寄存器一字节函数,reg:寄存器地址,value:一字节(值)

      CSN=1;

      CE=1;

  }

     return status;

}


我用一款宏晶新出的单片机,51内核的,测试nrf24l01无线通信模块,  按键控制的发送模块,每按下一次就发送一次,


1.    当我把order=Check_Rec();  放在定时器中断里面去查询是否接收到数据的时候,



SendDate(sta);发送给串口的数据为 0x40 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E........................................(0x4e为不正常值)(只发送了一次的结果)


2.   当我把order=Check_Rec();  放在主函数查询是否接收到数据的时候,



SendDate(sta);发送给串口的数据为 0x40(正常值)(只发送了一次的结果)




我已经通过SPI_W_Reg(WRITE_REG+STATUS,0xff);把接收标志位给清除了,为什么每次进入中断里都能进入

if(RX_DR)


{ 这里...}






中断时间为70ms














回帖(2)

王建华

2020-5-26 14:10:22
帮顶
举报

李昕萌

2020-5-26 14:17:42

呵呵,又仿真了一下,结果呢是这样,SPI_W_Reg(FLUSH_RX,0xff);这句话  里面的0xff传进函数里了,但是不知道怎么了,这个值到最后变成了0x0f,写给无线里的寄存器了,所以接收中断标志位没有清除,才出现以上的错误,   可是为什么  Check_Rec() 放在主函数里 那个0xff的形参就在传递的过程中不会改变呢?         为什么传递传递着值就变了呢?   换了好几个版本的kile,还是这样。用pic测试了,没有问题!
举报

更多回帖

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