新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2014-8-16
- 在线时间
- 0 小时
|
5金钱
先讲一下整个过程。利用51控制nrf24l10发送数据,然后stm32控制nrf24l10接收。发送设置时发送32个字节,我在stm32接收程序中添加了一句中加了 一句for(k=0;k<32;k++)<br />
printf("the data is %d\t",tmp_buf[k]);<br />
现在情况是,通过按51板子上的按键可以向stm32发送数据,但是出现了两个大问题。一是发送32个字节,但是串口助手会收到64个字节,很奇怪。于是我在接收程序中添加了一个接收次数m,让串口助手显示m,发现m是2,也就是接收了两次。问题二:stm32总是接收上次按键按下发送的内容。比如,我设置按键1发送数组中第一个为1其他为0 ,设置按键2发送数组第二个位1其他为0。我按按键1,接收正确,但是再按按键2,出现上次发送的数据。再按才能出现按键2应该出现的内容。第三次如果按按键1,会出现按键2该出现的内容。<br />
一个星期,我快崩溃了。<br />
下面贴出代码:<br />
51单片机发送数据,其设置内容<br />
void nRF24L01_TxPacket(unsigned char * tx_buf)<br />
{<br />
CE=0;<br />
<br />
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // <br />
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); <br />
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); <br />
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // <br />
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // <br />
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //<br />
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // <br />
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); // <br />
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // <br />
CE=1;<br />
inerDelay_us(10);<br />
<br />
sta=SPI_Read(STATUS); // read register STATUS's value<br />
SPI_RW_Reg(WRITE_REG+STATUS,sta); // clear interrupt flag(TX_DS)<br />
<br />
stm32接收端设置<br />
void NRF24L01_RX_Mode(void)<br />
{<br />
NRF24L01_CE=0; <br />
NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);<br />
<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40); <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);<br />
NRF24L01_CE = 1;<br />
} <br />
接收程序<br />
u8 NRF24L01_RxPacket(u8 *rxbuf)<br />
{<br />
u8 sta; <br />
SPI2_SetSpeed(SPI_BaudRatePrescaler_8); <br />
sta=NRF24L01_Read_Reg(STATUS); <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);<br />
if(sta&RX_OK)<br />
{<br />
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);<br />
NRF24L01_Write_Reg(FLUSH_RX,0xff);<br />
return 0; <br />
} <br />
return 1;<br />
} <br />
<br />
<br />
至于各个寄存器的地址都是一样的,这个我自己对了一遍。stm32就是原子中的源码,自己在主函数中添加了一段串口助手显示程序。<br />
while(1)<br />
{ u8 k; <br />
if(NRF24L01_RxPacket(tmp_buf)==0)<br />
{<br />
m++;<br />
tmp_buf[32]=0;<br />
LCD_ShowString(0,190,239,32,16,tmp_buf); <br />
for(k=0;k<32;k++)<br />
printf("the data is %d\t",tmp_buf[k]);<br />
printf("the m is%d",m);<br />
}else delay_us(100); <br />
t++;<br />
if(t==10000)<br />
{<br />
t=0;<br />
LED0=!LED0;<br />
} <br />
}; <br />
<br />
<br />
求求给意见啊。谢谢啦。<br />
<br />
<br /> |
|