Uniwersalny programator ISP

Sytuację, gdy do zaprogramowania ISP trzech układów potrzebne były trzy różne programatory, można było uznać za naturalną na początku wdrażania standardów ISP (15 lat temu), lecz teraz jest to kompletny anachronizm. Dotychczasowa sytuacja jest tym bardziej absurdalna, że dzięki powszechnemu stosowaniu uniwersalnych języków opisu sprzętu (HDL) do realizacji projektów na układach PLD, korzystanie z układów pochodzących od różnych producentów (choćby z powodu fluktuacji ich cen) jest rzeczą zupełnie naturalną. W związku z tym proponujemy wykonanie uniwersalnego programatora, za pomocą którego można programować w systemie układy CPLD/FPGA firm: Altera, Atmel, Lattice i Xilinx oraz mikrokontrolery AVR.

 

Możliwości prezentowanego programatora

  • emuluje programatory ISP: ByteBlaster MV, DLC-5, Lattice Cable, ispDOWNLOAD i STK200,
  • programuje układy CPLD firm: Altera (MAX3000, MAX7000S/A/B, MAX9000), Atmel (AT1500/1500S/ASL), Lattice (ispMACH, ispGAL22LV10, ispGAL22V10AV/AB) oraz Xilinx (XC9500/9500XL, CoolRunner),
  • programuje układy FPGA firm: Altera (zasilane napięciem od 3,3 do 5 V), Lattice (ORCA) oraz Xilinx (zasilane napięciem od 3,3 do 5 V),
  • programuje układy ispGDX i ispPAC firmy Lattice,
  • może być stosowany do programowania układów wyposażonych w interfejs ispLattice (CPLD starszych generacji, jak na przykład ispLSI2000, ispGAL22V10),
  • programator jest zasilany z urządzenia docelowego (5 V),
  • współpraca z PC odbywa się poprzez interfejs Centronics.

 

ISP vs JTAG vs SPI

Na początek drobne wyjaśnienie pojęć, które dość często są mylone, a których rozróżnienie jest dość istotne.
AVR-y jako pierwsze z grupy mikrokontrolerów popularnych wyposażono w możliwość programowania w systemie. Atmel wykorzystał do tego celu interfejs SPI (Serial Peripherial Interface), który w specyficznych warunkach spełnia rolę interfejsu wejściowego dla wbudowanego w mikrokontrolery programatora pamięci Flash. Dane są wprowadzane i odczytywane szeregowo w sposób synchroniczny.

 

Co to znaczy ISP?

Mianem ISP (od angielskiego In System Programmable) jest określany sposób programowania pamięci Flash/EEPROM wbudowanej w układy scalone (przede wszystkim mikrokontrolery, PLD i pamięci nieulotne) po ich zamontowaniu w urządzeniu. Programowanie ISP odbywa się zazwyczaj poprzez interfejs SPI, JTAG lub RS232.

 

Nieco inaczej wygląda sytuacja w przypadku układów PLD, które w większości przypadków wyposażono w interfejs JTAG (zgodny z jedną z norm: IEEE1149 lub IEEE1532) – jak ma to miejsce w większości układów CPLD, lub synchroniczny interfejs szeregowy służący do konfiguracji układów FPGA. Zarówno w przypadku klasycznego JTAG-a jak i interfejsów przystosowanych do konfigurowania układów FPGA istnieje możliwość programowania/konfigurowania pojedynczego układu lub wielu układów połączonych w tzw. łańcuch JTAG (rys. 1).

 

Rys. 1. Przykładowa ścieżka JTAG z 
kilkoma układami

Rys. 1. Przykładowa ścieżka JTAG z kilkoma układami

 

 

Niezależnie od rodzaju interfejsu zastosowanego do programowania (JTAG/SPI, czasami także RS232), programowanie/konfigurowanie pamięci układu zamontowanego w urządzeniu jest nazywane ISP od In System Programmable. Programator prezentowany w artykule emuluje interfejsy: JTAG, SPI oraz natywne tryby konfiguracji FPGA najpopularniejszych rodzin układów PLD i mikrokontrolerów AVR, pozwalając programować te układy w systemie (ISP).

 

Rys. 2. Schemat elektryczny 
programatora

Rys. 2. Schemat elektryczny programatora

 

 

Schemat elektryczny programatora pokazano na rys. 2. Jego budowa jest bardzo prosta dzięki zastosowaniu układu programowalnego firmy Xilinx (U2), w którym zintegrowano wszystkie bloki funkcjonalne emulowanych interfejsów. Projekt przygotowano w języku VHDL, dzięki czemu można go zmodyfikować adekwatnie do własnych potrzeb, na przykład dodając opisy HDL kolejnych interfejsów ISP. Na rys. 3 pokazano uproszczony schemat blokowy projektu zaimplementowanego w układzie U2.

 

Rys. 3. Schemat blokowy projektu 
zaimplementowanego w układzie U2

Rys. 3. Schemat blokowy projektu zaimplementowanego w układzie U2

 

 

Układ U2 należy do rodziny XC9500XL produkowanej przez firmę Xilinx. Jest on przystosowany do zasilania napięciem 3,3 V, ale wszystkie jego linie wejściowe są przystosowane do współpracy z układami cyfrowymi zasilanymi napięciem 5 V, a poziomy napięć na liniach wyjściowych są zgodne ze standardem TTL. Napięcie zasilające jest stabilizowane przez układ U1 (stabilizator LDO – Low Drop Out), na wejście którego jest podawane napięcie +5 V z urządzenia, w którym znajduje się programowany układ. Napięcie zasilające na wejściu stabilizatora nie może być niższe niż ok. 3,7 V, ponieważ nie będzie on pracował poprawnie.
Jumpery JP3 i JP4 służą do ustalenia tryby pracy programatora. Wybór użytkownika jest sygnalizowany za pomocą trzech diod LED (D2, D3 i D4), przy czym w trybie STK200 świecą jednocześnie diody D2 (LED_ALT) i D4 (LED_LATT). Dioda D1 służy do monitorowania sygnałów zegarowych każdego z interfejsów, a dioda D5 sygnalizuje dołączenie zasilania do złącza JP2. Złącze to służy do dołączenia programatora do programowanego układu, a wyprowadzenie sygnałów na nim jest zgodne z ByteBlasterem, ByteBlasterem MV oraz interfejsem ispDOWNLOAD.

 

Do pobrania

O autorze