近场感应 125K 曼彻斯特编码调制发送

 

 

AS3393 125K 曼彻斯特编码调制 发送:

 

Tclk为AS3933的时钟32.768KHz,  LF_RC_TIME=1s/32.768KHz = 30.517us 

Tcarr为125KHz,               Tcarr_TIME= 1s/125k= 8us

 

AS3933的曼彻斯特编码发送:  1为下降沿跳变,   0为上升沿跳变.

 

调制发送程序: 载波信号+前导+模式+正文

/********************************************************************************************/
/*  void LF_SendData(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u16 Send_Dat,u8 Advabce_TIM,u8 NxRC)  */
/*  R6_Dat ----- Pattern1 对应AS3393 R6寄存器的值 第1个唤醒前导码*/ 
/*  R5_Dat ----- Pattern2 对应AS3393 R5寄存器的值 第2个唤醒前导码 */
/*  Patt16_32    Pattern的编码位数                */
/*  Send_Dat_Len 发送的数据的长度*/
/*  LF_Send_CHx  选择哪一个通道调制发送           */
/*  NxRC         编码的速率 4 --- 32              */
/********************************************************************************************/void LF_SendData(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u16 Send_Dat_Len,u8 LF_Send_CHx,u8 NxRC)
{u8 i,j;u8 temp = 0;u8 Data_Buff[9];if((NxRC < 4)||(NxRC > 32))	  return;		Data_Buff[0] = ACTIVE_ID1;	Data_Buff[1] = ACTIVE_ID2;	Data_Buff[2] = ACTIVE_ID3;	Data_Buff[3] = ACTIVE_ID4;	Data_Buff[4] = ACTIVE_ID5;	Data_Buff[5] = ACTIVE_ID6;Data_Buff[6] = ACTIVE_ID7;	Data_Buff[7] = ACTIVE_ID8;	Data_Buff[8] = ACTIVE_ID9;	CarrierBurst(LF_Send_CHx,NxRC * LF_RC_TIME);	  //发送起始	if(LFSENDMODE)	 //唤醒机制:载波信号+前导+模式+正文{Pattern(R6_Dat,R5_Dat,Patt16_32,LF_Send_CHx,NxRC * LF_RC_TIME);	//模式字  (和AS3393寄存器配置一致,修改此值已达到和AS3933的配对使用。)}for(i = 0;i < Send_Dat_Len;i ++) //发送字节长度 , 即激活的ID字节数{				for(j = 0;j < 8;j ++)	 //发送一个字节{temp = Data_Buff[i] & 0x80;Data_Buff[i]= Data_Buff[i] << 1;//AS3933曼彻斯特编码  编码1: 1到0跳变    编码1持续时间366us			if(temp == 0x80)   //0x80 = 1000 0000    {Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx);  // NxRC=0x0c= 12  LF_RC_TIME=30.5us    //32768K// 开通时间12*30.5us=366usClock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us}//AS3933曼彻斯特编码  编码 0:0到1跳变  编码0持续时间366uselse                                 {								Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);	Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx);						}}}CH1_GPIO_CLOCK;CH2_GPIO_CLOCK;
}

 

 

.Carrier Burst: 125KHz载波信号时长配置,唤醒AS3393

Carrier Burst为125KHz载波信号,

长度最少16Tclk + 16Tcarr.Tclk为AS3933的时钟32.768KHz,Tcarr为125KHz,

则最小时间为16 * 30.5us + 16 * 8us = 616us.

最大长度要小于155Tclk,155*30.5us=4727.5us.

载波信号:

/********************************************************************************************/
/*         void Pattern(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u8 LF_Send_CHx,u16 Bit_Tim)        */
/***************************   发送前导码模式数据       **********************************/
/*  R6_Dat ----- Pattern1 对应AS3393 R6寄存器的值 第1个唤醒前导码*/ 
/*  R5_Dat ----- Pattern2 对应AS3393 R5寄存器的值 第2个唤醒前导码 */
/*  Patt16_32    Pattern的编码位数                 */
/*  LF_Send_CHx  选择调制发送通道           */
/*  Bit_Tim      编码时间                       */
/********************************************************************************************/void Pattern(u8 R6_Dat,u8 R5_Dat,u8 Patt16_32,u8 LF_Send_CHx,u16 Bit_Tim)  //发送模式字 0 - 16bit, 1 - 32bit
{u8 i;u16 Patt_Data = 0;Patt_Data = R6_Dat * 256 + R5_Dat;if(Patt16_32 == Patt_32bit){for(i = 0;i < 16;i ++){if(Patt_Data & 0x8000)	//取数据高8位{Out_125K(Bit_Tim,LF_Send_CHx);Clock_125K(Bit_Tim,LF_Send_CHx);					}else{Clock_125K(Bit_Tim,LF_Send_CHx);Out_125K(Bit_Tim,LF_Send_CHx);								}Patt_Data = Patt_Data << 1; 			}			}else{for(i = 0;i < 16;i ++){if(Patt_Data & 0x8000)	{Out_125K(Bit_Tim,LF_Send_CHx);				}else{Clock_125K(Bit_Tim,LF_Send_CHx);						}Patt_Data = Patt_Data << 1; 							}}
}

 Bit_Tim  = NxRC * LF_RC_TIME = 366us;    

NxRC=0x0c= 12 ;

 LF_RC_TIME=30.5us;

Preamble和Pattern总长度有限制.

当Pattern为16位时,总长度不能大于30个曼彻斯特码元,即 Patt_16bit_time≤ 30*8us=240us

当Pattern为32位时,总长度不能大于46个曼彻斯特码元.  即 Patt_32bit_time ≤ 46*8us=368us

 

正文:

void Out_125K(u16 tim, u8 LF_Send_CHx)	 	 //输出125K的波形
{switch(LF_Send_CHx){case LF_SEND_CH1:	CH1_GPIO_OPEN;	  //开始输出125KDelay_US(tim);	//开启的持续时间		break;case LF_SEND_CH2:	CH2_GPIO_OPEN;		//开始输出125KDelay_US(tim);		//开启的持续时间break;	default:break;}
}void Clock_125K(u16 tim, u8 LF_Send_CHx)	 //关闭输出125K的波形
{switch(LF_Send_CHx){case LF_SEND_CH1:	CH1_GPIO_CLOCK;	  //停止输出125k	Delay_US(tim);break;case LF_SEND_CH2: CH2_GPIO_CLOCK;;	//停止输出125k	Delay_US(tim);break;	default:break;}	
}#define  Patt_16bit     0
#define  Patt_32bit     1
#define  LF_SEND_CH1    1		    //LF发送通道
#define  LF_SEND_CH2    2
#define  LF_RC_TIME     30.5    //32768K  周期时间 30.5us#define	digitalHi(p,i)		 {p->BSRR=i;}	 //输出高电平	
#define digitalLo(p,i)		 {p->BRR=i;}	 //输出低电平
#define digitalToggle(p,i)   {p->ODR ^=i;} //输出反转状态#define  CH1_GPIO_OPEN    digitalHi(GPIOA,GPIO_Pin_8);digitalHi(GPIOB,GPIO_Pin_15);										
#define  CH1_GPIO_CLOCK   digitalLo(GPIOA,GPIO_Pin_8);digitalLo(GPIOB,GPIO_Pin_15);#define  CH2_GPIO_OPEN    digitalHi(GPIOA,GPIO_Pin_2);digitalHi(GPIOA,GPIO_Pin_3);
#define  CH2_GPIO_CLOCK   digitalLo(GPIOA,GPIO_Pin_2);digitalLo(GPIOA,GPIO_Pin_3);

 

参考: https://blog.csdn.net/jdh99/article/details/8677187   
 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部