Tato stránka vznikla z důvodu absence rozumné české dokumentace protokolu Wiegand. Je pravda, že existuje několik anglických AppNote a podobně na toto téma, ale když jsem do jednoho projektu potřeboval začlenit čtení tohoto protokolu, obtížně jsem informace sháněl.
Tento protokol je používán většinou pro komunikaci mezi čtečkami RFID karet a vlastními terminály. Pro svoji jednoduchost a možnost použití dlouhých vedení je (byl) využíván převážně v průmyslu.

Parametry hardware
Přenos protokolu je řešen po dvou datových vodičích a GND. Datové vodiče se většinou nazývají Data 0 a Data 1 nebo také Data L a Data H. Datové vodiče jsou v klidu drženy na úrovni log. H. V případě komunikace je odpovídající vodič stažen do úrovně log. L. Napěťové úrovně jsou 5V.

Komunikace
     Vlastní komunikace je sekvenční, bity se přenáší postupně. Protokol jako takový má jednoduchou časovou synchronizaci, a přenos probíhá tak, že pokud se má přenést bit s hodnotou 1, je na definovanou dobu signál Data 1 (H) stažen do log. L (je tedy na tento vodič vyslán impuls). Analogicky potom pokud je třeba odeslat bit s hodnotou log. L, je vyslán impuls na vodič DATA 0 (L). Datový puls trvá typicky (tedy pokud je dodržen protokol) 50 mikrosekund, pauza mezi pulsy bývá typicky 2 milisekundy.


Protokol je u klasických čteček 26 bitový (odtud Wiegand 26), kde se skládá z 8 bitů tzv. Facility code, 16 bitů dat z karty a dvou bitů paritních.
Pořadí bitů znázorňuje následující tabulka:

1234567891011121314151617181920212223242526
MSBFCFCFCFCFCFCFCFCDDDDDDDDDDDDDDDDLSB


Parita
      Bit MSB je paritní bit pro prvních 12 bitů, zbývajících 12 bitů má paritní bit poslední (LSB). Pro první paritní bit (MSB) platí, že je nulový, jestliže je počet jedniček v první části telegramu sudý. Pokud je počet jedniček lichý, je bit MSB nastaven.
Naopak bit LSB je nastavován / nulován opačně - tedy, je nulový, jestliže je počet jedniček ve zbytku telegramu lichý. Nastaven je, je-li počet jedniček ve zbytku telegramu sudý.

1234567891011121314151617181920212223242526
MSB111111111111222222222222LSB
1 - první část telegramu
2 - druhá část telegramu


MSB = 0 jestliže je počet jedniček v první části (12 bitech) sudý
MSB = 1 jestliže je počet jedniček v první části (12 bitech) lichý

LSB = 1 jestliže je počet jedniček v druhé části (12 bitech) sudý
LSB = 0 jestliže je počet jedniček v druhé části (12 bitech) lichý



Uspořádání dat
Vlastní data jsou v telegramu uspořádána následovně:
2345678910111213141516171819202122232425
FCFCFCFCFCFCFCFCDDDDDDDDDDDDDDDD

Prvních 8 bitů je tzv. Facility code (FC), zbývajících 16 bitů jsou tzv. "card identification code" - identifikační číslo karty.


     Na následujícím obrázku je zkušební schéma zapojení, procesor je PIC 18F2321, sice kanon na vrabce, ale je to v podstatatě proto, protože zde je jen fragment komerční konstrukce, který je možno zveřejnit. V krátkosti popíši hardware - uvedený PIC je taktován interním oscilátorem na frekvenci 4MHz, komunikuje s PC pomocí klasického převodníku RS232 / USB typu FTDI232RL na rychlosti 19200 Bd . V zapojení je implementován ICSP konektor, a také zdrojová část. Jde víceméně o triviální zapojení procesoru, proto u některých součástek nejsou uvedeny hodnoty. Procesor má zapnuty pull-up rezistory na portu B.
Náhled na schéma - ke zvětšení obrázku klikněte na náhled

     Vzhledem k nutnému počtu vstupů tří čteček je činnost řešena přerušením, využit je PORTB0 a PORTB1, kde je nastavena reakce vyvolání přerušení na sestupnou hranu vnějšího signálu, a dále se využívá vyvolání přerušení při změně na portu B (PORTB4 až 7) pro obsloužení zbylých dvou čteček.
Program tedy neustále čeká na přerušení, pokud přijde na PORTB0 nebo PORTB1, je hardwarově zajištěno, že jde o sestupnou hranu, provede se tedy obsloužení dle vstupního pinu (DATA0 nebo DATA1). Při přijetí přerušení na horním nibble portu B (PORTB4 - 7) se testuje podle vzorku horních 4 bitů portu B o jakou kombinaci jde. Tímto způsobem se odfiltruje vzestupná hrana, a zároveň se provede odskok na správnou obsluhu přerušení.
Program nezpracovává data ze všech čteček najednou. Data jsou uložena do čtyřbytových bloků proměnných začínajících na návěštích adres CARD1, CARD2 a CARD3. Jestliže v průběhu čtení dat z jedné čtečky přijde žádost z jiné (přerušení na jiném vstupu), je informace o již probíhajícím čtení zjištěna z obsahu proměnné numb_reader. Pokud není nulový, znamená to, že čtení již probíhá a žádost o čtení dat z druhé čtečky je ignorována. Po dokončeném čtení je obsah proměnné numb_reader vynulován a procesor očekává další data.
Vlastní rutina obsloužení není nic jiného než jednoduchý posuv přijatých bitů s tím, že pulsy na vodiči DATA0 jsou zaznamenávány jako 0 a pulsy na vodiči DATA1 jsou zaznamenávány jako 1. Po každém provedení rutiny je provedeno odpočítání přijatách bitů. Čekání na pulsy končí po zpracování 26. impulsu. Vzhledem k tomu, že díky rušení, chybám a podobně nemusí přijít všechny impulsy, s příchodem prvního impulsu je spuštěn TIMER0 který je po úspěšném přijetí všech impulsů zastaven. Pokud k jeho zastavení nedojde, znamená to chybu a díky obsluze přerušení po přetečení TIMERu 0 je příjem ukončen a procesor se vrací do původního stavu čekání na impuls.
     Vždy po úspěšném příjmu jsou data v hexadecimální podobě odeslána do PC. Kontrola parity se zde neprovádí.

Ke stažení jsou tyto soubory:

Velikost 65 kByte Schema zapojení příkladu a zdrojový kód (*.asm)
 

Vytisknout stránku
Zpátky Zpátky
© DH servis 2002 -