资源描述
韦根协议
Wiegand协议是国际上统一的标准,是由摩托罗拉公司制定的一种通讯协议。它合用于涉及门禁控制系统的读卡器和卡片的许多特性。 它有很多格式,标准的26-bit 应当是最常用的格式。此外,尚有34-bit 、37-bit 等格式。 而标准26-bit 格式是一个开放式的格式,这就意味着任何人都可以购买某一特定格式的HID卡,并且这些特定格式的种类是公开可选的。26-Bit格式就是一个广泛使用的工业标准,并且对所有HID的用户开放。几乎所有的门禁控制系统都接受标准的26-Bit格式。
简介
Wiegand协议是国际上统一的标准,有很多格式,标准的26-bit 应当是最常用的格式。此外,尚有34-bit 、37-bit 等格式。但是安防行业并不乐意把这些格式公开,而安防公司也经常变化这些格式来保证产品的保密性。而标准26-bit 格式是一个开放式的格式,这就意味着任何人都可以购买某一特定格式的HID卡,并且这些特定格式的种类是公开可选的。26-Bit格式就是一个广泛使用的工业标准,并且对所有HID的用户开放。几乎所有的门禁控制系统都接受标准的26-Bit格式。
Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,它合用于涉及门禁控制系统的读卡器和卡片的许多特性;其协议并没有定义通讯的波特率、也没有定义数据长度韦根格式重要定义是数据传输方式:Data0和Data1两根数据线分别传输0和1.现在应用最多的是26bit,34bit,36bit,44bit等等。
韦根数据输出的基本概念
韦根数据输出由二根线组成,分别是DATA0 和 DATA1 ;二根线分别为‘0’或‘1’输出。
输出‘0’时:DATA0线上出现负脉冲;
输出‘1’时:DATA1线上出现负脉冲;
负脉冲宽度TP=100微秒;周期TW=1600微秒;
具体时序如下:
例如:数据‘01000’的时序如下:
韦根26位输出格式
标准韦根输出是由26位二进制数组成,每一位的含义如下:
1 2 9 10 25 26
X X X X X X X X X X X X X X X X X X X X X X X X X X 二进制
第1位为2—13位的偶校验位
第2—9位相应与电子卡HID码的低8位
第10-25位相应电子卡的PID号码
第26位为14-25位的奇校验位
这26位数据在读出器的韦根输出线D0,D1上输出。
------------------------------------------------------------------------------
韦根26位输出格式:
E XXXX XXXX XXXX XXXX XXXX XXXX O
前12BIT偶校验 前12位 后12位 后12BIT奇校验
以上数据从左至右顺序发送。高位在前。
假如电卡的地区码位2个字符,即8位则可用那设立255个地区码((15x16)+15=255);电子卡的卡
号位4个字符,即16位则可设立65536个卡号
((15x16x16x16)+(15x16x16)+(15x16)+15= 65,535)。
以电子卡为标准26位韦根格式为例,假设电子卡号码为:
地区码 :01 卡号:0001
韦根输出为:
1 0000 0001 0000 0000 0000 0001 0
前12BIT偶校验 前12位 后12位 后12BIT奇校验
地区码 卡号
--------------------------------------------------------------------------------------
标准韦根输出是由26位二进制数组成,每一位的含义如下:
EXXXXXXXXXXXXXXXXXXXXXXXXO二进制
第1位为2-13位的偶校验位
第2-9位相应与电子卡HID码的低8位
第10-25位相应电子卡的PID号码
第26位为14-25位的奇校验位
以上数据从左至右顺序发送。高位在前。
例如:一只HID:16385,PID:00004的电子卡其26位韦根输出为:
00
检查位HID=16385(二进制的低8位)PID=4(二进制)检查位
这26位数据在读出器的韦根输出线DATA0,DATA1上输出。
DATA0,DATA1在没有数据输出时都保持+5V高电平。若输出为0,则DATA0拉低一段时间,若输出为1,则DATA1拉低一段时间。
两个电子卡韦根输出之间的最小间隔为0.25秒。
韦根26接受
韦根的接受对时间的实时性规定比较高,假如用查询的方法接受会出现丢帧的现象:假设查询到DATA0为0时主程序正在指向其他任务,等主程序执行完该任务时DATA0已经变为1了,那么这样就导致了一个0 bit丢了,这样读出的卡号肯定奇偶校验通但是,所以表现出CPU接受不到ID模块发送的卡号了。
唯一的办法是在外部中断里接受每个bit。(仅仅在中断里获得开始接受wiegand数据还不行,由于这是尽管给开始接受wiegand数据标志位置位了,但是主程序还在执行其他代码而没有到达查询开始接受wiegand数据标志位这条指令)。
五.韦根 接口定义:
Wiegand接口界面由三条导线组成:数据0(Data0),数据1(Data1)和 Data return。这3条线负责传输Wiegand信号。D0,D1在没有数据输出时都保持+5V高电平。若输出为0,则D0拉低一段时间,若输出为1,则D1拉低一段时间。如图:
两个电子卡韦根输出之间的最小间隔为0.25秒。
DATA0:暂定,兰色,P2.5 (通常为绿色)。
DATA1:暂定,白色,P2.6 (通常为白色)。
GND: (通常为黑色), 暂定信号地。
当安装商拿到读卡器时,他们希望在读卡器和门禁控制面板的连接点(终端)上都可以看到这三个名称。
目前所有的标准型读卡器都提供可选择的Wiegand接口。这三条线负责传送Wiegand数据,也被称为Wiegand信号。
六.发送程序:
//------------------------------------------------------
//功能:把数组封包成韦根26的格式,并发送出去
// 原理是把每个字节的低4位取出,来计算这个字节的值
//入口:str=要封包的数组,
//出口:DATA0 = P3.0; DATA1=P3.1
//设计:大鹏,大鹏艾迪,2023/4/11
//------------------------------------------------------
void send_wiegand26(uchar *str)
{
//| wiegand[0] | wiegand[1] | wiegand[2] |
//| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)|
uchar data i;
static uchar data one_num; //计算1的个数
uchar data check_temp; //韦根包奇偶效验中间暂存
bit data even; //韦根包前12位偶效验
bit data odd; //韦根包后12位齐效验
static uchar data wiegand[3]; //韦根包数据24位
//--------------------------------端口方向定义
P3M0 = 0x00; //普通I/O口
P3M1 = 0x00;
//================================数组到韦根包的转化
wiegand[0] = wiegand[0]|((*str)<<4);//原理是把每个字节的低4位取出,来计算这个字节的值
wiegand[0] = wiegand[0]|(*(str+1)&0x0f);
//--------------------------------计算前8位1的个数,为偶效验用
check_temp = wiegand[0];
for(i = 0;i<8;i++)
{
if(check_temp&0x01) //(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
wiegand[1] = wiegand[1]|(*(str+2)<<4);
//--------------------------------计算接下来的4位1的个数,为偶效验用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x80)
{
one_num++;
}
check_temp<<=1;
}
//--------------------------------判断1的个数
one_num%2 == 0 ? (even = 0):( even = 1);
one_num = 0;
wiegand[1] = wiegand[1]|(*(str+3)&0x0f);
//--------------------------------计算接下来的4位1的个数,为奇效验用
check_temp = wiegand[1];
for(i = 0;i<4;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp>>=1;
}
wiegand[2] = wiegand[2]|(*(str+4)<<4);
wiegand[2] = wiegand[2]|(*(str+5)&0x0f);
//--------------------------------计算接下来的8位1的个数,为奇效验用
check_temp = wiegand[2];
for(i = 0;i<8;i++)
{
if(check_temp&0x01)
{
one_num++;
}
check_temp >>= 1;
}
//--------------------------------判断1的个数
one_num%2 == 0 ? (odd = 1):( odd = 0);
one_num = 0;
//================================启动发送,用定期器做时间延时
//--------------------------------韦根 输出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
//--------------------------------发送偶效验
if(even)
{
WG_DATA1 = 0;
//-------------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//------------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
//----------------------------延时一个发送周期
TR0 = 0;
TH0 = (65536 - 1382)/256; //定期1500us
TL0 = (65536 - 1382)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
//-------------------------------发送24位数据
for(i = 0;i<24;i++)
{
//---------------------------韦根 输出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if((wiegand[0])&0x80)
{
WG_DATA1 = 0;
//----------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//---------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
(*(long*)&wiegand[0]) <<= 1;
//-------------------------------延时一个发送周期
TR0 = 0;
TH0 = (65536 - 1382)/256; //定期1500us
TL0 = (65536 - 1382)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
}
//==============================发送奇效验位
//------------------------------韦根 输出端初始化
WG_DATA0 = 1;
WG_DATA1 = 1;
if(odd)
{
WG_DATA1 = 0;
//-------------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA1 = 1;
}
else
{
WG_DATA0 = 0;
//-------------------------延时100us
TR0 = 0;
TH0 = (65536 - 78)/256; //定期100us
TL0 = (65536 - 78)%256;
TF0 = 0;
ET0 = 0;
TR0 = 1;
while (!TF0) { ;}
TF0 = 0;
WG_DATA0 = 1;
}
}
Wiegand(韦根)接口
Wiegand接口通常由3根线组成,它们是:数据0(Data0),数据1(Data1)和 Data return。这3条线负责传输Wiegand信号。D0,D1在没有数据输出时都保持+5V高电平。若输出为0,则D0拉低一段时间,若输出为1,则D1拉低一段时间。
两个电子卡韦根输出之间的最小间隔为0.25秒。
编辑本段标准26位Wiegand通讯协议
标准韦根输出是由26位二进制数组成,每一位的含义如下:
1 2 9 10 25 26
X X X X X X X X X X X X X X X X X X X X X X X X X X 二进制
第1位为2—13位的偶校验位
第2—9位相应与电子卡HID码的低8位
第10-25位相应电子卡的PID号码
第26位为14-25位的奇校验位
这26位数据在读出器的韦根输出线D0,D1上输出。
HID和PID
HID号码即Hidden ID code 隐含码,PID号码即Public ID code 公开码。 PID很容易在读出器的输出结果中找到,但HID在读出器的输出结果中部分或者所有隐掉。HID是一个非常重要的号码,它不仅存在于卡中,也存在于读卡器中。假如卡中的HID与读卡器中的HID不同的话,那么这张卡就无法在这个读卡器上正常工作。
Wiegand接口硬件设计
可以将Wiegand接口的Data0和Data1两个输出接到MCU的两个IO脚上,采用查询的方式接受数据,但这样接受并不可靠。比较好的方法是将Data0和Data1接到MCU的两个中断引脚上,采用中断的方式接受数据。
什么是韦根26
韦根26是一种通讯协议,象485、232、TCP/IP等通讯协议同样.
韦根传感器是由一根双稳态磁敏感功能合金丝和缠绕其外的感应线圈组成的。它的工作原理是:在交变磁场中,当平行于敏感丝的某极性(例如n极)磁场达成触发磁感应强度时,敏感丝中的磁畴受到激励会发生运动,磁化方向瞬间转向同一方向,同时在敏感丝周边空间磁场也发生瞬间变化,由此在感应线圈中感生出一个电脉冲。此后若该磁场减弱,敏感丝磁化方向将保持稳定不变,感应线圈也无电脉冲输出;但当相反极性(s极)磁场增强触发磁感应强度时,敏感丝磁化方向又瞬间发生翻转,并在感应线圈中感生出一个方向相反的电脉冲。如此反复,韦根传感器便将交变磁场的磁信号转换成交变电信号。
展开阅读全文