OPROGRAMOWANIE APARATURY POMIAROWEJ - IME

Transkrypt

OPROGRAMOWANIE APARATURY POMIAROWEJ - IME
OPROGRAMOWANIE APARATURY POMIAROWEJ
OPROGRAMOWANIE APARATURY µP
Transmisja szeregowa na przykładzie portu szeregowego,
tunera radiowego i preprocesora RDS
Laboratorium
1. Cel ćwiczenia
Celem ćwiczenia jest zapoznanie studentów z szeregowym przesyłaniem informacji na przykładzie portu
szeregowego mikrokontrolera, magistrali I2C jak również nie standaryzowanego interfejsu szeregowego oraz
pokazanie darmowych narzędzi służących do uruchamiania systemów mikroprocesorowych na przykładzie
programu monitora PAULMON2. Transmisja na magistrali I2C musi być generowana programowo poprzez
odpowiednie sterowanie liniami SDA i SCL.
2. Tuner radiowy OM 5610
Firma Philips opracowała układ scalony oznaczony symbolem TEA5757, który w niewielkiej strukturze
integruje wszystkie elementy torów radiowych FM i AM oraz dekoder stereofoniczny. Nie jest to jednak
najważniejsza cecha tego układu. Z punktu widzenia jego zastosowania, znacznie większe znaczenie ma sposób
jego strojenia. Do tego celu wykorzystywany jest czteroprzewodowy, synchroniczny interfejs szeregowy.
Dalszym uproszczeniem stosowania niniejszego układu było zaprojektowanie przez inżynierów firmy Philips
miniaturowego modułu z układem TEA5757, tworząc kompletny odbiornik FM z wbudowanym dekoderem
stereofonicznym i inteligentnym systemem strojenia [9]. Właśnie taki moduł zastosowano w makiecie
wykorzystywanej do realizacji niniejszego ćwiczenia.
2.1. Programowanie tunera
Programowanie tunera odbywa się poprzez czteroprzewodowy, szeregowy interfejs synchroniczny. Na
rys. 3 (dodatek A) znajdują się przebiegi czasowe sygnałów sterujących podczas procesu zapisu danych do
rejestru konfiguracyjnego układu TEA5757, natomiast przebiegi z rys. 2 (dodatek A) obrazują proces odczytu
danych z tunera. Zarówno wysyłanie jak odbiór informacji z układu odbywa się począwszy od najstarszego bita
ramki przedstawionej na rys. 1. Oprócz trzech linii WREN, CLCK i DATA biorących bezpośredni udział w
procesie przesyłania i odbierania danych do/z tunera, istnieje jeszcze czwarta linia oznaczona STEREO. Jest ona
wykorzystywana do identyfikacji aktualnego stanu tunera, co zaprezentowano w tabeli. 2 (dodatek A).
Zastosowany w układzie TEA5757 zaawansowany system automatycznego strojenia umożliwia
przeprowadzenie tego procesu na dwa sposoby:
• ściśle do zaprogramowanej przez użytkownika częstotliwości z dokładnością do 12,5kHz,
• automatyczne wyszukiwanie pierwszego silnego sygnału stacji w górę lub w dół od aktualnie ustawionej
częstotliwości.
Wewnętrzny przesuwny rejestr konfiguracyjny układu TEA5757, który można zapisywać lub
odczytywać, ma długość 25 bitów. Zapis wszystkich bitów do rejestru wymaga 25 taktów zegarowych,
natomiast do odczytu jego zawartości wystarczają 24 takty.
MSB
24
Start
strojenia
23
22
21
20
19
18
17
16
Kierunek
Góra
Doł
Mono
Stereo
0
0
Local
DX
0
S0
S1
15
14
13
12
11
10
9
8
0
0
F13
F12
F11
F10
F9
F8
7
6
5
4
3
2
1
LSB
0
F7
F6
F5
F4
F3
F2
F1
F0
Rys.1. Struktura rejestru przesuwnego układu TEA5757
1
14 najmłodszych bitów (F0÷F13) służy do ustalania częstotliwości stacji radiowej i jest brane przez układ
pod uwagę tylko wtedy, gdy użytkownik chce zaprogramować odbiór stacji o ściśle określonej częstotliwości
(bit 24 = 0). Wagi poszczególnych bitów przedstawiono w tabeli 4 (dodatek A). Po ustaleniu kodu pożądanej
częstotliwości należy dodać do niego wartość odpowiadającą częstotliwości 10,7MHz (częstotliwość pośrednia
dla sygnału zmodulowanego częstotliwościowo). Dla przykładu kod odpowiadający częstotliwości 94,1MHz
(Polskie Radio Program 3) wynosi 1D68H. Kod częstotliwości 10,7MHz wynosi 0358H. Zatem zapis wartości
20C0H na bitach F0÷F13 będącej sumą przedstawionych kodów pozwoli na dostrojenie tunera do częstotliwości
94,1MHz.
Bit 15 nie jest używany. Dwa kolejne bity (16 i 17) służą do ustalania czułości systemu wyszukiwania
zgodnie z tabelą 4 (dodatek A). Również bit 18 nie jest w niniejszej aplikacji wykorzystywany. Za pomocą bitu
19 ustalany jest tryb pracy bloku automatycznej regulacji wzmocnienia (ARW) – patrz tabela 3 (dodatek A).
Dwa kolejne bity (20 i 21) wykorzystywane są do przełączania zakresów FM MW, LW lub SW. W niniejszej
aplikacji mogą przyjąć tylko wartość 0 wybierając zakres FM w paśmie 88..108MHz. Bit 22 odpowiada za
wymuszenie pracy dekodera w trybie monofonicznym (logiczne 0) lub zezwolenie na pracę w trybie stereo
(logiczne 1), o ile odbierana stacja nadaje sygnał w takim trybie [9].
Wysłanie ramki sterującej z ustawiony bitem 24 w stan jedynki logicznej uruchamia automatyczne
przeszukiwanie zakresu częstotliwości i dostrojenie się układu tunera do odbioru sygnału pierwszej napotkanej
stacji radiowej. Kierunek strojenia (0 – w górę, 1 – w dół) od aktualnie ustawionej częstotliwości określa bit 23.
UWAGA: Należy pamiętać, że po zapisie informacji do tunera a przed dokonaniem operacji odczytu należy do
linii portu, do której jest podłączone wejście DATA tunera wpisać 1 w celu ustawienia jej jako wejście.
3. Podstawowe informacje o RDS
3.1. Zarys historyczny
System RDS (ang. Radio Data System) powstał jako ułatwienie posługiwania się odbiornikiem UKF FM i
jest stosowany do przesyłania dodatkowych informacji cyfrowych w trakcie nadawania audycji radiowych w
paśmie UKF/FM (87,5..108MHz) [3]. Dane docierające do radioodbiorników wykorzystywane są m.in do
strojenia urządzenia. Dzięki temu zazwyczaj nie sposób jest zauważyć, kiedy odbiornik przełączył się na odbiór
z nadajnika o silniejszym sygnale odbieranej stacji [5].
Pierwsze prace nad stworzeniem systemu przekazującego dodatkowe informacje i zarazem nie
powodującego zakłóceń przeprowadzone zostały pod koniec lat siedemdziesiątych XX wieku. Swoje projekty
przygotowały takie kraje jak: Wielka Brytania, Szwecja, Finlandia, Holandia i Francja. Po przeprowadzeniu
testów okazało się, że najlepszą propozycję przygotowali Szwedzi. W 1982 roku wprowadzona została nazwa
RDS oraz zdecydowano się na przyjęcie systemu jako zalecanego w Europie. Cztery lata później
Międzynarodowy Komitet Radiokomunikacyjny (CCIR) zalecił stosowanie go do przekazywania dodatkowych
informacji wraz z sygnałem stacji UKF [1].
3.2. Struktura informacyjna systemu RDS
Strukturę strumienia bitów informacji nadawanej w systemie RDS pokazano na rys. 2. Najważniejszym
elementem przesyłanej informacji jest grupa o długości 104 bitów. Każda grupa składa się z czterech bloków. Z
kolei blok to 16 bitów informacji i 10 bitów nadmiarowych, w których zakodowane jest słowo kontrolne oraz
informacja określająca rodzaj bloku. Słowo kontrolne jest niezbędne do wykrywania i ewentualnej korekcji
powstałych w trakcie przesyłania błędów transmisji [3].
Grupa = 4 bloki = 104 bity
Blok A
Blok B
Blok C
Blok D
Blok = 26 bitów
Słowo informacyjne
Słowo kontrolne
Słowo informacyjne = 16 bitów
Słowo kontrolne = 10 bitów
m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0
2
c9
c8
c7
c6
c5
c4
c3
c2
c1
c0
Rys.2. Struktura informacji przesyłanej w RDS
Na rys.3 pokazano organizację informacji przesyłanej w grupie. Kolejne bloki w grupie oznaczone są
literkami: A, B, C i D. Blok A w każdej grupie zawiera słowo PI (ang. Program Identification), którego struktura
pokazana jest na rys. 4. Słowo PI jest używane do jednoznacznej identyfikacji nadawanego programu.
Blok A
Blok B
B0
Słowo
kontrolne
+
offset A
Kod PI
A3
A2
A1
A0
Typ
0
Słowo
kontrolne
+
offset A
A1
A0
Typ
1
Słowo
kontrolne
+
offset D
Wersja A
Blok B
Kod PI
Blok D
Słowo
kontrolne
+
offset C
TPC PT4 PT3 PT2 PT1 PT0
B0
A2
Słowo
kontrolne
+
offset B
PTY
Blok A
A3
Blok C
TP
Blok C'
Blok D
TP
Słowo
kontrolne
+
offset B
PTY
Kod PI
TPC PT4 PT3 PT2 PT1 PT0
Słowo
kontrolne
+
offset C'
Słowo
kontrolne
+
offset D
Wersja B
Rys.3. Budowa grupy danych
Pięć najstarszych bitów bloku B umożliwia identyfikację typu (numeru) i wersji grupy: cztery najstarsze
określają typ grupy (0..15), a najmłodszy wersję (0 – wersja A, 1 – wersja B). W przypadku wersji B w bloku C
jest powtarzany kod PI. Ma to na celu umożliwienie szybszego dostępu do informacji niezbędnych do
przestrojenia odbiornika. Kolejny bit oznaczony TP umożliwia stwierdzenie, czy stacja radiowa nadaje
informacje dla kierowców o ruchu drogowym. Bity PT4..PT0 zawierają dane związane z typem transmitowanej
audycji (PTY), zgodnie z opisem w tabeli 1. Niektóre stacje radiowe nadają stały kod PTY niezależnie od
aktualnie nadawanej treści, inne zmieniają go dynamicznie w zależności od rodzaju nadawanej audycji.
Pozostałe pięć bitów bloku B są wykorzystywane w różny sposób w zależności od typu grupy.
Tabela 1. Kody PTY nadawanych programów
Nr
0
Kod
00000
Typ programu
Brak
Wyświetlacz
NONE
Nr
16
Kod
10000
Typ programu
Pogoda
Wyświetlacz
WEATHER
1
00001
Wiadomości
NEWS
17
10001
Finanse
FINANCE
10010
Dla dzieci
CHILDREN
10011
Sprawy społeczne
SOCIAL A
2
00010
Bieżące wydarzenia
AFFAIRS
18
3
00011
Informacje
INFO
19
4
00100
Sport
SPORT
20
10100
Religia
RELIGION
10101
Forum telefoniczne
PHONE IN
5
00101
Edukacja
EDUCATE
21
6
00110
Teatr
DRAMA
22
10110
Podróże
7
00111
Kultura
CULTURE
23
10111
8
01000
Nauka
SCIENCE
24
11000
Zainteresowania i
hobby
Muzyka jazzowa
HOBBY/
LEISURE
JAZZ
9
01001
Rozmaitości
VARIED
25
11001
Muzyka country
COUNTRY
10
01010
Muzyka pop
POP M
26
11010
Muzyka krajowa
MNATION M
11011
Stare przeboje
OLDIES
11
01011
Muzyka rockowa
ROCK M
27
12
01100
Muzyka lekka
M,O,R,M /
EASY M
28
11100
Muzyka folkowa
FOLK
13
01101
11101
Dokumentalny
DOCUMENT
01110
01111
LIGHT M
CLASSIC
29
14
15
Lekka muzyka klasyczna
Muzyka klasyczna
30
11110
Test alarmu
TEST
Inna muzyka
OTHER M
31
11111
Alarm
ALARM
3
PI jest czterocyfrowym (przy zapisie heksadecymalny) kodem przypisanym do stacji radiowej. Każda z
cyfr w kodzie pełni swoją rolę: pierwsza określa kraj, z którego nadawany jest program (3 – Polska, 5 –
Słowacja, 2 – Czechy, D – Niemcy, F – Francja), druga mówi o zasięgu (patrz tabela 2). Pozostałe dwie - na
przykład w Niemczech - kodują informację o publiczności/prywatności nadawcy i numerze programu. Na
podstawie kodu PI odbiornik może zidentyfikować odbieraną stację [5].
Kod kraju
Obszar
nadawania
b15 b14 b13 b12 b11 b10 b9
Rodzaj nadawcy
b8
b7
b6
b5
b4
Nr programu
b3
b2
b1
b0
Rys.4. Budowa słowa PI
Słowo PI, typ i wersja grupy, typ programu PTY oraz bit TP przesyłane są w każdej grupie. Interpretacja
informacji zawartej w pozostałych bitach bloku B oraz blokach C i D jest zależna od typu i wersji grupy.
Tabela 2. Znaczenie trzeciej cyfry słowa PI
Kod
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Opis
Lokalny (program transmitowany przez jeden nadajnik)
Międzynarodowy (ten sam program jest transmitowany w różnych krajach)
Krajowy (program transmitowany na terenie całego kraju)
Ponad regionalny (program transmitowany na znacznym obszarze danego kraju)
Regionalny (program dostępny na terenie pewnego regionu na jednej lub kilku częstotliwościach)
3.3. Budowa grupy 0
W grupie 0A oprócz kodu PI, typu grupy, bitów B0 i TP oraz kodu typu programu PTY, przesyłane są
również następujące informacje:
• bit TA jest uzupełnieniem informacji niesionej przez bit TP. Znaczenie poszczególnych kombinacji tych
bitów przedstawiono w tabeli 3.
• bit M/S informuje o rodzaju nadawanej audycji: 0 - muzyka (ang. music), 1 - audycja słowna (ang. speech).
• bit DI informuje o typie dekodera i jego znaczenie jest ściśle powiązane ze stanem bitów C0 i C1 (patrz
tabela 4).
Tabela 3. Znaczenie bitu TA w zależności od stanu bitu TP
TP
0
0
1
1
TA
0
1
0
1
Opis
Program nie zawiera informacji dla kierowców
Program zawiera informacje dla kierowców
Program zawiera tylko zapowiedzi programu dla kierowców
Informacja dla kierowców jest aktualnie nadawana
Tabela 4. Sposób kodowania informacji o programie
DI
d3 = 0
d3 = 1
d2 = 0
d2 = 1
d1 = 0
d1 = 1
d0 = 0
d0 = 1
C1
0
0
0
0
1
1
1
1
C0
0
0
1
1
0
0
1
1
Opis
Stałe PTY
Dynamicznie przełączane PTY
Brak kompresji
Kompresja
Brak „symulowanego nagłówka”
„Symulowany nagłówek
Program mono
Program stereo
4
W bloku D omawianej grupy transmitowane są dwa znaki nazwy odbieranej stacji (ang. Program
Service). Aby prawidłowo skompletować cały ośmioznakowy tekst, bitami C0 i C1 zakodowany jest numer pary
znaków aktualnie przesyłanych w odebranej grupie.
M/S
B0
Słowo
kontrolne
+
offset A
Kod PI
0
0
0
0
0
Wersja A
TA DI
TP
Typ
Słowo
kontrolne
+
offset B
PTY
DI
C1
C0
d3
d2
d1
d0
0
0
1
1
0
1
0
1
Słowo
kontrolne
+
offset C
Częstotliwości
alternatywne
b15
b14
b13
b12
b11
b10
1
3
5
7
b9
b8
Słowo
kontrolne
+
offset D
Segment nazwy
serwisu
b7
b6
b5
b4
b3
b2
b1
b0
2
4
6
8
Numery znaków
M/S
B0
Słowo
kontrolne
+
offset A
Kod PI
0
0
0
0
1
Wersja B
TA DI
TP
Typ
PTY
DI
C1
C0
d3
d2
d1
d0
0
0
1
1
0
1
0
1
Słowo
kontrolne
+
offset B
Słowo
kontrolne
+
offset C
Kod PI
b15
b14
b13
b12
b11
1
3
5
7
b10
b9
b8
Słowo
kontrolne
+
offset D
Segment nazwy
serwisu
b7
b6
b5
b4
b3
b2
b1
b0
2
4
6
8
Numery znaków
Rys.5. Budowa grupy 0A i 0B
W wersji A omawianej grupy, blok C zawiera zakodowaną listę alternatywnych częstotliwości nadawcy.
Ponieważ w bloku C przesyłane są tylko 2 bajty, lista częstotliwości przesyłana jest w sposób zakodowany.
Przyjęto dwie metody kodowania: A i B (nie mają one nic wspólnego z rodzajami grupy) [3].
Kodowanie A stosuje się dla przypadku, gdy lista alternatywnych częstotliwości ma co najwyżej 25
pozycji. W takim wypadku pierwsza wartość określa liczbę częstotliwości na liście i jest zakodowana za pomocą
wartości z przedziału 225..249 (225 = 1 częstotliwość, 226 = 2 częstotliwości, itd.), natomiast wartościom
częstotliwości alternatywnych z zakresu górnego pasma UKF (87,6..107,9MHz) z krokiem 0,1MHz,
przyporządkowane są kody w zakresie 1..204 (1 = 87,6MHz, 2 = 87,7MHz, itd.). Jeśli po odebraniu grupy
pierwszy bajt bloku C jest wartością z przedziału 225..249 oznacza to, że jest to liczba wartości częstotliwości na
liście. W przeciwnym razie jest to zakodowana wartość częstotliwości. Drugi bajt bloku C może zawierać kod
częstotliwości lub przy parzystej liczbie częstotliwości alternatywnych jest bajtem zamykającym o wartości 205.
Tabela.5. Przykład kodowania nieparzystej liczby częstotliwości alternatywnych w wersji A
#5
AF2 = 100 MHz
AF4 = 103,2 MHz
AF1 = 99,5 MHz
AF3 = 102,4 MHz
AF5 = 103,8 MHz
229
124
157
120
149
163
Tabela 6. Przykład kodowania parzystej liczby częstotliwości alternatywnych w wersji A
#4
AF2 = 100 MHz
AF4 = 103,2 MHz
AF1 = 99,5 MHz
AF3 = 102,4 MHz
Bajt zamykający
229
124
157
120
149
205
Sposób kodowania listy częstotliwości alternatywnych w wersji B zostanie przedstawiony na przykładzie
zaprezentowanym w tabeli 7. Pierwsze dwa bajty zawierają liczbę częstotliwości alternatywnych oraz aktualną
częstotliwość odbieranego programu. W kolejnych parach bajtów powtarzana jest częstotliwość nadawanego
programu i przesyłana jest jedna częstotliwość alternatywna. Normalnie wartości w dwóch bajtach są
umieszczane rosnąco, tzn. wartość w starszym bajcie jest mniejsza od wartości w bajcie młodszym (patrz
pierwsze dwie pary w tabeli 7). Jeśli dwie wartości transmitowane są malejąco to znaczy, że częstotliwość
5
alternatywna związana jest z innym regionem lub czasami jest na niej transmitowany inny program (patrz
ostatnie dwie pary w tabeli 7).
Tabela 7. Przykład kodowania częstotliwości alternatywnych w wersji B
#4
AF1 = 89,3 MHz
99,5 MHz
AF3 = 104,8 MHz
99,5 MHz
99,5 MHz
99,5 MHz
AF2 = 100,9 MHz
99,5 MHz
AF4 = 89,1 MHz
229
18
120
173
120
120
120
134
120
16
Grupa 0 jest nadawana najczęściej. W krańcowym przypadku może być ona jedyną nadawaną grupą. Jeśli
wysyłane są również inne grupy, to częstotliwość jej nadawania jest zmniejszana, jednak nie bardziej niż do
dwóch powtórzeń w ciągu sekundy. Związane jest to z prawidłowym wyświetlaniem informacji PS i
przesyłaniem listy alternatywnych częstotliwości [1].
W przypadku nadawania grupy 0 w wersji B, w bloku C nie jest przesyłana informacja o
częstotliwościach alternatywnych, lecz ponownie nadawany jest kod PI odbieranej stacji.
3.4. Budowa grupy 2
Grupa 2 zawiera oprócz wcześniej wymienionych standardowych informacji przesyłanych w każdej
grupie, informację alfanumeryczną nazwaną radiotekstem. Wersja A omawianej grupy dopuszcza przesłanie 64
znaków tekstu, natomiast tekst w wersji B zawiera tylko 32 znaki. Organizację informacji w grupie pokazano na
rys. 6. Poniżej omówiono grupę 2A.
Cztery najmłodsze bity bloku B określają adres segmentu złożonego z czterech znaków nadawanych w
bloku C i D. Cały tekst ma 16 segmentów po 4 znaki, co daje razem 64 znaki. Jeśli nadawana informacja ma
długość większą niż 16 segmentów, to musi kończyć się kodem CD (0DH). Znaki radiotekstu przesyłane w
bloku C i D nadawane są w kodzie ASCII [3].
W bloku B przesyłany jest dodatkowy bit Text A/B flag, Jeśli odbierana jest zmiana tego bitu z 0 na 1 lub
odwrotnie, to należy wyzerować bufor przechowujący odbierany tekst i uzupełniać go nowym. Jeśli natomiast
zmiana taka nie występuje, to aktualnie odebrany segment należy wpisać do istniejącego tekstu w buforze na
pozycję określoną bitami C3 do C0 [3].
B0
Słowo
kontrolne
+
offset A
Kod PI
0
0
1
0
0
Wersja A
Typ
0
0
1
1
Wersja B
Słowo
kontrolne
+
offset B
b15
Słowo
kontrolne
+
offset C
Segment
radiotekstu
...
b8
b7
...
C2
C1
C0
0
0
. . . .
0
0
0
0
0
1
.
1
5
2
6
1
1
1
1
61
62
Słowo
kontrolne
+
offset A
0
PTY
C3
B0
Kod PI
Text A/B
TP
.
b0
Słowo
kontrolne
+
offset D
Segment
radiotekstu
b15
Numery znaków
...
b8
b7
...
3
7
4
8
63
64
.
b0
.
Text A/B
TP
Typ
PTY
Słowo
kontrolne
+
offset B
Kod PI
Słowo
kontrolne
+
offset C
Słowo
kontrolne
+
offset D
Segment
radiotekstu
b15
...
C2
C1
C0
0
0
0
0
0
0
0
1
1
3
2
4
1
1
1
1
31
32
. . . .
b8
b7
...
C3
. Numery znaków .
Rys.6. Budowa grupy 2A i 2B
6
b0
4. Programowa obsługa sprzętowego preprocesora RDS
Zastosowany w makiecie sprzętowy preprocesor RDS SAA6588 firmy Philips dokonuje m.in.: filtracji i
demodulacji sygnału RDS, samoczynnie synchronizuje się z przychodzącym sygnałem oraz przeprowadza
korekcję błędów ograniczając działanie mikrokontrolera do odbioru kolejnych bloków i zestawiania ich w grupy.
Komunikacja pomiędzy układem preprocesora a mikrokontrolerem obywa się za pośrednictwem
magistrali I2C, której opis znajduje się w punkcie 5. Preprocesor występuje zawsze w roli układu slave,
natomiast mikrokontroler pełni rolę układu master. Komunikacja może odbywać się z prędkością do 400kbps.
Podłączenie linii SCL i SDA do mikrokontrolera przedstawiono na dołączonym do instrukcji schemacie
ideowym makiety. Magistrala I2C jest podłączona do innych bloków preprocesora poprzez wewnętrzne rejestry
(3 do zapisu i 7 do odczytu), każdy o rozmiarze jednego bajta.
Przed przystąpieniem do odczytu danych z preprocesora należy wysłać do niego 3 bajty konfiguracyjne
przedstawione na rys. 71. Bity znajdujące się w bajcie 0W dotyczą ustawień inicjujących i sterują pracą układu.
Bajt 1W określa ustawienia dotyczące poziomu czułości wykrywania pauzy i korekcji przychodzącej informacji
RDS. Bajt 2W odpowiada za ustawienie częstotliwości przyłączonego oscylatora i czułości detektora jakości
sygnału. Opis znaczenia poszczególnych bitów wymienionych bajtów znajduje się w tabelach 3,6 i 7 w dodatku
B.
warunek startu
z układu MASTER
S
0
adres układu SLAVE + bit zapisu
0
1
0
0
0
MAD
potwierdzenie odbioru z
układu SLAVE
0
bajt 0W wysyłany przez układ MASTER
A
potwierdzenie odbioru z
układu SLAVE
SQCM TSQD NWSY SYM1 SYM0 RBDS DAC1 DAC0
PL1
A
bajt 1W wysyłany przez układ MASTER
potwierdzenie odbioru z
układu SLAVE
PL0
FEB0
FEB5
FEB4 FEB3
FEB2
FEB1
bajt 2W wysyłany przez układ MASTER
PTF1
A
potwierdzenie odbioru z
układu SLAVE
PTF0 SOSC SQS4 SQS3 SQS2 SQS1 SQS0
A
P
warunek stopu
z układu MASTER
Rys.7. Komendy sterujące preprocesora – konfiguracja
Operacja konfiguracji preprocesora może być wykonana tylko jeden raz, aż do czasu, gdy układ nie zgłosi
utraty synchronizacji (patrz informacje odczytywane z preprocesora). W takim wypadku wystarczy wysłać do
niego ponownie tylko pierwszy bajt z ustawionym bitem NWSY w stan 1 w celu natychmiastowej ponownej
synchronizacji (rys. 8).
warunek startu
z układu MASTER
S
0
adres układu SLAVE + bit zapisu
0
1
0
0
0
MAD
potwierdzenie odbioru z
układu SLAVE
0
bajt 0W wysyłany przez układ MASTER
SQCM TSQD
1
A
potwierdzenie odbioru z
układu SLAVE
SYM1 SYM0 RBDS DAC1 DAC0
A
P
warunek stopu
z układu MASTER
Rys.8. Komendy sterujące preprocesora – natychmiastowe ponowne uruchomienie synchronizacji
1
Oznaczenie kolorystyczne wskazuje kierunek przesyłania informacji i jest zgodne z oznaczeniem przyjętym w punkcie 5.
7
Po przeprowadzeniu procesu synchronizacji układ preprocesora informuje mikrokontroler o dostępnych
danych ustawieniem linii DAVN w stan 0 logicznego. Linia ta podłączona pod wejście INT0 mikrokontrolera
może być sprawdzana programowo, jak również jej obsługa może odbywać się poprzez wykorzystanie systemu
przerwań mikrokontrolera. Odbiór informacji z preprocesora odbywa się zgodnie ze standardem I2C.
warunek startu
z układu MASTER
S
0
adres układu SLAVE + bit odczytu
0
1
0
0
0
MAD
potwierdzenie odbioru z
układu SLAVE
1
A
potwierdzenie odbioru z
układu MASTER
bajt 0R odbierany z układu SLAVE
BL2
BL1
BL0
SYNC DOFL RSTD ELB1
ELB0
A
potwierdzenie odbioru z
bajt 1R odbierany z układu SLAVE
układu MASTER
starszy bajt ostatnio przetworzonego bloku
M15
M14
M13
M12
M11
M10
M09
M08
A
potwierdzenie odbioru z
bajt 2R odbierany z układu SLAVE
układu MASTER
młodszy bajt ostatnio przetworzonego bloku
M07
M06
M05
M04
M03
M02
M01
M00
A
potwierdzenie odbioru z
bajt 3R odbierany z układu SLAVE
starszy bajt poprzednio przetworzonego bloku układu MASTER
PM15 PM14 PM13 PM12 PM11 PM10 PM09 PM08
A
potwierdzenie odbioru z
bajt 4R odbierany z układu SLAVE
młodszy bajt poprzednio przetworzonego bloku układu MASTER
PM07 PM06 PM05 PM04 PM03 PM02 PM01 PM00
bajt 5R odbierany z układu SLAVE
A
potwierdzenie odbioru z
układu MASTER
BEC5 BEC4 BEC3 BEC2 BEC1 BEC0 EPB1 EPB0
bajt 6R odbierany z układu SLAVE
BP2
BP1
BP0
nie
używany
SQI3
SQI2
A
brak potwierdzenia odbioru
z układu MASTER
SQI1
SQI0
A
P
warunek stopu
z układu MASTER
Rys.9. Protokół odbioru danych z preprocesora RDS
Zatem w celu odbioru informacji z preprocesora RDS konieczne jest wysłanie na magistralę adresu (rys. 9), a
następnie po uzyskaniu potwierdzenia od układu preprocesora, odbiór poszczególnych bajtów danych i
wystawianie potwierdzeń. Należy pamiętać, że po odebraniu siódmego bajta informacji należy wystawić
zanegowane potwierdzenie. Znaczenie poszczególnych bitów odbieranej informacji przedstawiają tabele 12 i 15.
8
5. Specyfikacja magistrali I2C
5.1. Ogólna charakterystyka magistrali I2C
Magistrala I2C (ang. Inter-Integrated Circuit Bus) jest dwukierunkowym, dwuprzewodowym standardem
komunikacji szeregowej, której głównym przeznaczeniem jest prosta integracja układów scalonych. System I2C
składa się z dwóch linii: danych (ang. Serial Data, SDA) i zegarowej (ang. Serial Clock, SCL) oraz układów
podłączonych do wymienionych linii. Standard ten pozwala na realizację wielu połączeń konfiguracyjnych.
Niniejsze opracowanie omawia tylko implementacje konfiguracji, gdzie występuje jeden układ master i wiele
układów slave.
Układ podłączony do magistrali może pracować jako master (układ nadrzędny) lub slave (układ
podrzędny). Układ master steruje przesyłaniem informacji na magistrali przez inicjację transmisji, generowanie
sygnału zegarowego w trakcie przesyłania informacji oraz zakańcza procesu przesyłania danych. Ze względu na
dopuszczenie w specyfikacji standardu możliwości występowania na magistrali kilku układów slave, zanim
nastąpi przesyłanie właściwej informacji układ master wysyła na magistralę adres urządzenia slave, do którego
ma ona dotrzeć.
Zaadresowane urządzenie slave pełni określoną funkcję odbierając lub przesyłając dane z/do urządzenia
master. Stąd niezależnie od podziału master-slave, układy podłączone do magistrali I2C są dzielone na nadajniki
(ang. transmitter) i odbiorniki (ang. receiver). Przesyłanie informacji odbywa się nie tylko w kierunku od układu
master (nadajnik) do układu slave (odbiornik). Czasami to układ master zwraca się do układu slave z żądaniem
przesłania danych stając się odbiornikiem i czyniąc niejako automatycznie układ slave nadajnikiem. Niezależnie
od przydziału ról nadajnik-odbiornik, zawsze układ master inicjuje i kończy transmisję danych po linii SDA oraz
generuje sygnał zegarowy na linii SCL.
Tabela 8. Podział układów podłączanych do magistrali I2C
Termin
Master
Slave
Nadajnik
Odbiornik
Opis
Układ, który inicjuje i kończy transmisję na magistrali oraz generuje sygnał zegarowy.
Układ adresowany przez układ master.
Układ wysyłający dane na magistralę.
Układ odbierający dane z magistrali.
5.2. Charakterystyka sprzętowa magistrali I2C
Rys.10 przedstawia konfigurację magistrali I2C właściwą dla stosowanej w ćwiczeniu makiety. Linie
SCL i SDA są podłączone do napięcia zasilania poprzez tzw. rezystory podciągające Rp, Stąd wymagane jest,
aby układy podłączone do magistrali posiadały wyprowadzenia SCL i SDA w konfiguracji otwarty dren lub
otwarty kolektor. Dzięki temu, jeśli magistrala jest wolna (nie jest przeprowadzana transmisja danych), linie
SCL i SDA są w stanie wysokim.
Istotną cechą charakterystyczną wynikającą z przedstawionej konfiguracji sprzętowej magistrali jest
możliwość przeprowadzania tzw. „operacji AND na drucie”. Właściwość ta nie będzie tutaj dokładnie
omawiana. Informacje na ten temat można znaleźć w [1]
SCL
Rp
Rp
SDA
SCL
SDA
SCL
Slave
Rys.10. Schemat blokowy systemu I2C
9
SDA
Master
Vcc
5.3. Charakterystyka protokołu
Przesyłanie danych na magistrali I2C może przebiegać na jeden z dwóch sposobów:
a) Układ master chce wysłać dane do układu slave:
• układ master adresuje układ slave,
• układ master (nadajnik) wysyła dane do układu slave (odbiornika),
• układ master kończy transmisje.
b) Układ master chce odebrać dane z układu slave:
• układ master adresuje układ slave,
• układ master (odbiornik) odbiera dane wysyłane przez układ slave (nadajnika),
• układ master kończy transmisje.
1
S
1
1
8
1
8
1
1
ADRES SLAVE'a W
7
A
DANE
A
DANE
A
P
przesyłanie danych
n bajtów + potwierdzenia
0 = zapis
A = potwierdzenie (SDA = 0)
A = brak potwierdzenie (SDA = 1)
S = warunek START
P = warunek STOP
transmisja z mastera do slave'a
transmisja z slave'a do mastera
Rys.11. Ramka informacyjna przy transmisji danych z układu master do układu slave
1
7
1
1
8
1
8
1
8
1
1
S
ADRES SLAVE'a
R
A
DANE
A
DANE
A
DANE
A
P
przesyłanie danych
n bajtów + potwierdzenia
1 = odczyt
Rys.12. Ramka informacyjna przy transmisji danych z układu slave do układu master
Na rys.11 i 12 pokazano typową ramkę związaną z protokołem przesyłania danych na magistrali I2C dla
dwóch omawianych przypadków. Po zainicjowaniu początku transmisji (S), wysyłany jest 7-bitowy adres układu
slave, po którym następuje jeden bit określający kierunek transmisji danych (0 określa transmisję danych z
układu master do układu slave, natomiast 1 żądanie nadania danych przez układ slave). W sumie daje to 8bitowy bajt informacji. W następnej kolejności przesyłane są bajty danych w odpowiednim kierunku. Koniec
transmisji danych (P) jest zawsze sygnalizowany przez układ master. Struktura ramki jest praktycznie stała za
wyjątkiem bajtów danych i kierunku transmisji.
5.3.1.
Warunki początku i końca transmisji
W celu zaznaczenie początku i końca transmisji ramki informacyjnej pomiędzy układem master i slave,
na magistrali I2C generowane są przez układ master odpowiednie stany nazywane warunkami START (S) i
STOP (P). Warunek START generowany jest w celu przejęcia kontroli nad magistralą, przez wymuszenie na
linii SDA przejścia z 1 na 0 przy utrzymanym stanie wysokim na linii SCL (rys.4). Warunek START może być
wygenerowany tylko wtedy, gdy magistrala I2C jest wolna (linie SDA i SCL są w stanie wysokim), tzn. żaden
inny układ master nie wymienia danych z układem slave sterując liniami SDA i SCL (w niniejszym ćwiczeniu
przypadek taki jest niemożliwy, gdyż w systemie występuje tylko jeden układ master).
Po przejęciu kontroli nad magistralą, układ master przesyła lub odbiera dane do/z zaadresowanego układu
slave. Po wymianie informacji układ master musi zwolnić magistralę generując warunek STOP, który polega na
zmianie stanu linii SDA z 1 na 0 przy stanie wysokim na linii SCL (rys.13).
S
P
SDA
SCL
min. 4µs
min. 4µs
Rys.13. Generacja warunków START i STOP
10
Zgodnie ze specyfikacją [1] standardu I2C, po wygenerowaniu warunku START, linia SCL musi być
utrzymywana w stanie wysokim jeszcze, przez co najmniej 4µs. Podobnie linia SCL musi być ustawiona w stan
wysoki, co najmniej 4µs przed generacja warunku STOP.
5.3.2.
Rozpoznawanie adresu
Ze względu na szeregową transmisję na magistrali I2C, w danej chwili może być przeprowadzana
komunikacja układu master tylko z jednym układem slave. Dlatego po rozpoczęciu transmisji w wyniku
wygenerowania przez układ master warunku START, wysyłany jest 7-bitowy adres, który jest odbierany przez
wszystkie układy slave (rys.14). Do magistrali zostaje podłączony tylko ten układ, który rozpozna swój adres,
stając się nadajnikiem lub odbiornikiem w zależności od wartości najmłodszego bitu przesyłanego bajta,
określającego kierunek transmisji danych.
MSB
LSB
R/W
adres układu SLAVE
Rys.14. Pierwszy bajt przesyłany po wygenerowaniu warunku START
5.3.3.
Przesyłanie danych
Każdy bajt przesyłany po linii SDA musi mieć długość 8 bitów. Liczba bajtów przesyłanych po
magistrali w jednej ramce informacyjnej nie jest ograniczona. Po wysłaniu każdego bajta danych układ
odbiornika musi potwierdzić jego przyjęcie generując bit potwierdzenia A (ang. acknowledge bit). Każdy bajt
danych jest przesyłany w kolejności od najstarszego do najmłodszego bitu (rys.17 i 18). Jeśli układ slave nie
może odebrać lub wysłać kolejnego bita danych, ponieważ musi zrealizować jakąś inną funkcję, to utrzymuje
linię SCL w stanie niskim wprowadzając układ master w stan oczekiwania (ang. wait state). Przesyłanie danych
jest kontynuowane, gdy układ slave jest gotowy do przesłania lub odebrania kolejnego bajta zwalniając linie
zegarową SCL. Dlatego w przypadku, gdy sygnał zegarowy SCL jest generowany na magistrali programowo, po
zmianie stanu linii SCL z niskiego na wysoki konieczne jest również sprawdzenie, czy przypadkiem układ slave
nie wprowadził stanu oczekiwania wprowadzając linię w stan niski.
5.3.4.
Potwierdzenie przyjęcia danych
Przesyłanie danych na magistrali I2C z potwierdzeniem jest obowiązkowe. Bit A potwierdzenia jest
generowany zawsze przez układ, który odebrał aktualnie przesyłany bajt (niezależnie, czy jest to bajt adresu, czy
danej). Dlatego przed pojawieniem się impulsu zegarowego dla bitu potwierdzenia układ, który nadał ostatni bajt
musi zwolnić linię SDA ustawiając ją w stan wysoki. Dzięki temu układ odbiornika może sterować linią SDA
wysyłając bit potwierdzenia poprzez ustawienie wspomnianej linii w stan niski przy stanie wysokim na linii SCL
(rys.15).
S
linia SDA z nadajnika
linia SDA z odbiornika
1 = brak potwierdzenia odebrania bajtu danej
0 = potwierdzenie odebrania bajtu danej
SCL
1
2
8
9
Rys.15. Potwierdzenie przyjęcia bajta danych przez odbiornik
Jeśli układ slave nie może potwierdzić odebrania bajta adresu (np. nie może przesyłać ani odbierać
informacji, ponieważ realizuje jakieś zadanie, które musi być wykonanie w czasie rzeczywistym), to pozostawia
linię SDA w stanie wysokim. Dzięki temu układ master może wygenerować warunek STOP w celu przerwania
transmisji z danym układem SLAVE i powtórzyć warunek START w celu inicjacji kolejnej transmisji.
Układ master żądając od układu slave przesłania danych nie definiuje liczby bajtów, które mają być
przesłane. Dlatego jeśli układ master pełni rolę odbiornika to jego zadaniem jest nie tylko generowanie bitów
potwierdzenia, lecz także powiadomienie układu slave o końcu odbierania danych poprzez nie wygenerowanie
bitu potwierdzenia. Polega to na utrzymaniu linii SDA w stanie wysokim po odebraniu ostatniego bajta z układu
slave podczas trwania impulsu dla bitu potwierdzenia (rys.15).
11
5.3.5.
Wiarygodność danych
Rysunek16 obrazuje zależności czasowe, jakie muszą być spełnione przy przesyłaniu pojedynczego bitu
informacji. Bit informacji na linii SDA musi mieć ustaloną wartość przed pojawieniem się stanu wysokiego na
linii zegarowej SCL. Natomiast stan linii SDA może być zmieniany tylko wtedy, gdy linia zegarowa SCL jest w
stanie niskim. Dodatkowo czas opadania i narostu sygnałów na liniach magistrali musi spełniać wymagania
czasowe opisane w specyfikacji standardu I2C [1].
SDA
min. 300ns
SCL
min. 4µs
min. 250ns
min. 4,7µs
Rys.16. Zależności czasowe przy przesyłaniu pojedynczych bitów na magistrali I2C
Na rys.17 i 18 pokazano pełny proces przesłania i odbioru dwóch bajtów informacji na magistrali I2C. W
przedstawionych przykładach urządzenie slave posiada adres 0110010B. Wysyłane bajty danych mają wartości:
11001001B i 01011100B, natomiast odbierane bajty z układu slave mają wartości: 01001011B i 10100010B
S
ADRES SLAVE'a 0 A
S
0 1 1 0 0 1 0 0 A
1 2 3 4 5 6 7 8 9
DANE
A
DANE
A
P
1 1 0 0 1 0 0 1 A
0 1 0 1 1 1 0 0 A
P
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
SDA
SCL
Rys.17. Przykład przesyłania dwóch bajtów danych z układu master do układu slave
S
ADRES SLAVE'a 1 A
S
0 1 1 0 0 1 0 1 A
1 2 3 4 5 6 7 8 9
DANE
A
DANE
A
P
0 1 0 0 1 0 1 1 A
1 0 1 0 0 0 1 0 A
P
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
SDA
SCL
Rys.18. Przykład przesyłania dwóch bajtów danych z układu slave do układu master
6. Sterowanie magistralą I2C z wykorzystaniem mikrokontrolera rodziny
MCS-51
Makieta wykorzystywana w niniejszym ćwiczeniu pozwala na obsługę magistrali I2C poprzez
programową generację stanów na liniach SCL i SDA.
Master
P1.0
SDA
SCL
P1.1
P3.2
SDA
Slave
SCL
MCS-51
MPX
DAVN
Rp
Vcc
SAA6588
SCL
SDA
Rp
Rys.19. Schemat blokowy makiety przy programowej generacji sygnałów na magistrali I2C
12
Zastosowany w makiecie mikrokontroler pełni funkcję układu master, dlatego programowa implementacja
transmisji na magistrali I2C będzie omawiana tylko z takiego punktu widzenia. Mając na uwadze informacje
podane w poprzednim punkcie, implementacja protokołu I2C polega na wygenerowaniu warunków START i
STOP oraz przesyłaniu bajtów informacyjnych w kierunku od układu master do układu slave lub odbiorze
informacji z układu slave.
Programowe wygenerowanie wspomnianych warunków jest stosunkowo proste. Warunek START
uzyskuje się przez ustawienie stanu niskiego na linii danych SDA przy linii SCL w stanie wysokim. Stan niski
na linii zegarowej SCL może się pojawić nie wcześniej niż po czasie 4µs (rys.13). Z kolei warunek STOP
generowany jest przez ustawienie linii SDA w stan wysoki przy linii zegarowej SCL w stanie wysokim (rys.13).
W tym wypadku linia SCL musi przejść w stan wysoki, co najmniej 4µs przed generacją wspomnianego
warunku.
Przesyłanie bajtów informacji jest już zadaniem bardziej złożonym jednak również niezbyt
skomplikowanym. Cała trudność polega na fakcie, że bajt informacji jest przesyłany bit po bicie linią SDA
zgodnie z sygnałem zegarowym generowanym na linii SCL. Należy pamiętać, że dany bit informacji jest ważny
na linii SDA tylko podczas stanu wysokiego na linii SCL, natomiast jego zmiana może odbywać się tylko
podczas stanu niskiego na wspomnianej linii. Niezależnie od rodzaju pracy układu master (nadajnik czy
odbiornik) jego zadaniem jest zawsze generowanie sygnału zegarowego.
6.1. Układ master jako nadajnik
W celu przesłania informacji do układu slave, układ master musi w pierwszej kolejności wysłać na
magistralę bajt, w którym 7 najstarszych bitów określa adres układu slave, natomiast najmłodszy bit przyjmuje
wartość 0 sygnalizując, że kolejne bajty będą wysyłane w kierunku od układu master do układu slave (patrz
rys.11 i 17).
Układ master nadając bajt informacji (adresowy czy też danej) do układu slave wystawiania kolejne bity
na linię SDA w takt generowanego sygnału zegarowego na linii SCL. Operacje tą można zrealizować poprzez
zapis całego bajta informacji do rejestru akumulatora mikrokontrolera, a następnie przez operację przesunięcia
logicznego w lewo (na magistralę wysyłane są bity od najstarszego do najmłodszego) rotacyjne przemieszczać
bity z wykorzystaniem znacznika CY. Po każdorazowym przesunięciu, bit znajdujący się w CY należy
przekopiować na linię 0 portu P1 pełniącą rolę linii SDA, po czym ustawić linie SCL (linia 1 portu P1) w stan
wysoki informując przez to układ slave, że bit danej jest do odebrania. Zgodnie z przedstawionymi wcześniej
informacjami, czas trwania stanu wysokiego na linii SCL nie może być mniejszy niż 4µs. Również czas trwania
stanu niskiego na linii SCL podlega ograniczeniom i nie może być mniejszy niż 4,7µs. Po wysłaniu wszystkich
ośmiu bitów danego bajta należy zwolnić linię SDA (poprzez ustawienie jej w stan wysoki) w celu umożliwienia
układowi slave ustawienia wspomnianej linii w stan niski dla potwierdzenia przyjęcia bajta informacji.
START
LBitow = 8
Opóźnienie > 2,4 µs
7
Ustawienie SDA na 1
8
Opóźnienie > 2,4 µs
9
Ustawienie SCL na 1
10
Opóźnienie > 4,0 µs
11
BrakACK = 0
Opóźnienie > 2,4 µs
1
Przesunięcie w lewo w ACC przez CY
Kopia CY na linię SDA
2
Opóźnienie > 2,4 µs
3
Ustawienie SCL na 1
4
Opóźnienie > 4,0 µs
5
BrakACK = 1
Ustawienie SCL na 0
6
Ustawienie SCL na 0
SDA = 0
TAK
12
NIE
STOP
Dekrementacja LBitow
LBitow = 0
13
NIE
TAK
Rys.20. Algorytm wysłania bajta informacji z układu master do układu slave ze sprawdzeniem potwierdzenia z układu slave
przy programowym sterowaniu liniami magistrali I2C
13
Algorytm nadania i sprawdzenia potwierdzenia przyjęcia bajta informacji z układu slave przedstawiono
na rys.20. Zmienna LBitow jest licznikiem bitów pozostałych do wysłania. Jednobitowa zmienna BrakACK
przyjmuje wartość 1, jeśli układ slave nie potwierdził przyjęcia bajta informacji. Dla zwiększenia czytelności
algorytmu, na rys.21 przedstawiono powiązania wyszczególnionych koków z przebiegiem czasowym.
2
2
2
2
8
12
SDA
4
6
4
6
4
6
10
13
SCL
1
3
5
1
3
5
1
3
5
7
9
11
Rys.21. Przebieg czasowy przy przesyłaniu kolejnych bitów bajta informacji na magistrali I2C z odnośnikami do algorytmu z
rys.20
Pamiętając o możliwości wprowadzania przez układ slave stanów oczekiwania, po dokonaniu przejścia
na linii SCL z stanu niskiego w wysoki należy sprawdzić aktualny stan tej linii. Jeśli jest on niski, to układ slave
wprowadził stan oczekiwania. Omawiana operacja może być przeprowadzona za pomocą następujących
instrukcji:
SETB
P1.3
JNB
P1.3,$
Dzięki drugiej instrukcji, dopóki linia SCL jest utrzymywana w stanie niskim przez układ slave, program nie
realizuje dalszych operacji.
6.2. Układ master jako odbiornik
Również przy odbieraniu informacji z układu slave, układ master musi w pierwszej kolejności wysłać na
magistralę bajt, w którym 7 najstarszych bitów określa adres układu slave, natomiast najmłodszy bit przyjmuje
wartość 1 nakazując zaadresowanemu układowi slave przesyłanie bajtów danych w kierunku od układu master
(patrz rys.12 i 18). Ponieważ pierwszy bajt zawierający 7-bitowy adres i bit R/W wysyłany jest w kierunku do
układu slave, dlatego to on generuje bit potwierdzenia, natomiast zadaniem układu master jest jego sprawdzenie.
Przedstawiony wcześniej algorytm przesyłania bajta informacji z układu master do układu slave może więc
zostać zastosowany w tym wypadku.
Kolejne bajty przesyłane są już w kierunku do układu master, więc to jego zadaniem jest generowanie
bitu potwierdzenia (za wyjątkiem ostatniego odebranego bajta, kiedy nie generuje go informując układ slave o
konieczności przerwania transmisji bajtów danych).
START
LBitow = 8
Opóźnienie > 4,7 µs
1
Ustawienie SCL na 1
2
Opóźnienie > 4,0 µs
3
Kopia linii SDA do CY
4
Opóźnienie > 2,4 µs
6
Ustawienie SDA na 0
7
Opóźnienie > 2,4 µs
8
Ustawienie SCL na 1
9
Opóźnienie > 4,0 µs
10
Ustawienie SCL na 0
11
Opóźnienie > 2,4 µs
12
Ustawienie SDA na 1
13
Przesunięcie w lewo w ACC przez CY
Ustawienie SCL na 0
5
Dekrementacja LBitow
LBitow = 0
NIE
STOP
TAK
Rys.22. Algorytm odbierania bajta informacji z układu slave przez układ master z generowaniem potwierdzenia przez układ
master przy programowym sterowaniu liniami magistrali I2C
14
7
13
SDA
2
2
4
4
2
4
9
11
SCL
1
3
5
1
3
5
1
1
3
6
8
10
12
Rys.23. Przebieg czasowy przy odbieraniu kolejnych bitów bajta informacji na magistrali I2C z odnośnikami do algorytmu z
rys.22
Na rys.22 przedstawiono algorytm odczytu pojedynczego bajta informacji wraz z wysłaniem
potwierdzenia. Również tutaj dla zwiększenia czytelności algorytmu, na rys.23 przedstawiono powiązania
wyszczególnionych koków z przebiegiem czasowym.
Zmienna LBitow jest tym razem licznikiem bitów pozostałych do odebrania. Jeśli odbierany jest ostatni
bajt informacji, w algorytmie przedstawionym na rys.14 należy w pozycji 7 ustawiać linię SDA na 1, natomiast
pozycja 13 może zostać usunięta.
7. Sterowanie wyświetlaczem LCD
Do prezentacji informacji tekstowej zastosowano w makiecie wyświetlacz LCD. Sterownik wyświetlacza
komunikuje się z układem nadrzędnym przy wykorzystaniu ośmiu linii danych DB0÷DB7 oraz trzech linii
sterujących: R/W, RS i E. Sterownik wyświetlacza LCD posiada dwa rodzaje pamięci RAM. Pamięć ekranu
(DD RAM) zawiera kody znaków aktualnie wyświetlanych na polu odczytowym. Wyświetlenie znaku na
odpowiedniej pozycji pola odczytowego wyświetlacza LCD polega więc na wpisaniu jego kodu do pamięci DD
RAM. Kody poszczególnych znaków podano w tabeli 4 (dodatek C).
Linia R/W informuje sterownik wyświetlacza o pożądanym kierunku przepływu informacji, tj. zapisie do
sterownika (R/W = 0) lub odczycie ze sterownika(R/W = 1). Na podstawie stanu linii RS sterownik dokonuje
interpretacji samej informacji przy zapisie (R/W = 0) jako:
• rozkaz do wykonania (RS = 0),
• kod znaku do wyświetlenia (RS = 1),
natomiast przy odczycie (R/W = 1) wystawia na szynę danych:
• bajt w którym najstarszy bit informuje o zajętości sterownika, a pozostałe o aktualnym adresie w pamięci
DDRAM lub CGRAM (RS = 0),
• kod znaku z pamięci DD RAM lub CG RAM (RS = 1).
Sterownik wyświetlacza z punktu widzenia mikrokontrolera widziany jest jako komórki zewnętrznej
pamięci danych pod adresem określonym w punkcie 9.3. Zapis i odczyt sterownika wyświetlacza odbywa się
więc tak jak zapis i odczyt zewnętrznej pamięci danych mikrokontrolera. Wejścia RS i R/W wyświetlacza
podłączone są pod dwie linie reprezentujące najmłodsze bity magistrali adresowej systemu. Sterowanie nimi
odbywa się zatem przez odpowiednie ustawienie dwóch najmłodszych bitów adresu podczas operacji
zapisu/odczytu zewnętrznej pamięci danych mikrokontrolera (patrz punkt 9.3). Podczas programowego
odnoszenia się do sterownika wyświetlacza należy zatem odpowiednio modyfikować stany tych dwóch bitów
adresu w zależności od rodzaju realizowanej operacji (np. zapis rozkazu, czy zapis kodu znaku do wyświetlenia)
w celu uzyskania odpowiednich stanów na wejściach RS i R/W sterownika wyświetlacza. Linia E sterowana jest
automatycznie w sposób sprzętowy i ustawienie jej odpowiedniego stanu nie wymaga ingerencji programowej.
W tabeli 6 (dodatek C) przedstawiono rozkazy dostępne przy sterowaniu wyświetlaczem LCD. Do
poprawnej pracy wyświetlacza wymagane jest co najmniej ustawienie: parametrów pracy (ang. Function Set),
sterowania wyświetlaniem (ang. Display on/off Control) i trybu wprowadzania znaków (ang. Entry Mode Set).
Znaczenie poszczególnych bitów wymienionych rozkazów znajduje się również w tabeli 6. Przed wysłaniem
jakiejkolwiek informacji do sterownika wyświetlacza, należy sprawdzić jego gotowość do jej przyjęcia przez
odczytu informacji ze sterownika (przy RS = 0 i R/W = 1) tak długo, aż najstarszy bit oznaczony BF nie
przyjmie wartości 0.
Na rys. 6 (dodatek C) pokazano graficznie adresy odpowiadające poszczególnym pozycjom na polu
odczytowym dla wyświetlacza 2x16. Znak, którego kod zostanie wysłany do sterownika, pojawi się zawsze na
pozycji określonej aktualną zawartością licznika adresu AC sterownika wyświetlacza, a następnie adres ten
zostanie zwiększony lub zmniejszony w zależności od ustawienia bitu I/D rozkazu ustalającego tryb
wprowadzania znaków (ang. Entry Mode Set). Bieżąca wartość licznika adresów AC sterownika wyświetlacza
określa również pozycję, na której znajduje się kursor o ile został on włączony przez ustawienie odpowiedniego
15
bit. Dlatego określenia „adres pozycji znaku”, „adres kursora” i „adres DD RAM” są jednoznaczne. W celu
zmiany zawartości licznika adresu AC, a jednocześnie przemieszczenia kursora na odpowiednią pozycję pola
odczytowego wyświetlacza, należy użyć funkcji ustawiającej adres kursora (ang. Set DDRAM address).
8. Działanie makiety pod kontrolą programu monitora
PAULMON2 jest darmowym programowym monitorem instalowanym w systemach bazujących na
mikrokontrolerach rodziny MCS-51. Umieszczenie opisywanego monitora w pamięci ROM mikrokontrolera
pozwala na wczytywanie programów do pamięci RAM i wykonywanie ich, co jest znacznie wygodniejsze i
szybsze, niż przeprogramowywanie pamięci EPROM.
Do komunikacji z programem monitora można wykorzystać dowolny program pozwalający na
komunikację za pomocą złącza RS-232, np. HyperTerminal. Po uruchomieniu niniejszego programu na
komputerze PC, oraz po wciśnięciu klawisza resetu makiety, monitor wysyła następujący komunikat:
Welcome to PAULMON2 v2.1, by Paul Stoffregen
See PAULMON2.DOC, PAULMON2.EQU and PAULMON2.HDR for more information.
Program Name
List
Single-Step
Memory Editor (VT100)
Location
1000
1400
1800
Type
External command
External command
External command
a następnie pojawia się znak zachęty
PAULMON2 Loc:2000 > _
Wartość 2000 określa adres, na jaki wskazuje wewnętrzny wskaźnik monitora. Jego znajomość jest użyteczna
przy wywoływaniu komend operujących na pamięci systemu.
Poniżej zostaną przedstawione wybrane komendy monitora. Wielkość liter przy wprowadzaniu poleceń
nie ma znaczenia.
8.1. D (ang. Download) – ładowanie programu
Polecenie to pozwala na załadowanie do pamięci RAM systemu mikroprocesorowego pliku z programem
w formacie Intel Hex. W formacie tym zawarte są informacje o adresie, pod który mają być zapisywane kolejne
bajty przesyłanego programu, zatem wewnętrzny wskaźnik pamięci monitora nie jest brany pod uwagę.
Załadowanie programu polega na wciśnięciu klawisza [D], co powoduje wyświetlenie następującej informacji
PAULMON2 Loc:2000 > Download
Begin ascii transfer of Intel hex file, or ESC to abort
Teraz należy z menu Transfer programu TyperTerminal wybrać Wyślij plik tekstowy..., a w otwartym oknie
wskazać miejsce położenia pliku *.hex. Zatwierdzenie wyboru powoduje rozpoczęcie przesyłania danych.
Za każdym razem, kiedy monitor odbierze pojedynczą linię z ładowanego pliku *.hex, na ekranie
zostaje wyświetlona kropka. Jeśli z jakiś powodów konieczne jest przerwanie ładowania programu należy wtedy
wcisnąć klawisz [Esc]. Po zakończeniu ładowania pliku z programem lub gdy ładowanie zostanie przerwane na
życzenie użytkownika, na ekranie pojawia się podsumowanie.
................................................................................
.......................................................
Download completed
Summary:
135 lines received
2084 bytes received
2084 bytes written
No errors detected
Jeśli po wykonaniu polecenia wczytania pliku w informacji podsumowującej monitora raportowane są
błędy o braku możliwości zapisu
16
Summary:
246 lines received
3834 bytes received
630 bytes written
Errors:
3204 bytes unable to write
to oznacza, że plik HEX został odebrany poprawnie, jednak obszar pamięci wyspecyfikowany w kolejnych
rekordach zawartych w pliku jest tylko do odczytu.
W przypadku odebrania przez monitor danych o niepoprawnym formacie zostanie wyświetlone
podsumowanie podobne do poniższego.
Summary:
3 lines received
62 bytes received
62 bytes written
Errors:
1 bad checksums
2 unexpected begin of line
17 unexpected hex digits
2 unexpected non hex digits
8.2. J (ang. Jump) – skocz pod określony adres w pamięci
Polecenie to pozwala na przejście do wykonywania wczytanego wcześniej programu użytkownika. Po
wciśnięciu klawisza [J] pojawi się napis
PAULMON2 Loc:2000 > Jump to memory location
Jump to memory location (2000), or ESC to quit: _
W tym momencie należy wprowadzić wartość adresu, od którego został umieszczony program. Po wpisaniu
ostatniego (czwartego) znaku na ekranie pojawi się napis
running program:
_
informując o rozpoczęciu wykonywania programu użytkownika.
Przed przejściem pod wyspecyfikowany adres program monitora odkłada na stosie wartość 0000H, zatem
programy, które kończą się instrukcją RET powodują ponowne wywołanie programu monitora. Jeśli program
działa w nieskończonej pętli, to jedyną możliwością powrotu do programu monitora jest reset mikrokontrolera.
9. Wiadomości dodatkowe
9.1. Konfiguracja przestrzeni adresowej makiety
monitor EPROM
program RAM:
dane RAM:
obszar wspólny dla programu i danych:
0000h÷1FFFh,
2000h÷F7FFh,
0000h÷F7FFh,
2000h÷F7FFh.
9.2. Adresu układów na magistrali I2C
Adres układu SAA6588
0001000B
9.3. Adresy innych układów
Adres bazowy sterownika LCD
F800H
F
1
1
8
1
1
1
0
0
0
0
0
17
0
X
0
0
0
0
RW RS
hex
bin
RW
RS
0: zapis informacji,
1: odczyt informacji.
0: informacja jest rozkazem
1: informacja jest kodem znaku do wyświetlenia.
10. Literatura
[1] Bem D.J., Janiszewski J., Zieliński R.: “Automatyzacja odbioru w radiofonii UKF-FM”. Radioelektronik
Audio-HiFi-Video, nr 5, maj 1988.
[2] „The I2C Bus Specification” Philips Semiconductor. Version 2.1, January 2000.
[3] Jabłoński T.: „Dekoder RDS”. Elektronika Praktyczna, 12/2000, 1/2001.
[4] Rydzewski A.: „Mikrokomputery jednoukładowe”. WNT, Warszawa 1992.
[5] Sagan K.: „Opis systemu RDS”. http://radiopolska.bydnet.pl/rds/
[6] Starecki T.: „Mikrokontrolery jednoukładowe rodziny 51”. NOZOMI, Warszawa 1996.
[7] Kernighan W., Ritchie D.M.: „ANSI C”. WNT, Warszawa 1992.
[8] Beach M.: „C51 Primer”. Hitex (UK) Ltd.
[9] Zbysiński P.: „Stereofoniczny tuner FM”. Elektronika Praktyczna, 8/2000.
18
A
B
C
D
COM1
J2
COM0
J1
1
1
5
9
4
8
3
7
2
6
1
5
9
4
8
3
7
2
6
1
GND
GND
C3
1uF
1
3
13
8
14
7
6
C1
1uF
GND
MAX232
C1+
C1-
R1 IN
R2 IN
T1 OUT
T2 OUT
V-
U1
V+
2
8,664MHz
X2
C2+
C2-
R1 OUT
R2 OUT
T1 IN
T2 IN
C7
47pF
2
100nF
C9
1k
R4
C8
82pF
4
5
12
9
11
10
2
+5V
C4
1uF
10R
R5
C2
1uF
DAVN
SDA
SCL
3
+5V
3
1
2
3
4
5
6
7
8
9
10
C5
24pF
10R
R6
LVIN
CIN
SCOUT
VREF
MPX
VSSA
VDDA
AFIN
MAD
PCWN
RxD0
RxD1
TxD0
TxD1
C6
24pF
GND
SAA6588
MRO
MPTH
TCON
OSC0
OSC1
VSSD
VDDD
DAVN
SDA
SCL
U6
GND
12MHz
X1
20
19
18
17
16
15
14
13
12
11
5V
C12
100nF
4
C10
560pF
RxD0
TxD0
DAVN
SDA
SCL
RxD1
TxD1
CLCK
DATA
WREN
STEREO
4
C11
2,2uF
C13
330pF
S3
10k
S2
10k
R3
S1
ALE
PSEN
P3.6/WR
P3.7/RD
EA
(A8)P2.0
(A9)P2.1
(A10)P2.2
(A11)P2.3
(A12)P2.4
(A13)P2.5
(A14)P2.6
(A15)P2.7
(AD0)P0.0
(AD1)P0.1
(AD2)P0.2
(AD3)P0.3
(AD4)P0.4
(AD5)P0.5
(AD6)P0.6
(AD7)P0.7
DS80C320MCG
P3.0/RXD0
P3.1/TXD0
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P1.0/T2
P1.1/T2EX
P1.2/RXD1
P1.3/TXD1
P1.4/INT2
P1.5/INT3
P1.6/INT4
P1.7/INT5
RST
X1
X2
U2
10k
R2
R1
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
19
18
A8
A9
A10
A11
A12
A13
A14
A15
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
5
7
3
4
5
6
12
+5V
WREN
CLCK
STEREO
DATA
GND
30 GND
29
16
17
31
21
22
23
24
25
26
27
28
39
38
37
36
35
34
33
32
5
1
2
3
4
5
6
7
8
9
11
OM5610
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
+12V
GAL16V8D
IN 0/CLK
IN 1
IN 2
IN 3
IN 4
IN 5
IN 6
IN 7
IN 8
IN 9/OE
U5
74HCT573
LE
OE
D0
D1
D2
D3
D4
D5
D6
D7
U3
ANT
ANT GND
WREN
CLCK
STEREO AUDIO L
DATA
AUDIO R
MPX
2
3
4
5
6
7
8
9
11
1
GND
+5V
U7
A15
A14
A13
A12
A11
A10
A9
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
11
9
6
+12V
13
14
8
IO 0
IO 1
IO 2
IO 3
IO 4
IO 5
IO 6
IO 7
19
18
17
16
15
14
13
12
6
12
13
14
15
16
17
18
19
A0
A1
A2
A3
A4
A5
A6
A7
GND
J3
WY AUDIO
ANTENA
Date:
File:
A3
Size
Title
WYŚWIETLACZ LCD
U4
LCD DISPLAY
7
RS
R/W
E
4
5
6
Revision
8
1.0
13-Sep-2004
Sheet of
D:\Moje dokumenty\OAP\Instrukcje do makiet\Instr
Drawn By:
Radio\Schemat\TunerRDS.ddb
7
8
Number
Tuner radiowy z RDS
AD0
AD1
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
7
8
9
10
11
12
13
14
D0
D1
D2
D3
D4
D5
D6
D7
A
B
C
D

Podobne dokumenty