Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31041440
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: C/C++

2012-07-09 16:58:27

Wiegand

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

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

                           图一 时序图

数字信号

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

26-Bit Wiegand 格式

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


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

  1    2        9   10                     25    26

EP

FC

CC

OP

 

 

表一 字段定义

字段

含义

EP

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

FC(bit2-bit 9)

机器代码(Facility Code0-255)
Bit 2
MSB(高位有效位)

CC (bit10-bit 25)

卡号(Card Code0-65 535),其中bit10MSB

OP

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

 

 

Wiegand 扩展格式

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

表二 扩展 Wiegand 格式

含义

Bit 1

29位的偶校验位

Bits 2 to 18

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

Bits 19 to 38

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

Bit 39

bit20bit38的奇校验位

下面是在msp430F2274单片机下实现的程序,需要注意的一点:data0与data1应当初始化为高电平一段时间。

[cpp]
  1. #include    
  2.   
  3. #define DATA0SEL  P3SEL   
  4. #define DATA0DIR  P3DIR   
  5. #define DATA0OUT  P3OUT   
  6. #define DATA0PIN  BIT2   
  7. #define DATA0L    P3OUT &= ~DATA0PIN   
  8. #define DATA0H    P3OUT |= DATA0PIN   
  9.   
  10. #define DATA1SEL  P3SEL   
  11. #define DATA1DIR  P3DIR   
  12. #define DATA1OUT  P3OUT   
  13. #define DATA1PIN  BIT1   
  14. #define DATA1L    P3OUT &= ~DATA1PIN   
  15. #define DATA1H    P3OUT |= DATA1PIN   
  16.   
  17. //msp430F2274在12M晶振下延时1us程序   
  18. void Fsys12M_Delay(unsigned short _1us)  
  19. {  
  20.       while(_1us--)  
  21.       {  
  22.           __no_operation();    
  23.           __no_operation();    
  24.           __no_operation();    
  25.           __no_operation();    
  26.           __no_operation();    
  27.           __no_operation();    
  28.       }  
  29. }  
  30.   
  31. void send_Data1()  
  32. {          
  33.       DATA1L;  
  34.       Fsys12M_Delay(100);   
  35.       DATA1H;          
  36. }  
  37.   
  38. void send_Data0()  
  39. {          
  40.       DATA0L;  
  41.       Fsys12M_Delay(100);   
  42.       DATA0H;          
  43. }  
  44.   
  45. /******************************************************** 
  46. * 函数:wiegand(unsigned char *cardNo, unsigned char len) 
  47. * 输入:cardNo:卡号指针,len:卡号长度,此处只能是3个 
  48. * 输出:无 
  49. * 功能:把卡号通过wiegand送出 
  50. * 时间:针对430的12M晶振,大约耗时30ms 
  51. ********************************************************/  
  52. void wiegand(unsigned char *cardNo, unsigned char len)  
  53. {  
  54.       unsigned char even;  
  55.       unsigned char odd;  
  56.       unsigned char one_num;  
  57.       unsigned char i, j, temp;  
  58.   
  59.       one_num = 0;  
  60.       temp = cardNo[0];  
  61.       for( i=0; i<8; i++ )  
  62.       {  
  63.           if( temp&0x80 )  
  64.             one_num++;  
  65.           temp <<= 1;  
  66.       }  
  67.       temp = cardNo[1];  
  68.       for( i=0; i<4; i++ )  
  69.       {  
  70.           if( temp&0x80 )  
  71.             one_num++;  
  72.           temp <<= 1;  
  73.       }  
  74.       if( one_num%2==0 )  
  75.       {  
  76.           even = 0;  //偶校验位,若2-13位有偶数个1,则此位为0      
  77.       }  
  78.       else  
  79.       {  
  80.           even = 1;  
  81.       }  
  82.         
  83.       one_num = 0;  
  84.       for( i=0; i<4; i++ )  
  85.       {  
  86.           if( temp&0x80 )  
  87.             one_num++;  
  88.           temp <<= 1;  
  89.       }  
  90.       temp = cardNo[2];  
  91.       for( i=0; i<8; i++ )  
  92.       {  
  93.           if( temp&0x80 )  
  94.             one_num++;  
  95.           temp <<= 1;  
  96.       }  
  97.       if( one_num%2==0 )  
  98.       {  
  99.           odd = 1;  //奇校验位, 若14-25为有偶数个1,则此位为1   
  100.       }  
  101.       else  
  102.       {  
  103.           odd = 0;  
  104.       }  
  105.     
  106.       if( even )  //发送偶校验位   
  107.       {           
  108.           send_Data1();  
  109.       }  
  110.       else  
  111.       {            
  112.           send_Data0();  
  113.       }  
  114.       Fsys12M_Delay(1000);        
  115.       
  116.       for( i=0; i
  117.       {  
  118.           temp = cardNo[i];  
  119.           for( j=0; j<8; j++ )  
  120.           {  
  121.               if( temp&0x80 )  
  122.               {                   
  123.                   send_Data1();  
  124.               }  
  125.               else  
  126.               {                   
  127.                   send_Data0();  
  128.               }                
  129.               Fsys12M_Delay(1000);  
  130.               temp <<= 1;  
  131.           }  
  132.       }  
  133.    
  134.       if( odd )   //发送奇校验位   
  135.       {          
  136.           send_Data1();  
  137.       }  
  138.       else  
  139.       {           
  140.           send_Data0();  
  141.       }  
  142.       Fsys12M_Delay(1000);            
  143. }  
阅读(5278) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~