赞
踩
带序列的跳频示意图:
- #define TIMXCNT TIM3->CNT
- #define NRF_CH_SIZE 32 //频道数目
- typedef struct
- {
- u8 rsq[NRF_CH_SIZE]; //序列
- u32 seed ; //随机种子
- u32 rsqval; //当前序列值
- } _rsq_st ; //与随机序列有关的变量
- _rsq_st rsq_st;
-
-
- u8 semflag=0; //全局标志变量,用于同步线程
- u8 print_flag=0; //用于串口打印输出的标志变量
- /*字节对齐,方便读写*/
- #pragma pack(push)
- #pragma pack(4)
- u8 tmp_Tbuf[NRF_CH_SIZE];
- u8 tmp_Rbuf[NRF_CH_SIZE];
- #pragma pack(pop)
-
- u8 pdatas[255]={0}; //用于打印测试
-
- TIM3_Int_Init(50000-1 ,72-1 ); // 定时arr=50000
- #ifdef NRF24LXX_MASTER //主机代码
- void TIM3_IRQHandler(void) //TIM3中断
- {
- static u8 i=0 ;
- if ( TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET) //检查中断源
- {
- TIM_ClearITPendingBit( TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位
-
-
- if( NRF_CH_SIZE == i) //序列周期到了
- {
- i=0;
- revflag=1;
- rsq_st.seed = *(u32*)(tmp_Rbuf+4) ; //接收种子
- BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
- }
-
- rsq_st.rsqval = rsq_st.rsq[i];
- tmp_Tbuf[0] = i+'@';
- tmp_Tbuf[1] = i+'@';
- semflag = 0;//
- i++;
- }
- }
- #else //从机代码
- void TIM3_IRQHandler(void)
- {
- static u8 i=0 ;
- if (TIM_GetITStatus( TIM3, TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
-
- if( NRF_CH_SIZE == i )
- {
- i=0;
- revflag=1;
- BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
- }
-
- NRF24L01_SET_rfch( rsq_st.rsq[i] ) ; //根据序列跳频
- NRF24L01_TX_Mode(1);
- tmp_Tbuf[0] = i+'@'; //改变其中一个发射值
- tmp_Tbuf[1] = i+'@'; //改变其中一个发射值
- NRF24L01_TxPacket( tmp_Tbuf);
- semflag = 0;
- i++;
- }
- }
- #endif
-
-
- /*生成随机种子并装载至发生内存*/
- u32 mySequence()
- {
- rsq_st.seed = get_random();//随机种子
- *(u32*)(tmp_Tbuf+4) = rsq_st.seed;
- return rsq_st.seed;
- }
-
- # ifdef NRF24LXX_MASTER //主机代码
- static u8 i=0;
- NRF24L01_RX_Mode(1);//接收模式,开启自动应答
- BuildRandomSequence( rsq_st.rsq, NRF_CH_SIZE, rsq_st.seed);//利用种子生成特定序列
- while(1)
- {
- switch( semflag)
- {
- case 0:
- NRF24L01_SET_rfch( rsq_st.rsqval ) ; //根据序列跳频
- NRF24L01_RX_Mode(1);
- semflag++;
- break ;
- case 1:
- if( print_flag )//打印数据
- {
- print_flag=0;
- fz+= i;fm+=NRF_CH_SIZE;
- printf (" %d:%d:%.4f:", temp, i, fz/ fm);
- pdatas[ i]='\r',pdatas[ i+1]='\n';
- myUSART_Sendarr( USART1, pdatas , i+2) ;
- i=0;
- }
- semflag++;
- break ;
- case 2:
- if( TIMXCNT <30000)
- {
- if(NRF24L01_RxPacket( tmp_Rbuf)==0)//接收到信息
- {
- temp= TIM3->CNT ;
- TIM3->CNT=1800 ;
- pdatas[ i]= tmp_Rbuf[0];
- i++;
- }
- }
- else
- semflag++;
- break ;
- case 3:
- NRF24L01_TX_Mode(1); //发送模式,开启自动应答自动从发
- semflag++;
- break ;
- case 4:
- NRF24L01_TxPacket( tmp_Tbuf);
- if( semflag==4) semflag++;
- mySequence();//生成随机种子并装载发送内存,为下一周期准备
- break ;
- case 5:
- break ;
- }
- }
- }
- #else //从机代码
- {
- static u16 temp ;
- static u8 i=0;
-
-
- NRF24L01_TX_Mode(1);//发送模式,开启自动应答自动从发
- mySequence(); //生成随机数并装载发送内存,为下周期准备
- while(1)
- {
- if( TIMXCNT >20000) //时间到了开始接收模式
- {
- if( semflag == 0)
- {
- NRF24L01_RX_Mode(1); //接收模式,开启自动应答
- semflag++;
- }
- else if(TIMXCNT <49500)
- {
- if(NRF24L01_RxPacket( tmp_Rbuf)==0) //接收到信息
- {
- temp=TIM3->CNT ; //用于观察计数器
- pdatas[i]= tmp_Rbuf[0];//取第一个数装载至pdatas ,用来测试
- i++;
- }
- }
- }
-
- if( print_flag ) //打印数据
- {
- print_flag=0;
- fz+= i;fm+= NRF_CH_SIZE;
- printf ("%d:%d:%.4f:", temp, i, fz/ fm);//串口打印
- pdatas[i]='\r',pdatas[i+1]='\n';
- myUSART_Sendarr( USART1, pdatas, i+2); //串口打印数组
- i=0;
- }
- };
- }
- #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。