Vous êtes sur la page 1sur 4

Konwerter 1Wire > SPI opisany

P R OwJVerilogu
E K T Y

Konwerter 1Wire >


SPI opisany w Verilogu,
cz 2

AVT443

Konwerter prezentowany
w artykule jest przeznaczony
szczeglnie do wsppracy
z ukadami termometrw
cyfrowych rmy Dallas/
Maxim wyposaonymi
w jednoprzewodow
magistral 1wire. Konwerter
posiada podwjny interfejs
kompatybilny z SPI, dziki
czemu dwa rne urzdzenia
(np. mikrokontrolery) mog
w dowolnym momencie odczytywa
warto temperatury zmierzonej
przez termometr w sposb
cakowicie od siebie niezaleny.
Konwerter zrealizowany
jest w sposb sprztowy
z wykorzystaniem ukadw
programowalnych i opisany
w jzyku Verilog.
Rekomendacje:
projekt o duych walorach
uytkowych i jeszcze wikszych
edukacyjnych. Przykad
niezwykych moliwoci
wspczesnych ukadw
programowalnych i jzykw opisu
sprztu (HDL).

PODSTAWOWE PARAMETRY
Pytka o wymiarach 61 x 38 mm
Zasilanie 5...8 V DC
Jednokierunkowa transmisja danych
odczytanych z interfejsu 1-wire do mikrokontrolera po SPI
Kontrola CRC poprawnoci danych odebranych z 1-wire
Liczba kanaw 1-wire: 1
Liczba kanaw SPI: 1

Elektronika Praktyczna 12/2005

Blok interfejsu SPI

Blok ten zosta zaimplementowany w oparciu o schemat blokowy pokazany na rys. 3. Opadajce zbocze
na wejciu CS zeruje 5bitowy licznik, ktrego wyjcie poczone jest
z wejciem adresowym multipleksera.
Wejcie taktujce licznika sterowane
jest poprzez inwerter z wejcia SCK
moduu interfejsu SPI. Pojawiajce
si na wejciu SCK impulsy powoduj zwikszanie zawartoci licznika
(podczas opadajcego zbocza SCK)
i tym samym poczenie odpowiedniego wejcia danych multipleksera
z jego wyjciem, bdcym rwnoczenie wyjciem szeregowym SO caego
bloku SPI. Multiplekser zosta wyposaony dodatkowo w wejcie zezwalajce (aktywny poziom niski) poczone z wejciem wyboru CS bloku
SPI. Poziom wysoki na tym wejciu
powoduje, e niezalenie od stanu
wej danych i adresowych multipleksera, na jego wyjciu zawsze
wystpuje stan niski. Poniewa najczciej implementowany standard
interfejsu SPI zakada, e bit najbardziej znaczcy (MSB) przesyany
jest jako pierwszy (jest to rwnie
bardzo wygodne przy konstruowaniu
programowej ptli obsugi interfejsu
SPI dla mikrokontrolerw), dlatego
te w przypadku prezentowanej tu
aplikacji wymaga to odpowiedniego
sposobu podczenia poszczeglnych
bajtw danych wejciowych bloku
SPI do wejcia danych multipleksera.

Sowo wejciowe bloku SPI skada


si w rzeczywistoci z 4 niezalenych
bajtw, stanowicych zawarto pamici notatnikowej ukadu termometru cyfrowego. Transmisja za pomoc
interfejsu SPI bitu najbardziej znaczcego jako pierwszego, przy konstrukcji moduu jak na rys. 3, wymaga odwrcenia bitw we wszystkich
czterech bajtach, w taki sposb, aby
bit najmniej znaczcy sta si bitem
najbardziej znaczcym, itd. Std na
rys. 3 dodatkowy blok REV poredniczcy midzy wejciem bloku SPI
a wejciem danych multipleksera i realizujcy odwrcenie bitw.

Ukad sterujcy

Ukad sterujcy zosta zaprojektowany rwnie jako automat sekwencyjny, ktrego zadaniem jest
koordynacja dziaa opisanych wy-

Rys. 3. Schemat blokowy interfejsu


SPI

35

Konwerter 1Wire > SPI opisany w Verilogu

ej blokw, w taki sposb, aby moliwa bya realizacja okrelonego algorytmu. Algorytm ten w przypadku
prezentowanego ukadu konwertera
1wire > SPI obsugujcego termometry cyfrowe rmy Dallas/Maxim,
wyglda nastpujco:
wygenerowanie impulsu zerujcego
dla ukadu termometru 1wire,
sprawdzenie impulsu obecnoci
ukadu 1wire,
wysanie do ukadu polecenia
o kodzie 0CCh (pomi ROM),
wysanie do ukadu polecenia
o kodzie 044h (zmierz temperatur),
cykliczny odczyt danych z ukadu,
a do momentu, gdy odczytane
bity bd miay warto 1 (pomiar
temperatury zakoczony),
wygenerowanie impulsu zerujcego,
sprawdzenie impulsu obecnoci,
wysanie do ukadu polecenia
o kodzie 0CCh,
wysanie do ukadu polecenia
o kodzie 0BEh (odczytaj pami
notatnikow),
odczyt 9 bajtw danych (zapamitywane s tylko 4 bajty o numerach 0, 1, 6 i 7),
porwnanie obliczonej wartoci wielomianu CRC z otrzymanych danych z wartoci odczytan (dziewity bajt o numerze 8)
i w przypadku zgodnoci ustawienie wyj gotowoci RDY1 i RDY2,
sprawdzenie stanu linii wyboru
CS1 i CS2 interfejsu SPI w przypadku, gdy na obu liniach wystpuje stan wysoki (brak transmisji
danych za pomoc interfejsu) przepisanie na wyjcie data_out<31:0>
ukadu sterujcego czterech bajtw
danych odczytanych z pamici
notatnikowej ukadu termometru
1wire,
rozpoczcie wykonywania algorytmu od pocztku.
Dodatkowo ukad sterujcy, przy
kadym kolejnym cyklu obiegu wyej opisanego algorytmu, zmienia
stan wyjcia LED na przeciwny. Do
tego wyjcia moe by doczona
dioda LED, ktrej cykliczne miganie
(w przypadku pozostawienia wej
CS1 i CS2 w stanie wysokim) oznacza poprawn prac caego ukadu.
Ukad sterujcy powoduje odczytanie caej zawartoci pamici
notatnikowej ukadu termometru cyfrowego, jednak na swoim wyjciu
(wejciu interfejsu SPI) udostpnia
tylko 4 bajty tej pamici (bajty 0,

36

Rys. 4. Schemat ideowy ukadu konwertera 1wire > SPI

1, 6, 7). W przypadku podczenia


do konwertera termometrw precyzyjnych typu DS18B20, bajty 6 i 7
mona zupenie pomin, gdy kompletna informacja o temperaturze zawarta jest w dwch pierwszych bajtach 0 i 1. W przypadku podczenia
termometrw np. typu DS1820 bajty
6 i 7 mona wykorzysta do bardziej precyzyjnego obliczenia wartoci zmierzonej temperatury.
Warto rwnie w tym miejscu
doda, e zmiana algorytmu pra-

cy prezentowanego tutaj konwertera (np. obsuga termometru 1wire


w trybie z tzw. zasilaniem pasoytniczym) wymaga jedynie dokonania
zmian w strukturze automatu sekwencyjnego w ukadzie sterujcym,
a wirtualne komponenty ukadu operacyjnego pozostaj niezmienione.

Przykadowa aplikacja

Schemat ideowy przykadowej aplikacji ukadu konwertera


1wire<>SPI zaimplementowanego

Elektronika Praktyczna 12/2005

Konwerter 1Wire > SPI opisany w Verilogu

z wykorzystaniem wyej opisanych


wirtualnych komponentw, pokazano na rys. 4. Jako ukad programowalny wybrano XC2C256 z serii
CoolRunner II CPLD rmy Xilinx.
Charakteryzuje si on m. in. bardzo niskim poborem prdu (w stosunku do wikszoci ukadw klasy
CPLD), krtkimi opnieniami typu
pintopin oraz bardzo szybkim
programowaniem w systemie (ISP)
za pomoc interfejsu JTAG.
Wybrany ukad programowalny
wymaga stosowania dwch napi
zasilajcych, oddzielnego napicia
do zasilania rdzenia (1,8 V) i oddzielnego do zasilania buforw wejcia wyjcia (o wartoci zalenej
od wybranego standardu pracy, tu
wybrano standard LVTTL wymagajcy napicia 3,3 V). Dlatego te
zastosowano dwa, stosunkowo a-

two dostpne, stabilizatory LDO


(Low Drop Output) U1 i U2 typu
SPX1117 rmy Sipex.
Pe w n w a d u k a d w C P L D
z serii CoolRunnerII jest to, e ich
komrki wejcia wyjcia nie toleruj napi wyszych ni napicie
zasilania tych komrek. Oznacza to
brak kompatybilnoci z wci szeroko stosowanym, piciowoltowym,
standardem TTL. W celu zapewnienia moliwoci wsppracy ukadu
konwertera (poprzez interfejs SPI)
z innymi ukadami pracujcymi
w standardzie TTL, zastosowano dodatkowy bufor magistrali U6 z serii
74AHC, zapewniajcy konwersj napi wejciowych 5 V do poziomu
3,3 V. Bufor ten jest zbdny w przypadku wsppracy z urzdzeniami
pracujcymi w standardzie LVTTL.
Ostatecznie mona go rwnie za-

List. 3. Opis bloku odczytu danych

module one_wire_read(clk,reset,data,rx_activate,reset_crc,zero,
load,done,time_c,bus_out,bus_in,crc,crc_enable);
input clk,reset,rx_activate,zero,bus_in,reset_crc,crc_enable;
output done,bus_out,load;
output [7:0] crc;
output [7:0] data;
reg [7:0] data;
output [6:0] time_c;
reg done,wire1_out,ld;
reg [2:0] state;
reg [6:0] tc;
reg [2:0] cntr;
reg [7:0] crc;
wire in_crc;
assign in_crc=bus_in^crc[0];
//pomocniczy sygna do obliczania CRC
always@(posedge clk or negedge reset)
begin
if(~reset) state=0; else
begin
case(state) //realizacja automatu
3d0:
begin //Stan pocztkowy
done=0; tc=7d0; ld=1b0;
cntr=0; wire1_out=1b1;
if(rx_activate) state=3d1;
if(reset_crc) crc=8d0;
end
3d1: begin
wire1_out=1b0;
tc=7d0; ld=1b1;
if(zero) state=3d2;
//wymuszenie poziomu nieskiego na 1wire przez 5us
end
3d2: begin
wire1_out=1b1; //zwolnienie magistrali
state=3d3; ld=1b0;
end
3d3: begin
tc=7d0; ld=1b1;
if(zero) state=3d5; //Odczekanie 5us
end
3d5: begin
ld=1b0; state=3d6;
data={bus_in,data[7:1]}; //prbkowanie magistrali rejest przesuwny
if(crc_enable)
crc={in_crc,crc[7],crc[6],crc[5],crc[4]^in_crc,crc[3]^in_crc,crc[2],crc[1]};
//powyej realizacja obliczenia wielomianu CRC
end
3d6: begin
tc=7d17; ld=1b1; //odczekanie 90us
if(zero) state=3d7;
end
3d7: begin
ld=1b0;
if(cntr!=3d7) begin
cntr=cntr+1; state=3d1; end
else begin done=1b1; state=3d0; end
//jeeli odczytano juz 8 bajtw ustaw done i przejd do stanu pocztkowego
end
endcase
end
end
assign time_c=tc;
assign load=ld;
assign bus_out=wire1_out;
endmodule

Elektronika Praktyczna 12/2005

Rys. 5. Schemat montaowy ukadu


konwertera 1wire > SPI

stpi zwykymi rezystorami o wartoci kilkuset omw, czcymi odpowiednie kocwki zcza CON3
i ukadu U5. Wyjcia ukadu CPLD
(U5) nie s buforowane.
Tranzystor T1 spenia rol typowego elementu sprzgajcego z magistral jednoprzewodow. Cho
istnieje moliwo skongurowania
komrek wejcia wyjcia ukadu
XC2C256 do pracy w trybie otwarty
dren, jednak ze wzgldu na wiksz elastyczno zastosowa opisywanych tu wirtualnych komponentw (brak zalenoci od waciwoci wybranej struktury ukadu PLD),
zdecydowano si na zastosowanie
zewntrznego tranzystora MOSFET.
Elementy RC: R2 i C4 speniaj rol prostego ukadu zerujcego,
utrzymujcego przez pewien czas
po wczeniu napicia zasilania,
poziom niski na wybranej kocwce ukadu U5. Rezystor R1 o wartoci zero omw (zwora) zasila interfejs JTAG wewntrz ukadu CPLD
i moe by usunity w przypadku,
gdy nie przewiduje si przeprogramowania (zmiany konguracji)
ukadu CPLD. Jako generator zegara
zastosowano typowy zintegrowany
(w metalowej obudowie) generator
o wartoci 2 MHz. Na zczu CON2
dostpne s linie interfejsu JTAG
do kongurowania ukadu PLD.
Zcze CON4 jest opcjonalne, przydatne w fazie testowania.
Po zmontowaniu ukadu i wczeniu napicia zasilania, przy nie
podczonym zczu CON3 interfejsu SPI, ukad powinien sygnalizowa prawidow prac miganiem
diody LED D1. Wymuszenie poziomu niskiego na linii CS1 lub CS2
zcza CON3 powinno spowodowa
zaprzestania migania diody. Miganie diody sygnalizuje wykonywanie
kolejnych cykli konwersji i odczytu
temperatury z ukadu termometru
cyfrowego. Informacja o temperaturze w postaci czterech bajtw (0,

37

Konwerter 1Wire > SPI opisany w Verilogu

1, 6 i 7) stanowicych zawarto
pamici notatnikowej ukadu termometru dostpna jest na podwjnym zczu SPI (CON3). Bajty te,
podczas taktowania linii SCK1 lub
SCK2 interfejsu SPI przesyane s
w wymienionej wyej kolejnoci bitem najbardziej znaczcym jako
pierwszym. Dane dostpne poprzez
podwjny interfejs SPI mog by
odczytywane w dowolnym momencie, w peni rwnolegle przez dwa
niezalene urzdzenia (np. mikrokontrolery). Oprcz standardowych
linii interfejsu takich jak SCK, CS,
SO na zczu CON3 dostpne s
take dwie linie gotowoci RDY1
i RDY2. Na liniach tych pojawia si
stan wysoki, wwczas, gdy dostpna jest nowa, warto temperatury
zmierzona przez termometr i gotowa
do odczytania poprzez interfejs SPI.
Linie gotowoci s zerowane, gdy
zostanie przeprowadzony odczyt danych za porednictwem korespondujcego z dan lini gotowoci, kanau interfejsu SPI (SPI1 lub SPI2).

Moliwoci modykacji

Opisany tu wirtualny komponent


konwertera 1wire > SPI, przeznaczony do wsppracy z termometrami
cyfrowymi z magistral 1wire, moe
by w sposb nieskomplikowany poddany wielu modykacjom zwikszajcym jego funkcjonalno. Na przykad
poprzez stosunkowo niewielk zmian automatu w ukadzie sterujcym
(dodanie kilku stanw) i uzupenienie
ukadu elektrycznego o dodatkowy
tranzystor MOSFET realizujcy silne
podciganie do plusa zasilania, mona zapewni prac termometru z tzw.
zasilaniem pasoytniczym, umoliwiajcym pene wykorzystanie zalet
magistrali jednoprzewodowej. Nieco
bardziej skomplikowana modykacja
ukadu sterujcego i bloku interfejsu
SPI mogaby, na przykad, umoliwi
dwukierunkow konwersj 1wire
<> SPI, pozwalajc np. na zapis
(poprzez interfejs SPI) wybranych
bajtw do pamici notatnikowej termometru cyfrowego, itp.

List. 4. Opis bloku zapisu danych

module one_wire_write(clk,reset,data,trx_activate,zero,load,done,time_c,bus_out);
input clk,reset,trx_activate,zero;
output done,bus_out,load;
input [7:0] data;
output [6:0] time_c;
reg done,wire1_out,ld;
reg [2:0] state;
reg [6:0] tc;
reg [2:0] mux_addr;
wire tx_bit;
//poniej opis behawioralny multipleksera
function mux81;
input [7:0] data;
input [2:0] addr;
integer i;
begin
for(i=0;i<8;i=i+1)
if(i==addr) mux81=data[i];
end
endfunction
assign tx_bit=mux81(data,mux_addr);
//tx_bit transmitowany bit
always@(posedge clk or negedge reset)
begin
if(~reset) state=0; else
begin
case(state) //realizacja autoamtu
3d0: begin //stan pocztkowy
mux_addr=0; done=0; tc=7d0; ld=1b0;
wire1_out=1b1;
if(trx_activate) state=3d1;
end
3d1:begin
wire1_out=1b0; //wymuszenie 0 na 1wire przez 5us
tc=7d0; ld=1b1;
if(zero) state=3d2;
end
3d2: begin
ld=1b0; state=3d3;
if(tx_bit==1b1) wire1_out=1b1;
//jeeli tx_bit=1 zwolnij magistral
end
3d3: begin
tc=7d17; ld=1b1; //odczekanie 90us
if(zero) state=3d4;
end
3d4: begin
ld=1b0; wire1_out=1b1;
//ustaw stan wysoki na 1wire
state=3d5;
end
3d5: begin
tc=7d0; ld=1b1; //odczekaj 5us
if(zero) state=3d6;
end
3d6: begin
ld=1b0;
if(mux_addr==3d7) state=3d7;
else
begin mux_addr=mux_addr+1; state=3d1; end
//jeeli nie wysano jeszcze 8 bitw wr do stanu 1
end
3d7: begin
done=1b1; state=3d0;
//zapis zakoczony, ustaw done i przejd do stanu pocztkowego.
end
endcase
end
end
assign time_c=tc;
assign load=ld;
assign bus_out=wire1_out;
endmodule

W przedstawionej wersji konwerter zajmuje 186 makrokomrek


spord 256 dostpnych w ukadzie
XC2C256, pozostaje wiec jeszcze
troch zasobw do wykorzystania.
Moliwa jest jednak pewna optymalizacja budowy czci operacyjnej
konwertera, poprzez zintegrowanie

funkcji blokw generowania sygnau zerujcego oraz zapisu i odczytu


w jednym module, opisanym jednym automatem, przez co mona
uzyska mniejsze zuycie zasobw
danego ukadu programowalnego.
Zbigniew Hajduk

www.sklep.avt.com.pl
38

Elektronika Praktyczna 12/2005