Programowanie mikrokontrolerów Freescale Kinetis w trybie ISP
W 32-bitowych układach rodziny Kinetis firmy Freescale wbudowany został blok funkcjonalny o nazwie EzPort. Moduł ten jest odpowiedzialny za programowanie mikrokontrolerów w trybie ISP (In-System Programming). Aby ten proces mógł zostać wykonany, do głównych funkcji EzPort należy przede wszystkim odczyt pamięci Flash, kasowanie pamięci Flash i zapisywanie pamięci Flash. Co istotne, zgodnie z ideą ISP, czynności te mogą być wykonywane bez konieczności usuwania mikrokontrolera z systemu, w którym został zintegrowany.
Moduł EzPort może działać w dwóch trybach: włączonym i wyłączonym.
- Tryb włączony: moduł EzPort przejmuje kontrolę nad sterowaniem pamięcią Flash, wyłączając jednocześnie dostęp innych zasobów mikrokontrolera do pamięci. Zapobiega to występowaniu konfliktów dostępu do pamięci;
- Tryb wyłączony: zasoby mikrokontrolera mają normalny dostęp do pamięci Flash.
Budowa i zasada działania modułu EzPort
W procesie programowania ISP wykorzystywane są: moduł EzPort, pamięć Flash, rdzeń mikrokontrolera i kontroler resetu. Ich wzajemne połączenie przedstawiono na rysunku 1 w postaci schematu blokowego.
Rys. 1. Schemat blokowy przedstawiający połączenie modułu EzPort z modułami z nim współpracującymi
Moduł EzPort wyposażony jest w prosty interfejs komunikacyjny zgodny ze standardem transmisyjnym SPI (Serial Peripheral Interface), za pomocą którego moduł komunikuje się z urządzeniami zewnętrznymi. Opis wyprowadzeń modułu EzPort przedstawiono w tabeli 1.
Tab. 1. Opis wyprowadzeń modułu EzPort
Nazwa wyprowadzenia | Funkcja wyprowadzenia | Tryb pracy wyprowadzenia |
EZP_CK | Linia zegarowa | Wejście |
EZP_CS | Chip Select | Wejście |
EZP_D | Linia danych wejściowych | Wejście |
EZP_Q | Linia danych wyjściowych | Wyjście |
Linia EZP_CK to linia, na której podawany jest sygnał zegarowy. Zgodnie z kolejnymi taktami zegara, na liniach danych (EZP_D oraz EZP_Q) podawane są bity danych. Częstotliwość sygnału zegarowego może przyjąć maksymalnie połowę wartości częstotliwości mikrokontrolera. Jedynym wyjątkiem jest sytuacja, gdy wykonywana jest operacja na pamięci oznaczona jako Read Data lub Read FlexRAM. W tym wypadku częstotliwość sygnału zegarowego nie może przekroczyć jednej ósmej częstotliwości pracy mikrokontrolera.
Linia EZP_CS to tak zwana linia Chip Select. Służy ona do sygnalizacji miejsc w ciągu danych, gdzie zaczyna się i kończy dana komenda. Negacja sygnału na linii EZP_CS oznacza zakończenie aktualnie przesyłanej komendy.
Linie EZP_D oraz EZP_Q służą do przesyłania danych. Każda sentencja, w tym kod komendy, adres i dane, rozpoczynana jest od najbardziej znaczącego bitu.
Konfiguracja sprzętowa i programistyczna do współpracy z modułem EzPort
Komunikacja między modułem EzPort i urządzeniem zewnętrznym może odbywać się w dwóch trybach pracy standardu SPI, różniącymi się polaryzacją sygnału zegarowego i zboczem zegara, dla którego zmienia się wartość bitu danych. Dostępne tryby pracy to:
- CPOL = 0, CPHA = 0;
- CPOL = 1, CPHA = 1.
Moduł EzPort podczas komunikacji SPI z urządzeniem zewnętrznym działa jako urządzenie Slave, co oznacza, że to urządzenie zewnętrzne steruje całym procesem działania modułu EzPort wysyłając do niego odpowiednie komendy do wykonania. Urządzeniem zewnętrznym może być np. mikrokontroler Freescale Coldfire MCF5282. Schemat połączenia mikrokontrolerów Kinetis i Coldfire MCF5282 przedstawiono na rysunku 2.
Rys. 2. Połączenie interfejsu SPI mikrokontrolera MCF5282 z liniami modułu EzPort
Przykładowy kod konfigurujący interfejs SPI w mikrokontrolerze Coldfire MCF5282 do pracy z modułem EzPort układu Kinetis pokazano w listingu:
// Configure as GPIO pins to monitor RSTOUT pins and assert RCON MCF5282_GPIO_PQSPAR = 0x0; // GPIO function MCF5282_GPIO_DDRQS = 0x08; // CS0 as output MCF5282_GPIO_PORTQS = 0x08; // Drive CS0 HIGH /* set up wrap register for a single 8-bit transfer */ MCF5282_QSPI_QWR = MCF5282_QSPI_QWR_CSIV; /* Enable QSPI Pins */ MCF5282_GPIO_PQSPAR |= 0x7F; // Configure as GPIO pins to monitor RSTOUT pins and assert RCON MCF5282_GPIO_PQSPAR = 0x0; // GPIO function MCF5282_GPIO_DDRQS = 0x28; // CS0 and CS2 as output MCF5282_GPIO_PORTQS = 0x28; // Drive RCON HIGH & RSTIN HIGH MCF5282_GPIO_PORTQS = 0x08; // Drive RCON HIGH & RSTIN LOW while ((data_in & 0x10))//wait till RSTOUT LOW { data_in = MCF5282_GPIO_PORTQSP; } MCF5282_GPIO_PORTQS = 0x20; // Drive RCON LOW & RSTIN HIGH while (!(data_in & 0x10))//wait till RSTOUT HIGH { data_in = MCF5282_GPIO_PORTQSP; } //Exiting reset and entering EZPORT mode MCF5282_GPIO_PORTQS = 0x28; // Drive RCON HIGH again