天线|RF射频
直播中

张秀兰

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

STM32控制nrf24l10,发送32个字节会收到64个字节是为什么?

先讲一下整个过程。利用51控制nrf24l10发送数据,然后STM32控制nrf24l10接收。发送设置时发送32个字节,我在stm32接收程序中添加了一句中加了 一句for(k=0;k<32;k++)

printf("the data is %dt",tmp_buf[k]);

现在情况是,通过按51板子上的按键可以向stm32发送数据,但是出现了两个大问题。一是发送32个字节,但是串口助手会收到64个字节,很奇怪。于是我在接收程序中添加了一个接收次数m,让串口助手显示m,发现m是2,也就是接收了两次。问题二:stm32总是接收上次按键按下发送的内容。比如,我设置按键1发送数组中第一个为1其他为0 ,设置按键2发送数组第二个位1其他为0。我按按键1,接收正确,但是再按按键2,出现上次发送的数据。再按才能出现按键2应该出现的内容。第三次如果按按键1,会出现按键2该出现的内容。

一个星期,我快崩溃了。

下面贴出代码:

51单片机发送数据,其设置内容

void nRF24L01_TxPacket(unsigned char * tx_buf)

{

CE=0;



SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);

SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //

SPI_RW_Reg(WRITE_REG + RF_CH, 40);        //

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);   //

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     //

CE=1;

inerDelay_us(10);



sta=SPI_Read(STATUS);        // read register STATUS's value

SPI_RW_Reg(WRITE_REG+STATUS,sta);        // clear interrupt flag(TX_DS)



stm32接收端设置

void NRF24L01_RX_Mode(void)

{

NRF24L01_CE=0;         

          NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);



          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);   

          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);     

          NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);

          NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);

          NRF24L01_CE = 1;

}                                                

接收程序

u8 NRF24L01_RxPacket(u8 *rxbuf)

{

u8 sta;                                                                              

SPI2_SetSpeed(SPI_BaudRatePrescaler_8);   

sta=NRF24L01_Read_Reg(STATUS);

NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);

if(sta&RX_OK)

{

NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);

NRF24L01_Write_Reg(FLUSH_RX,0xff);

return 0;

}           

return 1;

}                                            





至于各个寄存器的地址都是一样的,这个我自己对了一遍。stm32就是原子中的源码,自己在主函数中添加了一段串口助手显示程序。

while(1)

{        u8 k;                                                                           

if(NRF24L01_RxPacket(tmp_buf)==0)

{

m++;

tmp_buf[32]=0;

LCD_ShowString(0,190,239,32,16,tmp_buf);

for(k=0;k<32;k++)

printf("the data is %dt",tmp_buf[k]);

printf("the m is%d",m);

}else delay_us(100);           

t++;

if(t==10000)

{

t=0;

LED0=!LED0;

}                                    

};





求求给意见啊。谢谢啦。




回帖(5)

卢原继

2020-5-19 08:46:30
帮顶。。。。
举报

何夏庄

2020-5-19 08:58:31
回复【2楼】发烧友:

-----------------------------

今天早上第二个问题已解决了,是出在51程序上面,发现51发送程序少了清除发送缓存的内容,真是该死。

void nRF24L01_TxPacket(unsigned char * tx_buf)

{

        CE=0;

       

        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 

        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); 

                SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); 

        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // 

        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // 

        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //

        SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // 

        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);   // 

        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // 

        CE=1;

        inerDelay_us(10);

        while(IRQ!=0);

        sta=SPI_Read(STATUS);        // read register STATUS's value

        SPI_RW_Reg(WRITE_REG+STATUS,0xff);        // clear interrupt flag(TX_DS)

        SPI_RW_Reg(FLUSH_TX,0x00);//这是添加的语句,

}









希望以后遇到这个问题同学能够及时看到,因为看到几个51控制nfr的程序中都没有这一项。好吧再来看看怎么解决第一个问题!
举报

孙喆

2020-5-19 09:12:07

能发送接收,问题就不大了,多检查一下代码。
举报

张茜

2020-5-19 09:27:14

这段时间一直再查,所有的设置都是正确,但是就是一下发送64个字节,但是我设置的是32个字节。搞不懂啊。快崩溃了。
举报

更多回帖

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