Do tej pory mikrokontrolery z pamięcią Flash mogły być zapisywane i odczytywane wyłącznie w trybie równoległym. Przy takim sposobie programowania zarówno bajt danej, jak i adres określający, do której komórki pamięci Flash dana ma być zapisana, są podawane jednocześnie na odpowiednie porty mikrokontrolera. Wymaga to podłączenia co najmniej kilkunastu sygnałów do wyprowadzeń układu. Wiąże się to z koniecznością umieszczenia mikrokontrolera na czas programowania w odpowiedniej podstawce typu ZIF, a potem przeniesienia do podstawki w urządzeniu docelowym, w którym będzie pracował. Na etapie pisania i poprawiania oprogramowania może to oznaczać nawet kilkaset powtórzeń tych operacji! W dodatku, coraz częściej nowe układy pojawiają się w obudowach przystosowanych do montażu powierzchniowego, co powoduje dodatkowe kłopoty. Po pierwsze, podstawki do programowania elementów w obudowach typu TQFP są drogie. Po drugie, po wlutowaniu zaprogramowanego układu do płytki nie istnieje już praktycznie możliwość jego ponownego przeprogramowania w taki sposób. Z tego powodu producenci mikrokontrolerów wyposażają je w funkcję programowania bezpośrednio w układzie. w którym pracują. Programowanie odbywa się za pośrednictwem kilku wyodrębnionych wyprowadzeń mikrokontrolera, które służą do szeregowego przesyłania danych pomiędzy kostką a programatorem. W czasie programowania mikrokontroler pobiera zasilanie z układu, w którym jest zamontowany.
Prezentowana przystawka pozwala programować wybrane mikrokontrolery w tym właśnie trybie. Na początek opracowano i przetestowano metody programowania kilku rodzajów mikrokontrolerów firmy Atmel, m.in.: AT90S2313, AT90S515, ATMEGA515, AT89S52, AT89S8252, chociaż nic nie stoi na przeszkodzie, by przystawka współpracowała także z innymi układami.
Interfejs SPI Atmela
Wybór mikrokontrolerów Atmela jako pierwszych układów, na których przystawka była testowana, wynika z dużego ich rozpowszechnienia na polskim rynku. Są one łatwo dostępne i stosunkowo tanie.
Zanim przejdziemy do omawiania budowy samej przystawki, warto poznać chociaż ogólne zasady działania interfejsu SPI. Na szczęście nie są one zbyt skomplikowane.
Interfejs SPI, służący do programowania w układzie mikrokontrolerów Atmela, składa się z 4 linii sygnałowych. Do tego należy dodać wyprowadzenia masy i napięcia zasilania mikrokontrolera – będzie ono potrzebne w niektórych trybach pracy przystawki. Nazwy i opis funkcji poszczególnych wyprowadzeń przedstawiono poniżej:
- MOSI – wejście szeregowe danych, tą linią dane są zapisywane do programowanego układu,
- MISO – wyjście szeregowe danych, tą linią dane są odczytywane z programowanego układu,
- SCK – wejście sygnałów zegarowych, tą linią podawane są do programowanego układu sygnały zegarowe synchronizujące transmisję danych wejściowych i wyjściowych,
- RESET – wejście sygnału zerowania mikrokontrolera, podczas programowania układu sygnał ten jest cały czas aktywny.
Jak to wcześniej napisano, podczas programowania mikrokontroler powinien być zasilany, powinien także pracować jego oscylator, co najczęściej oznacza dołączenie do wyprowadzeń XTAL zewnętrznego kwarcu. Jako przykład pokazano mikrokontroler AT89S52 z sygnałem zerowania aktywnym przy poziomie wysokim. Mikrokontrolery z grupy AVR są zerowane poziomem niskim. Przyporządkowanie linii interfejsu SPI do konkretnych wyprowadzeń poszczególnych układów można znaleźć w ich dokumentacji technicznej.
Dane są przesyłane po liniach MOSI i MISO bajt za bajtem z najstarszym bitem jako pierwszym. Z rysunku wynika, że kolejne bity danych wejściowych na linii MOSI są synchronizowane zboczem narastającym zegara SCK i gdy ma on poziom wysoki, nie powinny się zmieniać. Z kolei dane wyjściowe z mikrokontrolera można odczytywać tuż przed zboczem opadającym zegara SCK. Informacje na liniach MOSI i MISO mogą ulegać zmianie, gdy impuls zegara SCK ma poziom niski.
W czasie programowania napięcie zasilania Vcc powinno być stabilne, a jego wartość jest określona w dokumentacji technicznej dla każdego z typów mikrokontrolera. W przypadku niektórych z grupy AVR napięcie zasilania może się mieścić w przedziale 3...5,5 V, dla pozostałych wynosi zazwyczaj 4...5,5 V.