先讲一下整个过程。利用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;
}
};
求求给意见啊。谢谢啦。