STM32 驱动无线NRF24L01 的稳定修正
void sent_data(u8* fp,u16 flong)
{
u16 i;
TX_Mode((u8*)&flong); //传送长度
while(!tran); //等待完成
tran=0;
flong=flong/33+1;
while(flong)
{
for(i=0;i<20000;i++);//这个延时的非常必要 大约2MS 左右
if(MAX_RT) return;//无应答返回
TX_Mode(fp); //传送数据
while(!tran); //等待完成
tran=0;
fp+=32;flong--;
}
}
更加合理的延时写法 ,发送分两部分 首先发送内容长度 然后发送内容
修正处
if(RX_NU==2&&Timer2==0)
{
USART2_Puts("传输错误 ");
USART2_Puts("\r\n");
RX_NU=1;
}
貌似这个if的进入是不可能的 但是由于在中断里更新了 Timter2 所以产生了不可预计的后果。
修正处
if(RX_DR) // 判断是否接受到数据
{
if(RX_NU==1)
{
CE_L;
SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据
SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); //清除RX_DS中断标志
rectnu=RX_BUF[0];rectnu|=RX_BUF[1]<8; //接收串长
onerc=rectnu/33+1; //计算接收次数
Timer2=50;RX_NU=2;///*超时时间*/
PRX_BUF=RX_BUF; //恢复指针
RX_Mode();return;
}
if(RX_NU==2)
{
CE_L;
SPI_Read_Buf(RD_RX_PLOAD, PRX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据
SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); // 清除RX_DS中断标志
onerc--;PRX_BUF+=32;//接收计数 接收指针移动
if(!onerc)
{
RX_NU=1;
RX_BUF[rectnu]=\0; //截取有效串长
USART2_Puts(RX_BUF); //串口发送接收到的字符
USART2_Puts("\r\n");
}
Timer2=50;///*超时时间*/
RX_Mode();return;
}
}
传输错误后合理的指针恢复
STM32驱动无线NRF24L0 相关文章:
- STM32 驱动无线NRF24L01 完成串口数据传输(12-03)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)