一、概述:

Wiegand(韦根)协议是由摩托罗拉公司制定的一种通讯协议,它适用于涉及门禁控制系统的读卡器和卡片的许多特性;其协议并没有定义通讯的波特率、也没有定义数据长度。韦根格式主要定义是数据传输方式:Data0 和 Data1 两根数据线分别传输 0 和 1. 26bit,34bit36bit,44bit 等等。

二、Wiegand

Wiegand接口通常由3根线组成,它们是:数据0(Data0),数据1(Data1)和Data return。这3条线负责传输Wiegand信号。D0,D1在没有数据输出时都保持+5V高电平。若输出为0,则D0拉低一段时间,若输出为1,则D1拉低一段时间。

输出‘0DATA0

输出‘1DATA1

负脉冲宽度 TP=100 TW=1600

具体时序如下:

例如:数据‘01000

三、标准26 Wiegand 

标准韦根输出是由26位二进制数组成,每一位的含义如下:

1 2                   9 10                                         25 26
E X X X X X X X X X X X X X X X X X X X X X X X X O        二进制         

第1位为2—13位的偶校验位
第2—9位对应与电子卡HID码的低8位
第10-25位对应电子卡的PID号码
第26位为14-25位的奇校验位
这26位数据在读出器的韦根输出线D0,D1上输出。

以上数据从左至右顺序发送。高位在前。

四、韦根 26

    DATA0为 0 DATA0 1 0 bit CPU ID 唯一的办法是在外部中断里接收每个 bit。 (仅仅在中断里获得开始接收 wiegand 数据还不行,因为这是尽管给开始接收 wiegand 数据标志位置位了,但是主程序还在执行其他代码而没有到达查询开始接收 wiegand 数据标志位这条指令)。

五.韦根接口定义:

Wiegand 接口界面由三条导线组成:

DATA0:暂定,兰色,P2.5 

DATA1:暂定,白色,P2.6 

GND:(通常为黑色), 暂定信号地。 当安装商拿到读卡器时,他们希望在读卡器和门禁控制面板的连接点(终端)上都能够看到这三个名称。

目前所有的标准型读卡器都提供可选择的 Wiegand 接口。这三条线负责传送 Wiegand 数据,也被称为Wiegand 信号。

代码仅供参考,没有实测,实际应用时,做发送,注意延时。做接收,一般用中断采集数据。


1. 发送程序:
2.
3. //------------------------------------------------------
4. //功能:把数组封包成韦根 26 的格式,并发送出去
5. // 原理是把每个字节的低 4 位取出,来计算这个字节的值
6. //入口:str=要封包的数组,
7. //出口:DATA0P3.0;DATA1=P3.1
8. //设计:大鹏,大鹏艾迪,2006/4/11
9. //------------------------------------------------------
10. (uchar *str)
11. {
12. //| wiegand[0] | wiegand[1] | wiegand[2] |
13. //| *str *(str + 1) | *(str + 2) *(str + 3)| *(str + 4) *(str + 5)|
14. ;
15. ; //计算 1 的个数
16. ; //韦根包奇偶效验中间暂存
17. ; //韦根包前 12 位偶效验
18. ; //韦根包后 12 位齐效验
19. [3]; //韦根包数据 24 位
20. //--------------------------------端口方向定义
21. = 0x00; //普通 I/O 口
22. = 0x00;
23. //================================数组到韦根包的转化
24. [0] = wiegand[0]|((*str)<<4);//原理是把每个字节的低 4 位取出,来计算这个字节的值
25. [0] = wiegand[0]|(*(str+1)&0x0f);
26. //--------------------------------计算前 8 位 1 的个数,为偶效验用
27. = wiegand[0];
28. for(i = 0;i<8;i++)
29. {
30. if(check_temp&0x01) //(check_temp&0x01)
31. {
32. ++;
33. }
34. >>= 1;
35. }
36. [1] = wiegand[1]|(*(str+2)<<4);
37. //--------------------------------计算接下来的 4 位 1 的个数,为偶效验用
38. = wiegand[1];
39. for(i = 0;i<4;i++)
40. {
41. if(check_temp&0x80)
42. (C) 2006-2007 DAPID. All Rights Reserved
43. 3
44. {
45. ++;
46. }
47. <<=1;
48. }
49. //--------------------------------判断 1 的个数
50. %2 == 0 ? (even = 0):( even = 1);
51. = 0;
52.
53. [1] = wiegand[1]|(*(str+3)&0x0f);
54. //--------------------------------计算接下来的 4 位 1 的个数,为奇效验用
55. = wiegand[1];
56. for(i = 0;i<4;i++)
57. {
58. if(check_temp&0x01)
59. {
60. ++;
61. }
62. >>=1;
63. }
64. [2] = wiegand[2]|(*(str+4)<<4);
65. [2] = wiegand[2]|(*(str+5)&0x0f);
66. //--------------------------------计算接下来的 8 位 1 的个数,为奇效验用
67. = wiegand[2];
68. for(i = 0;i<8;i++)
69. {
70. if(check_temp&0x01)
71. {
72. ++;
73. }
74. >>= 1;
75. }
76. //--------------------------------判断 1 的个数
77. %2 == 0 ? (odd = 1):( odd = 0);
78. = 0;
79.
80. //================================启动发送,用定时器做时间延时
81. //--------------------------------韦根 输出端初始化
82. = 1;
83. = 1;
84. //--------------------------------发送偶效验
85. if(even)
86. {
87. = 0;
88.
89. //-------------------------延时 100us
90. = 0;
91. = (65536 - 78)/256; //定时 100us
92. = (65536 - 78)%256;
93. = 0;
94. = 0;
95. = 1;
96. while (!TF0) { ;}
97.
98. = 0;
99. = 1;
100. }
101. else
102. {
103. = 0;
104. //------------------------延时 100us
105. = 0;
106. = (65536 - 78)/256; //定时 100us
107. = (65536 - 78)%256;
108. = 0;
109. = 0;
110. = 1;
111. while (!TF0) { ;}
112.
113. = 0;
114. = 1;
115. }
116. //----------------------------延时一个发送周期
117. = 0;
118. = (65536 - 1382)/256; //定时 1500us
119. = (65536 - 1382)%256;
120. = 0;
121. = 0;
122. = 1;
123. while (!TF0) { ;}
124.
125. = 0;
126. //-------------------------------发送 24 位数据
127. for(i = 0;i<24;i++)
128. {
129. //---------------------------韦根 输出端初始化
130. = 1;
131. = 1;
132. if((wiegand[0])&0x80)
133. {
134. = 0;
135. //----------------------延时 100us
136.
137. = 0;
138. = (65536 - 78)/256; //定时 100us
139. = (65536 - 78)%256;
140. = 0;
141. = 0;
142. = 1;
143.
144. while (!TF0) { ;}
145. = 0;
146. = 1;
147. }
148. else
149. {
150. = 0;
151. //---------------------延时 100us
152. = 0;
153. = (65536 - 78)/256; //定时 100us
154. = (65536 - 78)%256;
155. = 0;
156. = 0;
157. = 1;
158. while (!TF0) { ;}
159. = 0;
160. = 1;
161. }
162. (*(long*)&wiegand[0]) <<= 1;
163. //-------------------------------延时一个发送周期
164. = 0;
165. = (65536 - 1382)/256; //定时 1500us
166. = (65536 - 1382)%256;
167. = 0;
168. = 0;
169. = 1;
170. while (!TF0) { ;}
171. = 0;
172. }
173. //==============================发送奇效验位
174. //------------------------------韦根 输出端初始化
175. = 1;
176. = 1;
177.
178. if(odd)
179. {
180. = 0;
181.
182. //-------------------------延时 100us
183. = 0;
184. = (65536 - 78)/256; //定时 100us
185. = (65536 - 78)%256;
186. = 0;
187. = 0;
188. = 1;
189. while (!TF0) { ;}
190. = 0;
191. = 1;
192. }
193. else
194. {
195. = 0;
196. //-------------------------延时 100us
197. = 0;
198. = (65536 - 78)/256; //定时 100us
199. = (65536 - 78)%256;
200. = 0;
201. = 0;
202. = 1;
203. while (!TF0) { ;}
204. = 0;
205. = 1;
206. }
207. }