关于STM32数组环形缓冲区NRF24L01无线接收实验
1,NRF24L01查询方式接收32个数据
2,定时器中断一次将接收到的数据输出一个数据。(也就是中断32次才能发送完NRF24L01接收到的一帧数据)
3,可以想像成NRF24L01为输入数据,定时器中断为输出数据。由于输入与输出速度不一样,所以必需加个环形数据缓冲区。
unsigned char FIFO_1[32];
unsigned char FIFO_2[32];
unsigned char FIFO_3[32];
unsigned char FIFO_4[32];
unsigned char FIFO_5[32];
unsigned char FIFO_6[32];
unsigned char FIFO_7[32];
unsigned char FIFO_8[32];
unsigned char FIFO_9[32];
unsigned char FIFO_10[32];
u8 tmp_buf[32];//NRF24接收数组
//FIFO缓冲区
void FIFO_mpt(unsigned int a,unsigned char *d)
{
switch(a)
{
case 1: {*FOFI_1=*d;} break;
case 2: {*FOFI_2=*d;} break;
case 3: {*FOFI_3=*d;} break;
case 4: {*FOFI_4=*d;} break;
case 5: {*FOFI_5=*d;} break;
case 6: {*FOFI_6=*d;} break;
case 7: {*FOFI_7=*d;} break;
case 8: {*FOFI_8=*d;} break;
case 9: {*FOFI_9=*d;} break;
case 10: {*FOFI_10=*d;}break;
default:break;
}
}
/
unsigned char TIM3_dataNRF[32];
//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
r++;
SPI_WR(TIM3_dataNRF[r]);
TIM3_dataNRF[r]=0;//清0
if(r>=32) r=0;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
int main(void)
{
unsigned int t=0,f=0,e=0,i=0,k=0,uuu=0,tt=0,r=0,n=0,fgt=10,G=0,OFF=1;
Stm32_Clock_Init(9);//系统时钟设置72MHZ
SPI2_Init();
TIM3_Int_Init(7,200);//
NRF24L01_Init(); //初始化NRF24L01
while(1)
{
if((r>5)&&OFF) {OFF=0;TIM3->CR1|=0x01;}//NRF24L01接收到5帧数据才开定时器
if(NRF24L01_RxPacket(tmp_buf)==0)//判断NRF24是否接收到一帧数据
{
// 存在FIFO缓冲区
r++;
FIFO_mpt(r,tmp_buf+1); // 存在FIFO缓冲区
if(r>=10) {r=0;}
}
if(TIM3_dataNRF[1]==0)//检查定时器中的数据是否输出完了
{
//将FIFO中的数据复给中断输出
if(FOFI_1[10]) {*TIM3_dataNR=*FFOFI_1; for(i=0;i<32;i++) FFOFI_1[i]=0;}//清0
else if(FOFI_2[10]){ *TIM3_dataNR=*FFOFI_2; for(i=0;i<32;i++) FFOFI_2[i]=0;}//清0
else if(FOFI_3[10]){ *TIM3_dataNR=*FFOFI_3; for(i=0;i<32;i++) FFOFI_3[i]=0;}//清0
else if(FOFI_4[10]){ *TIM3_dataNR=*FFOFI_4; for(i=0;i<32;i++) FFOFI_4[i]=0;}//清0
else if(FOFI_5[10]){ *TIM3_dataNR=*FFOFI_5; for(i=0;i<32;i++) FFOFI_5[i]=0;}//清0
else if(FOFI_6[10]){ *TIM3_dataNR=*FFOFI_6; for(i=0;i<32;i++) FFOFI_6[i]=0;}//清0
else if(FOFI_7[10]){ *TIM3_dataNR=*FFOFI_7; for(i=0;i<32;i++) FFOFI_7[i]=0;}//清0
else if(FOFI_8[10]){ *TIM3_dataNR=*FFOFI_8; for(i=0;i<32;i++) FFOFI_8[i]=0;}//清0
else if(FOFI_9[10]){ *TIM3_dataNR=*FFOFI_9; for(i=0;i<32;i++) FFOFI_9[i]=0;}//清0
else if(FOFI_10[10]){ *TIM3_dataNR=*FFOFI_10; for(i=0;i<32;i++) FFOFI_10[i]=0;}//清0
}
if((FOFI_1[10]==0)||(FOFI_2[10]==0)||(FOFI_1[10]==0)||(FOFI_3[10]==0)||(FOFI_4[10]==0)||(FOFI_5[10]==0)||(FOFI_6[10]==0)||
(FOFI_7[10]==0)||(FOFI_8[10]==0)||(FOFI_9[10]==0)||(FOFI_10[10]==0))
{
LED=1;//LED灭 说明FIFO有数据
}
else {LED=0;}//LED亮 说明FIFO没数据
if(FOFI_1[10]&&FOFI_2[10]&&FOFI_3[10]&&FOFI_4[10]&&FOFI_5[10]&&FOFI_6[10]&&FOFI_7[10]&&FOFI_8[10]&&FOFI_9[10]&&FOFI_10[10])
{
LED_FIFO=0;//LED亮 说明FIFO滿
}
}
}
NRF24L01发送的是1到32,,接收也是1到32。但中断输出的数据却是乱的。。说明程序FIFO传递到中断里的数据不知道那里错了。。
中断里的SPI输出有时候为0,,我在NRF24接收中每个数据加1了。。什么会输出有0数据。程序那里跑乱了。
//注意定时时间与NRF24L01接收到的时间是一样的,,也就是说FIFO不可能满和空的。NRF24L01有可能丢包。但中断里的SPI输出不可能有O数值。。
程序那里跑乱了。谢谢高手指点
我来回答