Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Interfejs TPI zapewnia dostęp do narzędzi programowania. Składa się on z dwóch warstw: warstwy dostępu oraz warstwy fizycznej, co ilustruje poniższy rysunek:
Programowanie wykonywane jest poprzez fizyczny interfejs, który składa się z trzech końcówek mikrokontrolera z wykorzystywaniem końcówki RESET jako uaktywnienia, końcówki TPICLK jako wejścia zegarowego oraz końcówki TPIDATA jako wejścia i wyjścia danych. Pamięci nieulotne można programować tylko przy zasilaniu mikrokontrolera napięciem 5V.
Dostęp do TPI następuje poprzez trzy następujące końcówki:
RESET:
Wejście uaktywniające interfejs programowania TPICLK: Wejście zegara dla interfejsu TPI TPIDATA: Wejście/wyjście danych dla interfejsu TPI |
Dodatkowo końcówki VCC i GND muszą być połączone pomiędzy zewnętrznym programatorem a mikrokontrolerem, jak na poniższym rysunku:
Następująca sekwencja uaktywnia interfejs TPI (zobacz na rysunek poniżej):
Sekwencja
uaktywniania interfejsu TPI
Zakładając, iż bit uaktywniający NVM został wcześniej wyzerowany, interfejs TPI jest automatycznie wyłączany, gdy końcówka RESET zostanie zwolniona w nieaktywny stan wysoki lub alternatywnie 12V przestanie być przykładane do końcówki RESET . Jeśli bit uaktywniający NVM nie został wcześniej wyzerowany, to wymagane jest wyłączenie zasilania w celu wyjścia z trybu programowania TPI. Zobacz na opis bitu NVMEN w rejestrze TPISR.
Warstwa fizyczna TPI obsługuje ustalony format ramki. Ramka składa się z jednego znaku o długości 8 bitów, jednego bitu startowego, bitu parzystości oraz dwóch bitów stopu. Dane są przesyłane od najmniej znaczącego bitu.
Symbole używane na powyższym rysunku:
IDLE: stan nieaktywny, wysoki ST: bit startowy (ang. start bit), zawsze o stanie niskim D0-D7: kolejne bity danych od najmłodszego (ang. data bits) P: bit parzystości (ang. parity bit) SP1: bit stopu nr 1 (ang. stop bit), zawsze o stanie wysokim SP2: bit stopu nr 2 (ang. stop bit), zawsze o stanie wysokim IDLE/ST: stan nieaktywny albo bit startowy następnej ramki |
Bit parzystości jest obliczany z bitów danych za pomocą funkcji logicznej suma modulo dwa (ang. exclusive-or) zgodnie ze wzorem:
gdzie:
P: bit parzystości
D0-D7: bity danych znaku
Znak BREAK (przerwa) jest równy 12 bitom o stanie niskim. Można go rozszerzyć poza długość 12 bitów.
Znak IDLE (bezczynność) jest równy 12 bitom o stanie wysokim. Można go rozszerzyć poza długość 12 bitów.
Warstwa fizyczna TPI działa synchronicznie wg zegara TPICLK dostarczanego przez zewnętrzny programator. Zależność pomiędzy zboczami sygnału zegarowego a próbkowaniem danych lub zmianą danych pokazuje rysunek poniżej. Dane są zmieniane przy zboczach opadających, a próbkowane przy zboczach narastających.
Warstwa fizyczna TPI obsługuje dwa tryby pracy: Nadawanie i Odbieranie. Standardowo warstwa jest w trybie odbiorczym, oczekując na bit startowy. Tryb pracy jest kontrolowany przez warstwę dostępu.
Gdy warstwa fizyczna TPI znajduje się w trybie odbiorczym, przyjmowanie danych rozpoczyna się po wykryciu bitu startowego. Każdy bit następujący po bicie startowym będzie próbkowany przy narastającym zboczu sygnału zegarowego TPICLK i przesuwany do rejestru przesuwającego aż do otrzymania drugiego bitu stopu. Gdy w rejestrze przesuwającym znajdzie się kompletna ramka, odebrane dane staną się dostępne dla warstwy dostępowej TPI. Są trzy możliwe wyjątki w trybie odbiorczym: błąd ramki, błąd parzystości oraz wykrycie przerwania. Wszystkie te wyjątki są sygnalizowane warstwie dostępowej TPI, która następnie wchodzi w stan błędu i przełącza warstwę fizyczną TPI w stan odbiorczy, oczekując znaku BREAK.
Gdy warstwa fizyczna TPI jest gotowa do wysłania nowej ramki,
rozpoczyna transmisję przez załadowanie rejestru przesuwającego
danymi do wysłania. Gdy rejestr ten zostanie załadowany nowymi
danymi, to nadajnik przesuwa w nim bity i wysyła jedną kompletna
ramkę linią TPIDATA z szybkością ustaloną przez zegar TPICLK.
Jeśli podczas transmisji zostanie wykryta kolizja, to sterownik
wyjścia zostaje zablokowany. Warstwa dostępowa TPI wchodzi w
stan błędu, a warstwa fizyczna TPI zostaje przełączona w tryb
odbiorczy, oczekując na znak BREAK.
Warstwa fizyczna TPI używa pojedynczej, dwukierunkowej linii danych zarówno do przesyłania jak i odbioru. Może wystąpić konflikt, jeśli zewnętrzny programator oraz warstwa fizyczna TPI sterują jednocześnie linią TPIDATA. Aby zredukować efekt tego konfliktu, obsługiwany jest mechanizm wykrywania kolizji, który jest oparty na sposobie sterowania linią TPIDATA przez warstwę fizyczną TPI.
Linia TPIDATA jest sterowana przez trójstanowy, przeciwsobny układ z wewnętrznym podciąganiem (ang. tri-state, push-pull driver with internal pull-up). Układ wyjściowy jest zawsze włączany, gdy przesyłane jest logiczne 0 (aby wysterować w stan niski linię TPIDATA). Gdy przesyłane są logiczne jedynki, wyjście jest aktywnie sterowane tylko w pierwszym cyklu zegarowym. Potem układ wyjściowy przechodzi automatycznie w stan wysokiej impedancji, a linia TPIDATA jest utrzymywana w stanie wysokim przez wewnętrzne podciąganie (ang. pull-up). Wyjście zostaje ponownie włączone przy przesyle następnego zera.
Wykrywanie kolizji jest włączane w trybie nadawania, gdy układ wyjściowy został wyłączony. Linia danych powinna teraz być utrzymywana w stanie wysokim przez wewnętrzne podciąganie, a to jest monitorowane, aby wykryć, czy linia transmisyjna nie została wysterowana w stan niski przez zewnętrzny programator. Jeśli wyjście znajdzie się w stanie niskim, wykryta zostanie kolizja.
Istnieje kilka potencjalnych pułapek związanych ze sposobem wykonywania wykrywania kolizji. Na przykład, kolizji nie można wykryć, jeśli warstwa fizyczna TPI przesyła strumień kolejnych zer logicznych, albo strumień naprzemiennych jedynek i zer. Dzieje się tak, ponieważ układ wyjściowy jest aktywny przez cały czas, zapobiegając przeglądaniu stanu linii TPIDATA. Jednakże w pojedynczej ramce dwa bity stopu powinny zawsze być transmitowane jako logiczne jedynki, co włączy wykrywanie kolizji przynajmniej jeden raz na ramkę (o ile format ramki nie został naruszony, jeśli chodzi o bity stopu).
Fizyczna warstwa TPI przerwie transmisję, gdy wykryje kolizję na linii TPIDATA. Kolizja zostanie zasygnalizowana warstwie dostępowej TPI, która natychmiast przełączy warstwę fizyczną w tryb odbiorczy i przejdzie do stanu błędu. Warstwa dostępowa TPI może być wyprowadzona ze stanu błędu tylko przez przesłanie znaku BREAK.
Aby zapewnić poprawny czas wykonania operacji
pół-dupleksowej, do warstwy fizycznej został dodany prosty
mechanizm ochrony czasu. Gdy fizyczna warstwa TPI zmienia tryb z
odbierania na nadawanie, to przed wysłaniem bitu startowego
wstawiana jest konfigurowalna liczba dodatkowych bitów
bezczynności (o stanie wysokim).
Minimalny czas przejścia pomiędzy trybami odbioru i nadawania
wynosi dwa bity bezczynności. Całkowity czas bezczynności jest
sumą określonego czasu ochronnego plus dwa bity bezczynności.
Czas ochronny jest konfigurowany przez przydzielone mu bity w
rejestrze TPIPCR register. Standardowy czas ochronny po
inicjalizacji warstwy fizycznej wynosi 128 bitów.
Zewnętrzny programator traci kontrolę nad linią TPIDATA, gdy docelowe urządzenie TPI zmienia tryb odbiorczy na nadawanie. Czas ochronny ułatwia wykonanie tej krytycznej fazy komunikacji. Gdy zewnętrzny programator zmienia tryb odbiorczy na nadawanie, co najmniej jeden bit bezczynności powinien być wstawiony przed wysłaniem bitu startu.
Warstwa dostępowa TPI steruje kierunkiem przesyłania znaków w warstwie fizycznej TPI. Zajmuje się również wychodzeniem ze stanu błędu po wystąpieniu wyjątku.
Obszar sterowania i stanu (ang. Control and Status Space, CSS) interfejsu TPI jest przydzielony dla rejestrów sterowania i stanu w warstwie dostępowej TPI. Obszar CSS składa się z rejestrów bezpośrednio zaangażowanych w funkcjonowaniu samego interfejsu TPI. Rejestry te są dostępne poprzez instrukcje SLDCS i SSTCS.
Warstwa dostępowa może również mieć dostęp do obszaru danych, albo bezpośrednio, albo pośrednio przez użycie rejestru wskaźnikowego (ang. Pointer Register, PR) jako wskaźnika adresu. Obszar danych jest dostępny poprzez instrukcje SLD, SST, SIN i SOUT. Wskaźnik adresu może zostać umieszczony w rejestrze wskaźnikowym przy pomocy instrukcji SSTPR.
Każda wiadomość zawiera instrukcję, za którą następuje jeden lub więcej argumentów. Instrukcja ta jest zawsze wysyłana przez zewnętrzny programator. Zależnie od instrukcji wszystkie następne argumenty są wysyłane albo przez zewnętrzny programator, albo przez interfejs TPI.
Wiadomości można podzielić na dwa rodzaje na podstawie zawartych w nich instrukcji:
Wszystkie instrukcje z wyjątkiem instrukcji SKEY wymagają następstwa jednego bajtowego argumentu. Instrukcja SKEY wymaga 8 bajtowych argumentów.
Kilka sytuacji jest uważane za wyjątki od normalnej pracy interfejsu TPI. Gdy warstwa fizyczna TPI jest w trybie odbiorczym, wyjątkami są:
Gdy warstwa fizyczna TPI jest w trybie nadawczym, możliwym wyjątkiem jest:
Wszystkie te wyjątki są sygnalizowane do warstwy dostępowej TPI. Warstwa dostępowa odpowiada na wyjątek przez przerwanie bieżącej operacji w toku i wejście w stan błędu. Następnie pozostaje w tym stanie błędu aż do odebrania znaku BREAK, po którym przechodzi w stan standardowy. W konsekwencji zewnętrzny programator zawsze może zsynchronizować protokół po prostu przez wysłanie dwóch kolejnych znaków BREAK.
Mnemonik | Argument | Opis | Działanie |
SLD | data, PR | Szeregowy odczyt z obszaru danychz użyciem adresowania pośredniego | data ← DS[PR] |
SLD | data, PR+ | Szeregowy odczyt z obszaru danych z użyciem adresowania pośredniego z postinkrementacją | data ← DS[PR] PR ← PR+1 |
SST | PR, data | Szeregowy zapis do obszaru danych z użyciem adresowania pośredniego | DS[PR] ← data |
SST | PR+, data | Szeregowy zapis do obszaru danych z użyciem adresowania pośredniego z postinkrementacją | DS[PR] ← data PR ← PR+1 |
SSTPR | PR, a | Szeregowy zapis do rejestru wskaźnikowego z użyciem adresowania bezpośredniego | PR[a] ← data |
SIN | data, a | Szeregowy odczyt z obszaru we/wy | data ← I/O[a] |
SOUT | a, data | Szeregowy zapis do obszaru we/wy | I/O[a] ← data |
SLDCS | data, a | Szeregowy odczyt z obszaru sterowania i stanu z użyciem adresowania bezpośredniego | data ← CSS[a] |
SSTCS | a, data | Szeregowe zapis do obszaru sterowania i stanu z użyciem adresowania bezpośredniego | CSS[a] ← data |
SKEY | Key, {8{data}} | KLUCZ | Key ← {8{data}} |
Instrukcja SLD wykorzystuje adresowanie pośrednie, aby załadować dane z obszaru danych (ang. data space, DS) do rejestru przesuwającego warstwy fizycznej TPI w celu ich szeregowego odczytu. Komórka w obszarze danych wskazywana jest przez rejestr wskaźnikowy (PR), w którym odpowiedni adres należy umieścić przed dostępem do danych. Rejestr wskaźnikowy jest albo pozostawiany bez zmian przez operację, albo zostaje zwiększony o 1, jak pokazano w poniższej tabeli:
Operacja | Kod instrukcji | Uwagi | Rejestr |
data ← DS[PR] | 0010 0000 | PR ← PR | Bez zmiany |
data ← DS[PR] | 0010 0100 | PR ← PR + 1 | Postinkrementacja |
Instrukcja SST wykorzystuje adresowanie pośrednie, aby zapisać odczytany szeregowo bajt z rejestru przesuwającego warstwy fizycznej TPI do obszaru danych (ang. data space, DS). Komórka w obszarze danych wskazywana jest przez rejestr wskaźnikowy (PR), w którym odpowiedni adres należy umieścić przed dostępem do danych. Rejestr wskaźnikowy jest albo pozostawiany bez zmian przez operację, albo zostaje zwiększony o 1, jak pokazano w poniższej tabeli:
Operacja | Kod instrukcji | Uwagi | Rejestr |
DS[PR] ← data | 0110 0000 | PR ← PR | Bez zmiany |
DS[PR] ← data | 0110 0100 | PR ← PR + 1 | Postinkrementacja |
Instrukcja SSTPR umieszcza szeregowo odczytany bajt danych z rejestru przesuwającego warstwy fizycznej TPI w rejestrze wskaźnikowym (ang. Pointer Register, PR). Bit adresowy w instrukcji określa, do którego bajtu rejestru wskaźnikowego trafią dane.
Operacja | Kod instrukcji | Uwagi |
PR[a] ← data | 0110 100a | Bit 'a' adresuje bajt w rejestrze wskaźnikowym |
Instrukcja SIN ładuje bajt z obszaru we/wy do rejestru przesuwającego warstwy fizycznej TPI w celu jego szeregowego odczytu. Instrukcja używa adresowania bezpośredniego, w którym adres zawarty jest w 6 bitach instrukcji.
Operacja | Kod instrukcji | Uwagi |
data ← I/O[a] | 0aa1 aaaa | Bity oznaczone jako 'a' tworzą 6-bitowy adres we/wy |
Instrukcja SOUT umieszcza odczytany szeregowo bajt z rejestru przesuwającego warstwy fizycznej TPI w obszarze we/wy. Instrukcja używa adresowania bezpośredniego, w którym adres zawarty jest w 6 bitach instrukcji.
Operacja | Kod instrukcji | Uwagi |
I/O[a] ← data | 1aa1 aaaa | Bity oznaczone jako 'a' tworzą 6-bitowy adres we/wy |
Instrukcja SLDCS ładuje bajt z obszaru sterowania i stanu interfejsu TPI do rejestru przesuwającego warstwy fizycznej TPI w celu jego szeregowego odczytu. Instrukcja SLDCS używa adresowania bezpośredniego, adres tworzą 4 bity zawarte w kodzie instrukcji.
Operacja | Kod instrukcji | Uwagi |
data ← CSS[a] | 1000 aaaa | Bity oznaczone jako 'a' tworzą 4-bitowy adres |
Instrukcja SLDCS zapisuje odczytany szeregowo bajt z rejestru przesuwającego warstwy fizycznej TPI do obszaru sterowania i stanu interfejsu TPI. Instrukcja SSTCS używa adresowania bezpośredniego, adres tworzą 4 bity zawarte w kodzie instrukcji.
Operacja | Kod instrukcji | Uwagi |
CSS[a] ← data | 1100 aaaa | Bity oznaczone jako 'a' tworzą 4-bitowy adres |
Instrukcja SKEY jest używana do sygnalizowania aktywacji klucza, który włącza programowanie pamięci nieulotnej NVM. Za instrukcją SKEY następuje 8 bajtów danych tworzących 64-bitowy klucz aktywacyjny.
Operacja | Kod instrukcji | Uwagi |
Key ← {8[data}} | 1110 0000 | Po instrukcji następują bajty danych |
Rodzaj klucza | Wartość |
Aktywacja programowania NVM | 0x1289AB45CDD888FF |
Po przekazaniu klucza, należy sprawdzać stan bitu aktywacji pamięci nieulotnej (ang. Non-Volatile Memory Enable bit, NVMEN) w rejestrze stanu TPI (ang. TPI Status Register, TPISR) do momentu, aż pamięć nieulotna zostanie uaktywniona. Programowanie NVM jest wyłączane po zapisie logicznego zera do bitu NVMEN w TPISR.
Poniższa tabela podsumowuje rejestry CSS:
Adres | Nazwa | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
0x0F | TPIIR | Kod identyfikacyjny interfejsu TPI | |||||||
0x0E ... 0x03 |
Zarezerwowane | – | – | – | – | – | – | – | – |
0x02 | TPIPCR | – | – | – | – | – | GT2 | GT1 | GT0 |
0x01 | Zarezerwowane | – | – | – | – | – | – | – | – |
0x00 | TPISR | – | – | – | – | – | – | NVMEN | – |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
CSS: 0x0F | Kod identyfikacyjny interfejsu TPI | TPIIR | |||||||
Zapis/Odczyt | O | O | O | O | O | O | O | O | |
Wartość początkowa | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bity te podają kod identyfikacyjny dla interfejsu TPI. Kod ten może zostać użyty przez zewnętrzny programator do identyfikacji interfejsu TPI. Kod jest podany w poniższej tabeli:
Rodzaj kodu | Wartość |
Identyfikacja interfejsu | 0x80 |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
CSS: 0x02 | - | - | - | - | - | GT2 | GT1 | GT0 | TPIPCR |
Zapis/Odczyt | O | O | O | O | O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity zostały zarezerwowane i przy odczycie dają wartość zero.
Te bity określają liczbę dodatkowych bitów bezczynności (stan wysoki, nieaktywny linii TPIDATA), które są wstawiane do transmisji przy zmianie trybu odbiorczego na nadawczy. Dodatkowe opóźnienia nie są wstawiane, gdy następuje zmiana trybu nadawania na tryb odbioru. Całkowity czas bezczynności przy zmianie trybu odbioru na tryb nadawania wynosi czas ochronny plus dwa bity bezczynności. Poniższa tabela przedstawia dostępne ustawienia czasu ochronnego:
GT2 | GT1 | GT0 | Czas ochronny (liczba bitów bezczynności) |
0 | 0 | 0 | +128 (standardowo) |
0 | 0 | 1 | +64 |
0 | 1 | 0 | +32 |
0 | 1 | 1 | +16 |
1 | 0 | 0 | +8 |
1 | 0 | 1 | +4 |
1 | 1 | 0 | +2 |
1 | 1 | 1 | +0 |
Standardową wartością czasu ochronnego jest 128 bitów bezczynności. Aby przyspieszyć komunikację, czas ochronny powinien być ustawiony na najkrótszą, lecz wciąż bezpieczną wartość.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
CSS: 0x00 | - | - | - | - | - | - | NVMEN | - | TPISR |
Zapis/Odczyt | O | O | O | O | O | O | Z/O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Te bity zostały zarezerwowane i przy odczycie dają wartość zero.
Programowanie NVM jest aktywne, gdy ten bit jest ustawiony. Zewnętrzny programator może odczytać stan tego bitu, aby zweryfikować, czy interfejs programowania został poprawnie aktywowany. Programowanie NVM jest wyłączane przez zapis tego bitu stanem zero.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.