韦根协议——STM32收发

  • 韦根26位STM32收发

简介:Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,门禁系统的读卡器、IC卡常用到这种协议。此协议没有规定数据传输的波特率和长度。目前市场上常用的数据长度是26bit,34bit,36bit,44bit等。由于34bit与26bit原理相同的,代码仅仅是一点点区别,在这里主要讲述的是26bit

Wiegand 26格式:

校验位1HIDPID校验位2
1bit2~9bit10~25bit26bit

第2~9位:ID卡HID码的低8位

第10~25位:ID卡的PID号码

第1位:2~13位的偶校验位

第26位:14~25位的奇校验位

校验位1: 2~13位中,如果有偶数个1,则校验位1 = 0,反之为1

校验位2:14~25位中,如果有奇数个个1,则校验位2 = 0,反之为1

通信:

​ 韦根的发送主要是依赖于两根数据线,一根是DATA0,另外一根是DATA1。由名字不难看出出,DATA0主要是发数据“0”的,而DATA1主要是发送数据“1”的。

发送:

​ 在空闲的时候,两根数据线的电平都是为高的。当想发送“0”的时候,DATA0数据线由高电平被拉低并保持100us-300us的持续时间,就会将数据“0”发送出去。而发送数据“1”的方法也是类似的,但要注意的是在发送完一位数据后,要有1ms~3ms的时间间隔才去发送下一位数据。
韦根26的发送
上图是我用逻辑分析以抓取出来的数据,由图可知低电平持续的时间大概是200us,而下个信号再发出的时间是2ms左右。

接收:

​ 韦根的接收由于是不用判断脉冲宽度的,速度很快,仅仅是一个电平就可以了的。所以通常采用的是中断的方式去进行接收。两张卡的电平最小时间间隔是250ms,所以当要接收多张卡片时,可以用这个时间去判断这一张卡片的数据是否完全接收完成。

整体介绍完了,下面看看代码实现。

韦根26的发送:

int WG_Send26(unsigned char *str)
{
	unsigned char i, j, one_num	= 0;
	unsigned char even 		= 0;
	unsigned char odd 		= 0;
	unsigned short check_temp;
	unsigned short wgdata = 0;
	
	if(NULL == str)
		return -1;
 //偶校验
	check_temp = str[0];
	for(i = 0;i < 8;i++)
	{
		if(check_temp<<i & 0x80)
			one_num+=1;
	}	
	check_temp = str[1];
	for(i = 0;i < 4;i++)
	{
		if(check_temp<<i & 0x80)
			one_num+=1;
	}
	if(one_num % 2 )
		even = 1;
	else
		even = 0;
 
	
	//奇校验
	one_num = 0;
	check_temp = str[1];
	for(i = 0;i < 4;i++)
	{
		if(check_temp>>i & 0x01)
			one_num+=1;
	}
	check_temp = str[2];
	for(i = 0;i < 8;i++)
	{
		if(check_temp<<i & 0x80)
			one_num+=1;
	}
	if(one_num % 2 )
		odd = 0;
	else
		odd = 1;

	DATA0 = 1;
	DATA1 = 1;
	delay_ms(1);

	if(even)
	{
		WG_send_bit_1();
	}
	else
	{			
		WG_send_bit_0();
	}
	
		//发送24位
	for(i=0;i<3;i++) {		
	wgdata = str[i];
		for(j=0;j<8;j++)
		{
			if((wgdata<<j) & 0x80)
			{
					WG_send_bit_1();
			}
			else
			{
					WG_send_bit_0();
			}	   
		}
	}

	if(odd)
	{
		WG_send_bit_1();
	}
	else
	{			
		WG_send_bit_0();
	}
	DATA0 = 1;
	DATA1 = 1;
 
	return 0;
}

韦根26的接收:

int WG_Recv26(unsigned char *str)
{
		if(WG_State){
			if(WG_Count == 26){
				str[0] = WG_Data>>17 & 0xFF;
				str[1] = WG_Data>>9 & 0xFF;
				str[2] = WG_Data>>1 & 0xFF;
				check_even_odd(str);
				if(EVEN == (WG_Data>>25 & 0x01) && ODD == (WG_Data & 0x01)){
						WG_State = 0;
						WG_Data = 0;
						WG_Count = 0;
						return 1;
				}	
				else {
						WG_State = 0;
						WG_Data = 0;
						WG_Count = 0;
						return 0;
				}
			}
			WG_State = 0;
			WG_Data = 0;
			WG_Count = 0;
			return -1;
		}
		return -2;		
}

中断:

//外部中断3服务程序
void EXTI0_IRQHandler(void)
{

	if( EXTI_GetITStatus(EXTI_Line0) != RESET ) 
	{
		TIM_SetCounter(TIM3,0); 
    TIM_Cmd(TIM3, ENABLE);
		if(DATA_IN0 == 0){

				WG_Data <<= 1;
				WG_Count++;
		}			
		EXTI_ClearITPendingBit(EXTI_Line0);  //清除LINE2上的中断标志位  
		}
}

//外部中断4服务程序
void EXTI1_IRQHandler(void)
{

	if( EXTI_GetITStatus(EXTI_Line1) != RESET ) 
	{
	 TIM_SetCounter(TIM3,0); 
   TIM_Cmd(TIM3, ENABLE);
			if(DATA_IN1 == 0){
					WG_Data = (WG_Data<<1) | 0x01;
					WG_Count++;
		}
		EXTI_ClearITPendingBit(EXTI_Line1);  //清除LINE3上的中断标志位  
	}
}

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		WG_State = 1;
		TIM_Cmd(TIM3, DISABLE);
	}
}

韦根26收发的步骤跟程序也都记录下来了,可能有些地方描述的不清晰或者有错误,希望找到错误的朋友能在下面提醒我一下,我好做更改。
整体测试工程是下面链接可下载,要是没积分的话可留邮箱,我见到就会发。单片机用的是STM32f103系列的(好像是…)
工程下载

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: STM32模拟韦根输出电路是一种用于将STM32单片机的数字信号转换为韦根信号输出的电路。韦根信号是一种用于传输数据的协议,常用于数字计数器、编码器等设备的通信中。 实现STM32模拟韦根输出电路一般需要以下几个主要组成部分:STM32单片机、电平转换电路、滤波电路和韦根信号输出端口。 首先,需要将STM32单片机的数字信号转换为韦根协议所需的电平。电平转换电路一般使用电平转换芯片,将STM32单片机的5V或3.3V数字信号转换为5V或12V的韦根信号电平。 接下来,为了提高韦根信号的稳定性和可靠性,需要使用滤波电路对韦根信号进行滤波处理。滤波电路可以使用LC电路、RC电路等来实现,以去除干扰和噪声,保证韦根信号的准确性。 最后,将转换和滤波后的韦根信号通过韦根信号输出口连接到外部设备,如计数器、编码器等,以实现信息的传输和通信。 通过上述的电路设计和组成部分的搭建,就可以实现STM32模拟韦根输出电路。该电路可以广泛应用于各种需要韦根信号的设备,提高通信效率和稳定性。 ### 回答2: STM32是一款功能强大的微控制器系列,具有广泛的应用领域。韦根编码是一种常用的信息传输方式,它被广泛应用于无线通信和数据传输中。在使用STM32实现韦根输出电路时,需要以下步骤: 首先,我们需要选取一款STM32微控制器,该微控制器应支持外设中的定时器功能。定时器模块可以用来生成高低电平不同持续时间的脉冲,从而实现韦根编码的输出。 接下来,我们需要将韦根编码的逻辑电平与STM32微控制器的引脚相连接。通常,我们可以选择一个GPIO引脚作为输出引脚,并使用内部上拉电阻拉高其电平。在输出时,通过设置引脚的输出电平状态来实现高低电平的切换。 然后,在编程上,我们可以通过配置定时器的工作模式来实现韦根编码的输出。定时器的工作模式应选择为输出比较模式,这样可以在定时器计数值与设定的比较值相等时,自动产生一个输出脉冲,从而实现韦根编码中高低电平的切换。 最后,在程序中,我们可以通过编写中断服务函数来控制韦根编码的输出频率和持续时间。在每个中断周期,可以通过改变比较值的大小来控制输出脉冲的持续时间,从而实现不同电平的切换。 综上所述,通过选取适合的STM32微控制器并编写相应的程序,我们可以实现STM32模拟韦根输出电路。这样,我们可以利用STM32的功能和灵活性来实现韦根编码的输出,应用于无线通信和数据传输等领域。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值