Wiegand协议(转)

源:http://blog.chinaunix.net/uid-22670933-id-3268318.html

  Wiegand26协议是由美国工业安全委员会SIA(Security Industry Association)的隶属组织访问控制标准子委员会制定的一个关于存取控制的标准协议。它是一个关于非接触式IC卡读写器接口和输出的协议。

协议中定义了经常应用于控制访问、安全和其他相关工业领域中读卡器和控制器之间的接口。这个标准的规范使得读卡器的设计者和控制器的生厂商们的工作得以标准化。

 

图一 时序图

数字信号

图一显示的是读卡器将数字信号以bit的方式发给门禁控制器的一个时序图。这个时序图的Wiegand指导方针是遵照SIA 门禁控制标准协议,这个协议是针对26bit的Wiegand读卡器,一个脉冲时间(Tpw)在20us至100us之间,脉冲的跳变时间(Tpi )在200us至20ms之间。Data1和Data0信号是高电平(大于Voh),直到读卡器准备发一个数据流过来。读卡器发出的是异步的低电平的脉冲(小于Vol),通过Data1 或者Data0 线把数据流传送给门禁控制盒(如图一的锯齿波)。Data1和Data0脉冲不会交叠,也不会同步发生。

 

26-Bit Wiegand 格式

在de facto工业标准中,Wiegand 26bit组成格式:8 bits的机器号、16 bits的ID号。8 bits的二进制代码可以表示256(0—255)个机器号,16bits的二进制代码可以在每一个机器号中表示65,536 (0 to 65,535)个不同的ID号。

26-Bit Wiegand格式长度为26位,其中包含两位校验位(EP与OP):

                          1          2        9   10           25    26

EP

FC

CC

OP

 

 

表一 字段定义

字段

含义

EP

偶校验位(Even Parity bit),EP是由字段2到13bit位来判断的。如果是偶数个“1”,EP为0;相反则为0。

FC(bit2-bit 9)

机器代码(Facility Code,0-255) Bit 2 为MSB(高位有效位)

CC (bit10-bit 25)

卡号(Card Code,0-65 535),其中bit10为MSB

OP

奇校验位(Odd Parity bit),OP值由14到25bit决定的。如果是偶数个“1”,OP值为1,相反则为0。

 

 

Wiegand 扩展格式

 可以为需要更多代码的用户提供更多的选择。首先转换成Keri标准39bit的格式。这Wiegand 39bit格式包含17 位的机器代码字段和20位的ID字段。这17bit的机器代码字段可以从数学上满足共131,072条(0到131,071)不同的机器代码,而20bit的ID字段又可以每一个机器号提供1,048,576(0到1,048,575)个不同的ID号。在 此格式中有那么多的机器代码,因此一条新机器代码可能被为每项工程选择。此外,每一个机器代码又有大量的ID号,所以此格式成了大工程的理想选择。为了安全起见,Keri系统校验编码保证没有重复号码。 表四提供了Pyramid Wiegand的主要格式。

 

表二 扩展 Wiegand 格式

含义

Bit 1

2-9位的偶校验位

Bits 2 to 18

机器代码(0 至 131,071); Bit 2 为MSB(高位有效位)

Bits 19 to 38

ID 号 (0 至1,048,575); Bit 19 为MSB

Bit 39

bit20至bit38的奇校验位

 
下面是在msp430F2274单片机下实现的程序,需要注意的一点:data0与data1应当初始化为高电平一段时间。
  
  • #include <msp430x22x4.h>
  • #define DATA0SEL  P3SEL   
  • #define DATA0DIR  P3DIR   
  • #define DATA0OUT  P3OUT   
  • #define DATA0PIN  BIT2   
  • #define DATA0L    P3OUT &= ~DATA0PIN   
  • #define DATA0H    P3OUT |= DATA0PIN   
  •   
  • #define DATA1SEL  P3SEL   
  • #define DATA1DIR  P3DIR   
  • #define DATA1OUT  P3OUT   
  • #define DATA1PIN  BIT1   
  • #define DATA1L    P3OUT &= ~DATA1PIN   
  • #define DATA1H    P3OUT |= DATA1PIN   
  •   
  • //msp430F2274在12M晶振下延时1us程序   
  • void Fsys12M_Delay(unsigned short _1us)  
  • {  
  •       while(_1us--)  
  •       {  
  •           __no_operation();    
  •           __no_operation();    
  •           __no_operation();    
  •           __no_operation();    
  •           __no_operation();    
  •           __no_operation();    
  •       }  
  • }  
  •   
  • void send_Data1()  
  • {          
  •       DATA1L;  
  •       Fsys12M_Delay(100);   
  •       DATA1H;          
  • }  
  •   
  • void send_Data0()  
  • {          
  •       DATA0L;  
  •       Fsys12M_Delay(100);   
  •       DATA0H;          
  • }  
  •   
  • /******************************************************** 
  • * 函数:wiegand(unsigned char *cardNo, unsigned char len) 
  • * 输入:cardNo:卡号指针,len:卡号长度,此处只能是3个 
  • * 输出:无 
  • * 功能:把卡号通过wiegand送出 
  • * 时间:针对430的12M晶振,大约耗时30ms 
  • ********************************************************/  
  • void wiegand(unsigned char *cardNo, unsigned char len)  
  • {  
  •       unsigned char even;  
  •       unsigned char odd;  
  •       unsigned char one_num;  
  •       unsigned char i, j, temp;  
  •   
  •       one_num = 0;  
  •       temp = cardNo[0];  
  •       for( i=0; i<8; i++ )  
  •       {  
  •           if( temp&0x80 )  
  •             one_num++;  
  •           temp <<= 1;  
  •       }  
  •       temp = cardNo[1];  
  •       for( i=0; i<4; i++ )  
  •       {  
  •           if( temp&0x80 )  
  •             one_num++;  
  •           temp <<= 1;  
  •       }  
  •       if( one_num%2==0 )  
  •       {  
  •           even = 0;  //偶校验位,若2-13位有偶数个1,则此位为0      
  •       }  
  •       else  
  •       {  
  •           even = 1;  
  •       }  
  •         
  •       one_num = 0;  
  •       for( i=0; i<4; i++ )  
  •       {  
  •           if( temp&0x80 )  
  •             one_num++;  
  •           temp <<= 1;  
  •       }  
  •       temp = cardNo[2];  
  •       for( i=0; i<8; i++ )  
  •       {  
  •           if( temp&0x80 )  
  •             one_num++;  
  •           temp <<= 1;  
  •       }  
  •       if( one_num%2==0 )  
  •       {  
  •           odd = 1;  //奇校验位, 若14-25为有偶数个1,则此位为1   
  •       }  
  •       else  
  •       {  
  •           odd = 0;  
  •       }  
  •     
  •       if( even )  //发送偶校验位   
  •       {           
  •           send_Data1();  
  •       }  
  •       else  
  •       {            
  •           send_Data0();  
  •       }  
  •       Fsys12M_Delay(1000);        
  •       
  •       for( i=0; i<len; i++ )  
  •       {  
  •           temp = cardNo[i];  
  •           for( j=0; j<8; j++ )  
  •           {  
  •               if( temp&0x80 )  
  •               {                   
  •                   send_Data1();  
  •               }  
  •               else  
  •               {                   
  •                   send_Data0();  
  •               }                
  •               Fsys12M_Delay(1000);  
  •               temp <<= 1;  
  •           }  
  •       }  
  •    
  •       if( odd )   //发送奇校验位   
  •       {          
  •           send_Data1();  
  •       }  
  •       else  
  •       {           
  •           send_Data0();  
  •       }  
  •       Fsys12M_Delay(1000);            
  • }  

 

 
posted @ 2015-03-27 11:38  酒醉的Tiger  阅读(840)  评论(0编辑  收藏  举报