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

7 篇文章 0 订阅

 

 

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=366us
			Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us
			}
			//AS3933曼彻斯特编码  编码 0:0到1跳变  编码0持续时间366us
			else                                 
			{								
				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 CarrierBurst(u8 LF_Send_CHx,u16 Bit_Tim)                         */
/***************************    125KHz载波信号时间         **********************************/
/*  LF_Send_CHx  选择调制发送通道           */
/*  Bit_Tim     编码的时间                      */
/********************************************************************************************/

void CarrierBurst(u8 LF_Send_CHx,u16 Bit_Tim)
{
	unsigned int i;
	
    if(ONOFF_SCAN)						//scan模式
		Out_125K(3200,LF_Send_CHx);	    //开启载波  3000us
	else                            //ON/OFF模式
		Out_125K(2200,LF_Send_CHx);	    //开启载波  2200us

	Clock_125K(Bit_Tim,LF_Send_CHx); //停止125K信号
		 
	if(LFSENDMODE)	  //模式: 载波+前导+模式+正文				
	{
		for(i = 0;i < 6;i ++)	 	         //至少3组10
		{
			Out_125K(Bit_Tim,LF_Send_CHx); 	 //开启125K信号 为1
			Clock_125K(Bit_Tim,LF_Send_CHx); //停止125K信号 为0 				 
		}	
	}
}

125K载波频率,CarrierBurst至少发布3组10,即 101010.

 

前导+模式:

/********************************************************************************************/
/*         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

 

正文:

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=366us
			Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);// 关闭时间12*30.5us=366us
			}
			//AS3933曼彻斯特编码  编码 0:0到1跳变  编码0持续时间366us
			else                                 
			{								
				Clock_125K(NxRC * LF_RC_TIME,LF_Send_CHx);	
				Out_125K(NxRC * LF_RC_TIME,LF_Send_CHx);						
			}
		}
	}

 

 

125K 输出调制:

void Out_125K(u16 tim, u8 LF_Send_CHx)	 	 //输出125K的波形
{
	  switch(LF_Send_CHx)
		{
			case LF_SEND_CH1:	CH1_GPIO_OPEN;	  //开始输出125K
					 Delay_US(tim);	//开启的持续时间		
				  break;
			case LF_SEND_CH2:	CH2_GPIO_OPEN;		//开始输出125K
					Delay_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   
 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值