Choď na obsah Choď na menu
 

1-Wire komunikacia

http://vyvoj.hw.cz/navrh-obvodu/rozhrani/sbernice-1-wiretm.html

 

Sběrnice 1-Wire™

Sběrnice 1-Wire?, navržená firmou Dallas Semiconductor(link is external), umožňuje připojit několik zařízení k řídící jednotce prostřednictvím pouhých dvou vodičů. Tato sběrnice je použita také u technologie iButton, která se používá v elektronických zabezpečovacích systémech (vrátníky, docházkové systémy).

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).


Průběhy na sběrnici 1-Wire™
 

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čujiAppNote 126 - 1-Wire Communication Through Software(link is external), 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(link is external)), 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(link is external)

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 obvodemDS18B20(link is external), což je přesný digitální teploměr firmy Dallas(link is external). 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(link is external) (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.

Martin Malý
hw@ maly.cz

DOWNLOAD & Odkazy

Hodnocení článku: