3、韦根接口:Wiegand协议详解
韦根接口,在安防行业里摸爬滚打过的朋友肯定不陌生。它几乎是门禁读卡器和控制器之间的“标准语言”。我最早接触韦根是在一个老旧的小区改造项目里,那时候读卡器到控制器的线拉了将近50米,结果死活读不到卡。后来才发现,是信号衰减和干扰的问题。从那以后,我对韦根接口的每一个细节都格外上心。
说白了,韦根协议是一种非常简单的、单向的通信方式。它只有两根数据线:D0和D1。没有时钟线,没有地址线,甚至没有校验(除了数据本身带的校验位)。简单,就意味着可靠,但也意味着功能有限。你想想看,它只能从读卡器往控制器发数据,控制器没法跟读卡器说“你再发一遍”。
3.1 D0/D1时序详解
韦根的时序,其实特别直观。平时D0和D1都是高电平(通常是5V)。当读卡器要发送数据时,它通过拉低其中一根线来代表一个比特。
- 拉低D0:代表逻辑“0”
- 拉低D1:代表逻辑“1”
每次拉低持续的时间,一般在20μs到100μs之间。我习惯用50μs作为标准值,大多数读卡器都认这个。两次脉冲之间的间隔,也就是“帧间隔”,通常是2ms左右。如果超过这个时间还没收到下一个脉冲,控制器就应该认为这一帧数据结束了。
关键时序参数(我个人常用的参考值):
| 参数 | 最小值 | 典型值 | 最大值 |
|---|---|---|---|
| 脉冲宽度(Tw) | 20 μs | 50 μs | 100 μs |
| 脉冲间隔(Tp) | 200 μs | 1 ms | 2 ms |
| 帧间隔(Tf) | 2 ms | 5 ms | 20 ms |
为什么会这样设计?其实就是为了抗干扰。脉冲宽度足够短,一般的工频干扰(50Hz/60Hz)影响不大。而且两根线同时拉低的情况,在协议里是无效的,可以用来做错误检测。我在项目中遇到过,有些劣质读卡器在断电瞬间会乱拉D0/D1,导致控制器误判。所以,我建议在软件里加一个“去抖”逻辑:连续收到两个无效脉冲(比如D0和D1同时拉低),就丢弃当前帧。
3.2 数据格式:26位与34位
韦根协议最常用的就是26位和34位格式。26位是“老大哥”,几乎所有读卡器都支持。34位则是为了容纳更大的卡号范围。
26位格式,说白了就是:
- 第1位:偶校验位(覆盖前12位数据)
- 第2-13位:站点代码(Facility Code),共8位,范围0-255
- 第14-25位:卡号(Card Number),共16位,范围0-65535
- 第26位:奇校验位(覆盖后12位数据)
嗯,这里要注意。26位格式的卡号只有16位,也就是最多65536张卡。对于大型企业或者校园来说,这显然不够用。所以就有了34位格式。
34位格式,结构类似:
- 第1位:偶校验位(覆盖前16位数据)
- 第2-17位:站点代码,共16位,范围0-65535
- 第18-33位:卡号,共16位,范围0-65535
- 第34位:奇校验位(覆盖后16位数据)
你看,34位格式的站点代码扩展到了16位,卡号还是16位。但总数据位多了,所以卡号范围其实可以更大。有些厂家会自定义34位格式,把站点代码和卡号的位数重新分配。我建议你在对接读卡器时,先确认一下它的数据格式定义,别想当然。
我的经验: 很多读卡器虽然标称支持26位,但实际输出的卡号可能只有4位或8位。我曾经在一个项目里,读卡器输出的是26位格式,但卡号只有后4位有效,前12位全是0。如果你不做处理,直接拿26位数据去比对,肯定对不上。所以,一定要看读卡器的数据手册,或者用示波器抓一下波形,确认数据位到底是怎么分配的。
3.3 与读卡器的连接方式
韦根接口的物理连接,其实就三根线:D0、D1、GND。有些读卡器还会提供LED控制线和蜂鸣器控制线,但那不是韦根协议的一部分,是额外的IO口。
连接方式很简单:
- 读卡器的D0接控制器的D0(GPIO输入)
- 读卡器的D1接控制器的D1(GPIO输入)
- 读卡器的GND接控制器的GND
就这么简单。但这里有个坑:电平匹配。大多数读卡器输出的是5V电平,但现在的控制器很多是3.3V的MCU。直接接上去,可能会烧坏GPIO。我建议加一个电平转换电路,或者至少用电阻分压。我习惯用两个10kΩ电阻分压,把5V降到3.3V左右,简单可靠。
警告: 千万不要把读卡器的D0/D1直接接到3.3V的MCU引脚上!我曾经见过一个同事,为了省事,直接接了,结果MCU的GPIO烧了三个。虽然读卡器输出电流不大,但5V对3.3V的IO来说,还是超压了。加个分压电阻,或者用电平转换芯片(如TXS0102),成本很低,但能省很多麻烦。
另外,线长也是个问题。韦根协议理论上可以支持100米以上的传输距离,但实际中,超过50米就容易出问题。原因很简单:信号反射和干扰。我建议:
- 使用双绞线或屏蔽线,D0和D1各用一对双绞线
- 屏蔽层单端接地(在控制器端接地)
- 如果距离超过50米,考虑加一个韦根中继器
3.4 抗干扰设计
韦根接口的抗干扰,是门禁系统稳定性的关键。我在一个工厂项目里,读卡器旁边就是大功率电机,一启动,读卡就乱码。后来花了不少功夫才搞定。
抗干扰设计,我总结了几点:
- 硬件滤波: 在D0/D1线上各加一个100pF到1nF的电容到地,可以滤除高频噪声。但电容不能太大,否则会把脉冲边沿变缓,导致时序错误。我一般用470pF。
- 上拉电阻: D0和D1在控制器端需要加上拉电阻,通常4.7kΩ到10kΩ。这样能保证在空闲时,信号线处于确定的高电平状态。
- 软件去抖: 在中断服务程序里,不要一检测到下降沿就立即认为是一个有效脉冲。我习惯用定时器来测量脉冲宽度,只有宽度在20μs到100μs之间,才认为是有效脉冲。否则,丢弃。
- 帧超时检测: 如果超过20ms没有收到下一个脉冲,就认为帧结束。这样可以避免因为干扰导致的一直等待。
我曾经遇到的一个典型问题: 读卡器在刷卡时,偶尔会多出一个脉冲。比如应该发26位,结果发了27位。后来发现,是读卡器电源纹波太大,导致D0/D1在空闲时抖动。解决办法:在读卡器电源端加一个LC滤波电路,问题解决。
最后,我想说一句:韦根协议虽然简单,但越简单的东西,越容易在细节上出问题。你想想看,它没有重传机制,没有应答,发出去的数据就像泼出去的水。所以,控制器端的软件一定要健壮,要做好各种异常处理。嗯,这就是我对韦根接口的理解,希望对你有帮助。