|
Projekt testera unilink
Unilink jest to system komunikacji między tunerem a innymi urządzeniami systemu nagłośnienia samochodu, opracowany i stosowany przez firmę SONY. Najczęściej
jest wykorzystywany do sterowania zmieniarkami CD umieszczonymi w bagażniku samochodu. W przypadku uszkodzenia jednego z urządzeń zachodzi konieczność
wymontowania przynajmniej jednego sprzętu i sprawdzenia go w warunkach warsztatowych. Jeśli usterka nie występuje w tym sprzęcie trzeba wymontować
drugi. Zaprojektowany przeze mnie tester umożliwia szybsze stwierdzenie, w którym urządzeniu tkwi przyczyna. Można
już w warsztacie sprawdzić działanie
sterownika w radiu, jeśli nie mamy zmieniarki. Tunery z funkcją obsługi zewnętrznej zmieniarki mają wejścia do podłączenia sygnału audio.
Nie można go jednak wykorzystać do podłączenia innych źródeł sygnału, takich jak np. odtwarzacz MP3, discmen, itp. Wynika to stąd, iż funkcja ta jest nie aktywna,
jeśli do szyny unilink nie jest podpięte żadne urządzenie. Podłączenie mojego testera umożliwi
wykorzystanie tego wejścia dla własnych celów, gdyż sterownik stwierdzi obecność zmieniarki i uaktywni wejście. Na wyświetlaczu będzie wyświetlany
numer płyty, numer utworu oraz czas trwania utworu, który generowany
jest przez tester.
Krótki opis systemu
- poziomy sygnałów zgodne z TTL 0V(LOW) 5V(HIGH)
- jest tylko jeden układ nadrzędny (MASTER)
-szyna unilink ma trzy sygnały: BUS, DATA i CLOCK
złącze posiada jeszcze dodatkowe przewody, przez które mogą być przesyłane pomocnicze sygnały oraz zasilanie.
Szyna znajduje się zawsze w jednym z trzech stanów:
- off
- BUS ON = 0 CLOCK i DATA są nie aktywne
- idle - BUS
ON = 1 CLOCK = 0, DATA 8ms low następnie 8ms high
Przebiegi sygnałów data (A) i clock (B) dla stanu idle
- aktywny - BUS ON =
1 przebieg, tak jak w idle, przedzielony okresami przesyłania
danych
Przebiegi sygnałów data (A) i clock (B) dla stanu aktywny
Wygląd oraz rozmieszczenie pinów w złączu przedstawia
poniższy rysunek

Złącze unilink
Transmisja danych jest synchronizowana sygnałem zegara nadawanym przez master. Zmieniarka (slave) jest, co jakiś czas,
„odpytywana” przez master odnośnie stanu jej pracy oraz, w zależności od odpowiedzi, o inne parametry. Jeśli slave chce pilnie przesłać
dane do master komunikuje to przez wymuszenie stanu niskiego podczas trwania wysokiego stanu w cykli idle. Ponieważ do szyny może być podłączonych
kilka różnych układów slave, każdy z nich ma inne okienko czasowe, w którym może sygnalizować żądanie obsługi przez master.

Sposób zgłaszania żądania obsługi przez slave (C)
Formaty danych
krótkie słowo
RAD|TAD|CMD1|CMD2|Parity| Error
Średnie słowo
RAD|TAD|CMD1|CMD2|Parity|D1|D2|D3|D4|Parity2| Error
długie słowo
RAD|TAD|CMD1|CMD2|Parity|D1|D2|D3|D4|D2_1|D2_2|D2_3|D2_4|D2_5|Parity2| Error
gdzie:
RAD - adres odbiorcy
TAD - adres urządzenia nadającego
CMD1 - pierwsze bajty komendy
CMD2 - uzupełniające bajty komendy
Parity
- bajt parzystości
Wartość
bajtu parzystości jest sumą wszystkich wcześniejszych bajtów
D1-D2_4 - dodatkowe bajty komendy w słowie średnim i długim
Error - bajt błędu, jeśli nie ma błędu
00
W adresie cztery wyższe bity zależą od rodzaju urządzenia natomiast cztery młodsze są nadawane przez master podczas cyklu nawiązywania
transmisji po resecie zestawu.
Przyporządkowanie adresów poszczególnym urządzeniom
Grupy IDs:
0x3 CD odtwarzacz/zmieniarka
0x5 Tuner
0x6 Odtwarzacz kasetowy
0x7 Wyświetlacz
0xc Zegar
0xD MD odtwarzacz/zmieniarka
Inne:
0x11 - Klawiatura
0x21 - Keypad(Controll)
0x91 - DSP(Vol,Tone,etc)
Specjalne adresy:
0x10
Master
0x18 Broadcast ?
Każde słowo danych nadawane przez master zaczyna się po wysokim stanie idle, niskim stanem
trwającym przez 3 ms, następnie pojawia się pierwszy impuls sygnału zegarowego, a na szynie danych są ustawiane stany bitów danych. Odczyt danych
następuje przy opadającym zboczu sygnału zegarowego. Czas trwania niskiego stanu na początku słowa rozkazu jest zawsze równy 3ms. Częstotliwość
sygnału zegarowego jest różna dla poszczególnych typów sterowników. Nie znam wartości granicznych przewidywanych przez specyfikację systemu. Przykładowe
zmierzone zamieściłem na poniższym rysunku.

Budowa słowa danych nadawanego przez master
Po nadaniu słowa rozkazu master, jeśli oczekuje odpowiedzi od slave, wysyła po okresie kilku milisekund sygnał
zegarowy. W odpowiedzi slave wysyła dane na szynę, które są odbierane przez master.
W systemie unilink można teoretycznie sterować do stu zmieniarek lub innych urządzeń tego typu. Aby to było możliwe po starcie, system przeprowadza
procedurę inicjalizacji, w czasie której master sprawdza, ile i jakich urządzeń jest z nim połączonych.
Poniżej zamieściłem dwa rysunki. Pierwszy przedstawia teoretyczny cykl
inicjalizacji systemu, oparty na materiałach firmy Sony. Drugi natomiast
dane odczytane z szyny po resecie tunera, z podłączonym moim urządzeniem.

Procedura inicjalizacji z materiałów firmy SONY
18 10 01 00 29 00 00
18 10 01 02 2B 00 00
18 10 01 02 2B 00 00
18 10 01 02 2B 00
10 30 8C 41 0D 25 A8 00 00 DA 00
31 10 02 14 57 00
10 31 8C 41 0E 24 A8 00 00 DA 00
18 10 01 04 2D 00 00
18 10 01 02 2B 00 00
18 10 01 02 2B 00 00
18 10 01 02 2B 00 00
18 10 01 03 2C 00 00
18 91 8C 00 35 00 0D C0 0C 0E 00 00
18 21 8C 00 C5 01 0D 00 00 D3 00 00
18 71 8C 00 15 80 01 08 01 9F 00 00
18 71 8D 06 1C 06 11 00 00 33 00 00
18 C1 8C 00 65 00 04 00 00 69 00 00
18 61 8C 00 05 04 00 60 00 69 00 00
18 51 8C 06 FB 84 E3 80 02 E4 00 00
18 51 8D 10 06 00 00 00 00 06 00 00
18 10 8C 00 B4 01 00 00 00 B5 00 00
Procedura inicjalizacji odbiornika XR-CA410 z przystawką
Opis wykonania
Projekt został wykonany w oparciu o mikrokontroler firmy ATMEL AT89C4051 z kilkoma
elementami dyskretnymi koniecznymi do jego pracy. Napięcie konieczne do jego pracy jest uzyskiwane ze stabilizatora 5V, zasilanego z tunera poprzez kabel
unilink. Wejścia są zabezpieczone diodami zenera a całość została zmontowana na płytce uniwersalnej i umieszczona w zamkniętej obudowie ze
standartowym złączem systemu unilink.

Schemat testera
Program procesora
Program został napisany w asemblerze,
a jego główne procedury to:
- odbiór danych
- nadawanie danych
;******************************************************************************
;* Odbiór danych z szyny "DATA" *
;******************************************************************************
Clock: PUSH ACC ; akumulator na stos
CLR TR1 ; timer "1" zatrzymany
MOV A,Dane ; Zapis bajtu do akumulatora
RL A ; przesuń akumulator w lewo
JB DataIn,Clock1 ; skocz jeśli jedynka
ORL A,#01h ; dodaj 01h do akumulatora
Clock1: ;
MOV Dane,A ; zapisz zawartość akumulatora
DEC BitCount ; odejmij jeden od licznika bitów
MOV A,BitCount ; licznik bitów do akumulatora
JZ ReadData ; jeśli akumulator zero skok
POP ACC ; pobierz ze stosu zawartość akumulatora
RETI ; wyjście z obsługi przerwania
;
;******************************************************************************
;* Jeden Bajt Danych jest kompletny *
;******************************************************************************
ReadData: MOV @R1,Dane ; zapis bajtu do bufora na pozycje @R1
CJNE R1,#Bufor,ReadData1 ; porównaj R1 i Bufor i skocz jeśli różne
CJNE @R1,#00h,ReadData1 ; skocz jeśli bajt o adresie R1 nie 00h
JMP ReadData3 ; skok
;
ReadData1:INC R1 ; zwiększ licznik bajtów
;
ReadData3:MOV Dane,#00h ;
MOV BitCount,#08h ; licznik bitów
MOV TL1,#1Eh ; ustawianie timera
MOV TH1,#0EDh ;
SETB TR1 ; timer "1" start
POP ACC ;
RETI ; wyjście z obsługi przerwania
Listing podprogramu odczytu bajtu z szyny
;******************************************************************************
;* Nadawanie polecenia na UniLink-Bus *
;******************************************************************************
SendB: ANL TCON,#10101111B ; Zatrzymanie timerów
CLR EA ; Przerwania wylączone
ANL Status,#0FCh ; ustawienie statusu
MOV A,#00h ;
MOVC A,@A+DPTR ; zapisz do akumulatora bajt z adresu @A+DPTR
MOV R2,A ; Liczba przesyłanych bajtow
MOV R4,#00h ; Liczba wysłanych bajtow
MOV R5,#00h ; parzystość
SendB2: INC DPTR ; zieksz o jeden rejestr
MOV A,#00h ;
MOVC A,@A+DPTR ;
SendB6: MOV R3,#08h ; ustaw licznik bitów
SendB3: JB ClockIn,SendB3 ; czekaj dopóki zegar "H"
JNB ACC.7,SendBH ; skok jeśli bit 7 akumulatora "0"
CLR DataOut ; ustaw port wyjścia DataOut na "L"
JMP SendB4 ;
SendBH: SETB DataOut ; ustaw port na "H"
SendB4: JNB ClockIn,SendB4 ; czekaj na "H" zegara
RL A ; obrót akumulatora
DJNZ R3,SendB3 ; zmniejsz licznik bitów
Czas5s: MOV R7,#0Ah ; Opóźnienie aż master zacznie czytać
Czas51: DJNZ R7,Czas51 ;
SETB DataOut ;
INC R4 ;
DJNZ R2,SendB2 ;
MOV Dane,#00h ;
MOV BitCount,#08h ; licznik bitów
MOV TL1,#1Eh ; Ustawienie timera "1"
MOV TH1,#0EDh ;
CLR IE0 ; Przerwanie zewnętrzne "0" zerowanie flagii
SETB EA ; Wlączenie przerwań
ORL TCON,#01010000B ; Start timerów
RET ; wyjscie z poprogramu
SendBC: ANL TCON,#10101111B ; Zatrzymanie timerów
CLR EA ;
MOV R2,#01h
CJNE R4,#04h,Parity ; pomiń jeśli parzysty
JMP SendB6
Parity: XCH A,R5
ADD A,R5 ; aktualizacja parzystości
XCH A,R5
JMP SendB6
Listing podprogramu nadawania bajtu na szynę
Odbiór danych jest realizowany jako obsługa przerwania zewnętrznego INT0.
Następnie odbiór
poszczególnych bitów jest synchronizowany poziomem zewnętrznego sygnału zegarowego, nadawanego przez master. Po odebraniu pełnego bajtu program
powraca do oczekiwania na kolejny bajt rozkazu. Nadawanie jest realizowane jako podprogram z inicjatywy programu głównego, jeśli zostaną spełnione warunki
np. odliczenie czasu lub konieczność odpowiedzi na polecenie master. Przesyłanie informacji o czasie powoduje konieczność wyliczenia bajtów
parzystości, dlatego nadawanie czasu zaczyna się od etykiety "SendBC". Ze względu na synchronizację zewnętrznym zegarem obie procedury muszą trwać
krócej niż okres tego sygnału, co przy częstotliwości kwarcu 20 MHz udało się zrealizować.
Odebrane bajty są przechowywane w buforze od adresu 70h pamięci
RAM do czasu zakończenia odbierania rozkazu. Następnie program odczytuje kolejne bajty sprawdzając przede wszystkim, czy odebrana komenda została
zaadresowana do niego. Jeśli tak, to z bufora są odczytywane kolejne bajty a następnie
wykonywane jest polecenie. Rozkazy, jakie urządzenie przesyła do master
podczas procedury inicjalizacji oraz inne standartowe, są umieszczone jako tabela w pamięci programu na samym końcu programu.
Listing testera
Unilink
Schemat
Linki do stron o systemie unilink
http://www.cus.org.uk/~cleggy/protocol.htm
http://users.ntplx.net/~andrew/unilink/unilink
http://members.home.nl/r.aerts/unilink.htm
http://gnunilink.sourceforge.net
do góry
|