Základní informace
Sběrnice má jeden řídící obvod (master) a jeden či více ovládaných zařízení (slave). Všechny obvody jsou zapojeny jednak na společnou zem, jednak paralelně na společný datový vodič. Tento datový vodič je připojen přes odpor cca 5k na napájecí napětí a "zdvihá" tak sběrnici do log. 1.
Komunikaci zahajuje vždy master reset pulsem. Nejprve "stáhne" datový vodič do log. 0 (uzemní ho) a drží ho na této úrovni minimálně 480 mikrosekund. Pak sběrnici uvolní a naslouchá. Odpor zatím vrátí sběrnici zpět do log. 1. Pokud je na sběrnici připojené nějaké 1-Wire zařízení, tak detekuje tuto vzestupnou hranu a po prodlevě (15 - 60 µs) stáhne sběrnici na 60 - 240 µs k log. 0.
Pokud se zařízení správně ohlásí, může master začít vysílat a přijímat data. Data jsou vysílána v tzv. "time slotech", česky bychom řekli nejspíš v "časových úsecích" nebo v "okénkách". Slot je dlouhý 60 až 120 µs a během jednoho slotu je vyslán nebo přijat jeden bit informace. Mezi jednotlivými sloty musí být minimálně 1 µs mezera, kdy je sběrnice v klidu.
Existují 4 druhy slotů: Zápis 1, Zápis 0, Čtení 1 a Čtení 0. Zápisové sloty slouží k tomu, aby master vyslal data do zařízení. Zápis 1 probíhá tak, že master stáhne sběrnici k nule minimálně na 1 µs a nejpozději do 15 µs od začátku ji opět uvolní a ponechá uvolněnou. Zdvihací odpor ji tedy vytáhne k log. 1. Zápis 0 je o něco jednodušší: Master stáhne sběrnici k 0 a ponechá ji tak po celý slot, tedy min. 60 µs. Zařízení vzorkuje stav na datovém vodiči zhruba 30 µs po začátku timeslotu.
Čtecí sloty opět inicializuje master tím, že stáhne sběrnici k nule na minimálně 1 µs a opět ji uvolní. Po tomto zahájení může zařízení vyslat 1 bit buď tím, že ponechá sběrnici v klidu (log. 1) nebo že ji stáhne (log. 0). Podrobnosti snad osvětlí následující obrázek (kliknutím jej otevřete v plné velikosti).
Praktická realizace
Pokud řídí komunikaci mikrokontrolér, je algoritmus následující:
- Reset
-
- Stáhnout sběrnici na 0, počkat 480 µs
- Uvolnit sběrnici, počkat 70 µs
- Přečíst sběrnici. je-li ve stavu log. 0, je na ní připojeno nějaké zařízení. Pokud je v log. 1, žádné zařízení připojeno není.
- Počkat 410 µs
- Zápis log. 1
-
- Stáhnout sběrnici na 0, počkat 6 µs
- Uvolnit sběrnici, počkat 64 µs
- Zápis log. 0
-
- Stáhnout sběrnici na 0, počkat 60 µs
- Uvolnit sběrnici, počkat 10 µs
- Čtení
-
- Stáhnout sběrnici na 0, počkat 6 µs
- Uvolnit sběrnici, počkat 9 µs
- Přečíst sběrnici. Její stav udává přečtený bit.
- Počkat 55 µs
Tyto časy jsou doporučené, pokud chcete znát mezní hodnoty anebo časování pro overdrive komunikaci, doporučuji AppNote 126 - 1-Wire Communication Through Software, kde naleznete i příklady kódu v C.
Komunikace probíhá po bajtech a vždy se vysílá bit 0 (nejmenší) jako první a bit 7 jako poslední.
Více zařízení na jedné sběrnici
Každé 1-Wire™ zařízení, u kterého to dává smysl (iButton, teploměry, převodníky apod.), má v sobě paměť ROM, která obsahuje 64bitové unikátní číslo, pomocí kterého je možné jednotlivá zařízení na sběrnici od sebe navzájem odlišit. Toto číslo se skládá z typu zařízení (spodních 8 bitů, kódy jsou uvedeny v Application Note 155), sériového čísla (48 bitů) a z CRC kódu (nejvyšších 8 bitů). Pomocí tohoto čísla je každé zařízení jednoznačně identifikovatelné. Komunikace je pak poněkud složitější, protože po RESET pulsu je třeba vyslat příkaz Match ROM, pak 64bitový kód zařízení, se kterým se má pracovat, a teprve poté se posílá příkaz.
Pokud je na jedné sběrnici připojeno více zařízení, je třeba nejprve zjistit ID jednotlivých zařízení. Algoritmus je docela elegantní, ovšem není triviální. Zájemce odkazuji na Application Note 187: 1-Wire Search Algorithm
Ukázka použití sběrnice 1-Wire - připojení teploměru DS18B20
Jako ukázku praktické aplikace sběrnice 1-Wire jsem si připravil jednoduché zapojení s obvodem DS18B20, což je přesný digitální teploměr firmy Dallas. Připojil jsem ho k mikrokontroléru rodiny 8051 a připojil jsem pouze jeden, takže jsem nemusel procházet sběrnici a hledat ROM kódy.
Zapojení je velmi jednoduché a vidíte ho na následujícím obrázku:
Jednoduché zapojení DS18B20
Software je také velmi jednoduchý. Rutiny pro 1-Wire jsem vzal z článku Popis sériové komunikační linky digitálního teploměru DS 1821 (HW server), k nim jsem přidal standardní rutiny pro sériový port a celé to stmelil jednoduchou smyčkou, která změří teplotu, přečte údaj a pošle ho (jako hexadecimální číslice) na sériový port. Výpis podstatných částí následuje.
ORG 0H ;RESET LJMP MAIN ;...std. rutiny pro přerušení apod. MAIN: ;měříme teplotu acall InT ;RESET puls ;skip ROM - protože je na sběrnici jen ;jedno zařízení, nemusím ho adresovat mov a,#0cch acall PisT ;vyšlu kód mov a,#044h ;měření teploty acall PisT ;vyšlu kód ; čekej 200ms než se změří teplota mov R4,#10 lw: mov R2,#200 call T01ms ;počká 200 x 0.1 ms djnz R4,lw ;čtení hodnoty acall InT ;RESET puls ;skip ROM - protože je na sběrnici jen ;jedno zařízení, nemusím ho adresovat mov a,#0cch acall PisT ;vyšlu kód mov a,#0beh ;čtení hodnot acall PisT ;vyšlu kód acall CtiT ;čte nižší byte mov R7,A ;uschová acall CtiT ;čte vyšší byte acall tx_hex ;pošle hexadecimální obsah registru A ;na sériovou sběrnici mov A,R7 ;nižší byte acall tx_hex ;a pošle ho LOOP: LJMP LOOP ;a cyklime dokola ;čeká 0.1ms (100 µs) ;ttt=1/24 us ;Konstanty jsou platné pro ;UltraSpeed controler Dallas 89C4x0 ;a krystal 24MHz T01ms: mov R1,#10 T10us: mov R0,#60 djnz R0,$ ;4*ttt - 1/6 us ;* R0 - 60*4*ttt = 10us djnz R1,T10us djnz R2,T01ms ret ;HW vrstva ;následující rutiny jsou převzaty ;z výše zmíněného článku DS1820 BIT P3.7 ; podprogram pro inicializaci DS18B20 ; sériová linka připojená na pin P3.7 InT: push PSW clr DS1820 ; začátek inicializace mov R2,#5 ; čekací smyčka 500µs acall T01ms setb DS1820 ; uvolnění linky mov R2,#1 ; čekací smyčka 100µs acall T01ms InT1w: ; čekání uvolnění linky od DS mov c,DS1820 jnc InT1w pop PSW ret ; podprogram pro zápis 1 byte do DS18B20 ; sériová linka připojená na pin DS1820 ; ničí R2,R3 PisT: mov R3,#8 PisT3: rrc a jnc PisT1 ; zápis „1“ mov R2,#1 ; čekací smyčka 100µs clr DS1820 nop nop nop setb DS1820 acall T01ms ajmp PisT2 PisT1: ; zápis „0“ mov R2,#1 ; čekací smyčka 100µs clr DS1820 acall T01ms setb DS1820 PisT2: djnz R3,PisT3 ret CtiT: mov R5,#8 CtiT1: clr DS1820 nop nop nop setb DS1820 mov R3,#4 ; čekací smyčka 15µs CtiT2: djnz R3,CtiT2 mov c,DS1820 rrc a mov R2,#1 acall T01ms djnz R5,CtiT1 ret
Závěr
Sběrnice 1-Wire™ zůstává ve stínu jiných populárnějších sériových rozhraní, jako je I2C, Microwire nebo SPI. Rád bych se k ní ještě vrátil a ukázal, že je tomu tak poněkud neprávem a že je řada zajímavých zařízení, které jsou pro tuto sběrnici navrženy, a které rozhodně stojí za pozornost.
hw@ maly.cz
DOWNLOAD & Odkazy
- Stránka výrobce - Dallas / Maxim
- Zařízení pro sběrnici 1-Wire™ - 1-Wire and iButton
- Domovská stránka technologie iButton - iButton.com
- SDK pro sběrnici 1-Wire - iButton 1-Wire software kit (Dallas).
- Application Note 155 - 1-Wire Software Resource Guide Device Description (Dallas).
- Příklad ovládání teploměru DS 1821 - HW server