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 |
©2023 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Ten rozdział opisuje jak programować i weryfikować pamięć FLASH, EEPROM, bity blokowania i bity blokujące w mikrokontrolerze ATtiny2313A/4313. |
Poniższa tabelka podsumowuje parametry pamięci FLASH:
Mikrokontroler | Rozmiar FLASH | Rozmiar strony | PCWORD | Strony | PCPAGE | PCMSB |
ATtiny2313A | 1K słów (2KB) |
16 słów | PC[3:0] | 64 | PC[9:4] | 9 |
ATtiny4313 | 2K słów (4KB) |
32 słowa | PC[4:0] | 64 | PC[10:5] | 10 |
Zmienna | Opis |
PCPAGE | Adres strony licznika rozkazów. Wybiera stronę słów i jest używane przez operacje kasowani i zapisu strony. |
PCMSB | Najbardziej znaczący bit licznika rozkazów. |
PCWORD | Adres słowa licznika rozkazów. Wybiera słowo wewnątrz strony. Wykorzystywane jest do wypełniania bufora tymczasowego i musi być równe zero podczas operacji zapisu strony. |
Poniższa tabelka podsumowuje parametry pamięci EEPROM:
Mikrokontroler | Rozmiar EEPROM | Rozmiar strony | PCWORD | Strony | PCPAGE | PCMSB |
ATtiny2313A | 128 B | 4 B | EEA[1:0] | 32 | EEA[6:2] | 6 |
ATtiny4313 | 256 B | 4 B | EEA[1:0] | 64 | EEA[7:2] | 7 |
Na poniższym rysunku przedstawiono sygnały programowania równoległego oraz połączenia:
Tabelka poniżej opisuje nazwy końcówek i sygnałów używanych w trybie programowania:
Nazwa sygnału | Końcówka | we/wy | Funkcja |
RDY/BSY | PD1 | wy | 0: mikrokontroler jest zajęty
programowaniem 1: mikrokontroler jest gotowy na nowy rozkaz |
OE | PD2 | we | Uaktywnienie wyjścia (aktywne w stanie niskim) |
WR | PD3 | we | Impuls zapisu (aktywny w stanie niskim) |
BS1/PAGEL | PD4 | we | Wybór bajtu 1 ("0"
wybiera bajt dolny, "1" wybiera bajt górny) Ładowanie strony pamięci programu i danych EEPROM |
XA0 | PD5 | we | Bit 0 działania XTAL |
XA1/BS2 | PD6 | we | Bit 1 działania XTAL Wybór bajtu 2 ("0" wybiera bajt dolny, "1" wybiera bajt górny) |
DATA | PB7...0 | we/wy | Dwukierunkowa szyna danych (wyjście, gdy OE ma stan niski) |
Zakłada się, że impulsy mają długość 250 ns, chyba że podano inaczej.
Poniższa tabelka przedstawia wartości końcówek używane przy wejściu w tryb programowania:
Końcówka | Symbol | Wartość |
XA1 | Prog_enable[3] | 0 |
XA0 | Prog_enable[2] | 0 |
BS1 | Prog_enable[1] | 0 |
WR | Prog_enable[0] | 0 |
Końcówki XA1 i XA0 określają rodzaj działania, gdy na CLKI pojawi się dodatni impuls, co pokazuje poniższa tabelka:
XA1 | XA0 | Działanie przy impulsie na końcówce CLKI |
0 | 0 | Ładowanie adresu FLASH lub EEPROM (górny lub dolny bajt, określony przez BS1). |
0 | 1 | Ładowanie danych (górny lub dolny bajt dla FLASH, określony przez BS1). |
1 | 0 | Rozkaz ładowania. |
1 | 1 | Brak działania, bezczynność |
Gdy pojawi się impuls na końcówce WR lub OE, załadowany rozkaz określa wykonywane działanie. Różne opcje rozkazów pokazuje poniższa tabelka:
Bajt rozkazu | Rozkaz |
1000 0000 | Kasowanie układu (ang. Chip Erase). |
0100 0000 | Zapis bitów bezpiecznikowych. |
0010 0000 | Zapis bitów blokujących. |
0001 0000 | Zapis pamięci FLASH. |
0001 0001 | Zapis pamięci EEPROM. |
0000 1000 | Odczyt bajtów sygnaturowych i bajtu kalibracyjnego. |
0000 0100 | Odczyt bitów bezpiecznikowych i blokujących. |
0000 0010 | Odczyt pamięci FLASH. |
0000 0011 | Odczyt pamięci EEPROM. |
0000 0000 | Operacja pusta |
Następujący algorytm wprowadza mikrokontroler w tryb wysokonapięciowego programowania równoległego (ang. Parallel High-voltage Programming Mode):
Jeśli czas narastania VCC nie spełnia wymienionych wyżej wymagań, można zastosować alternatywny algorytm:
Załadowane rozkazy i adresy są przechowywane w mikrokontrolerze podczas programowania. Aby programować oszczędnie i efektywnie, zaleca się przestrzegać poniższych punktów:
Rozkaz Chip Erase musi zostać wykonany przed ponownym zaprogramowaniem FLASH i/lub EEPROM. Rozkaz Chip Erase wymaże całą pamięć FLASH i EEPROM plus bity blokujące. Jeśli został zaprogramowany bit bezpiecznikowy EESAVE, to pamięć EEPROM nie jest kasowana.
Bity blokujące nie są resetowane do momentu całkowitego skasowania pamięci. Bity bezpiecznikowe nie są zmieniane.
Rozkaz Chip Erase jest ładowany następująco:
Pamięć FLASH zorganizowana jest w strony, co pokazuje poniższa tabelka:
Mikrokontroler | Rozmiar FLASH | Rozmiar strony | PCWORD | Strony | PCPAGE | PCMSB |
ATtiny2313A | 1K słów (2KB) |
16 słów | PC[3:0] | 64 | PC[9:4] | 9 |
ATtiny4313 | 2K słów (4KB) |
32 słowa | PC[4:0] | 64 | PC[10:5] | 10 |
Przy programowaniu FLASH dane programu są najpierw umieszczane w buforze strony. Pozwala to jednocześnie zaprogramować jedną stronę danych programu. Poniższa procedura opisuje, jak zaprogramować całą pamięć FLASH:
Dolne bity w adresie odwzorowują położenie słów wewnątrz strony, natomiast wyższe bity adresują strony w pamięci FLASH. Pokazuje to poniższy rysunek:
Zauważ, iż jeśli do adresowania słów na stronie potrzebne jest mniej niż osiem bitów (rozmiar strony < 256), to najbardziej znaczące bity w dolnym bajcie adresu są używane do adresowania strony, gdy jest wykonywany zapis strony (ang. Page Write).
Poniższy rysunek ilustruje adresowanie stron pamięci FLASH. Tabelka poniżej rysunku wyjaśnia znaczenia użytych oznaczeń.
Zmienna | Opis |
PCPAGE | Adres strony licznika rozkazów. Wybiera stronę słów i jest używane przez operacje kasowani i zapisu strony. |
PCMSB | Najbardziej znaczący bit licznika rozkazów. |
PCWORD | Adres słowa licznika rozkazów. Wybiera słowo wewnątrz strony. Wykorzystywane jest do wypełniania bufora tymczasowego i musi być równe zero podczas operacji zapisu strony. |
Więcej informacji znajdziesz w podrozdziale "Parametry pamięci"
Na poniższym rysunku przedstawione są przebiegi sygnałów przy programowaniu FLASH. XX oznacza "wartość nieistotną", a litery odnoszą się do opisanych wcześniej kroków programowania.
ADDR. LOW | – | dolny bajt adresu |
DATA LOW | – | dolny bajt słowa danych |
DATA HIGH | – | górny bajt słowa danych |
ADDR. HIGH | – | górny bajt adresu |
Pamięć EEPROM zorganizowana jest w strony, co pokazuje poniższa tabelka:
Mikrokontroler | Rozmiar EEPROM | Rozmiar strony | PCWORD | Strony | PCPAGE | PCMSB |
ATtiny2313A | 128 B | 4 B | EEA[1:0] | 32 | EEA[6:2] | 6 |
ATtiny4313 | 256 B | 4 B | EEA[1:0] | 64 | EEA[7:2] | 7 |
Przy programowaniu EEPROM dane są zapamiętywane w buforze strony. Pozwala to na jednoczesne programowanie jednej strony danych.
Algorytm programujące pamięć danych EEPROM jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Przebiegi w programowaniu EEPROM są zilustrowane na poniższym rysunku. XX oznacza "wartość nieistotną", a litery odnoszą się do opisanych wcześniej kroków programowania.
ADDR. HIGH | – | górny bajt adresu |
ADDR. LOW | – | dolny bajt adresu |
DATA | – | bajt danych |
Algorytm odczytu pamięci FLASH jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm odczytu pamięci FLASH jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm programowania dolnych bitów bezpiecznikowych jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm programowania górnych bitów bezpiecznikowych jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm programowania rozszerzonych bitów bezpiecznikowych jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Poniższy rysunek ilustruje przebiegi sygnałów przy programowaniu bitów bezpiecznikowych. XX oznacza "wartość nieistotną", a litery odnoszą się do opisanych wcześniej kroków programowania.
Algorytm programowania bitów blokujących jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm odczytu bitów bezpiecznikowych i blokujących jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Poniższy rysunek ilustruje odwzorowanie pomiędzy BS1, BS2 a bitami bezpiecznikowymi i blokującymi podczas odczytu:
Algorytm odczytu bajtów sygnaturowych jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Algorytm odczytu bajtu kalibracyjnego jest następujący (zobacz do podrozdziału "Programowanie pamięci FLASH", gdzie znajdziesz szczegóły na temat ładowania rozkazów, adresów i danych):
Obie pamięci FLASH i EEPROM można programować za pomocą szeregowej magistrali SPI po wymuszeniu poziomu masy GND na końcówce RESET. Interfejs szeregowy składa się z końcówek SCK, MOSI (wejścia) i MISO (output). Po podaniu stanu niskiego na końcówkę RESET należy wykonać instrukcję uaktywniającą programowanie (ang. Programming Enable instruction) przed wykonaniem operacji programowania/kasowania.
Poniższy rysunek przedstawia sygnały i połączenia w programowaniu szeregowym:
Uwaga: | Jeśli mikrokontroler taktowany jest z wewnętrznego oscylatora, to nie ma potrzeby podłączania źródła zegarowego do końcówki XTAL1. |
Gdy programowana jest pamięć EEPROM, to w operację programowania wbudowany jest cykl automatycznego kasowania i nie ma potrzeby wcześniejszego wykonywania rozkazu kasowania układu (ang. Chip Erase). Odnosi się to tylko do trybu programowania szeregowego.
Operacja kasowania układu ustawia zawartość każdej komórki pamięci we FLASH i w EEPROM na 0xFF.
Zależnie od ustawienia bitów bezpiecznikowych CKSEL układ musi być taktowany właściwym zegarem. Minimalne długości okresów niskich i wysokich na wejściu sygnału zegara szeregowego (SCK) są zdefiniowane następująco:
Poniższa tabelka wymienia przypisania końcówek. Zauważ, iż nie wszystkie mikrokontrolery używają końcówek SPI przeznaczonych dla wewnętrznego interfejsu SPI.
Symbol | Końcówka | WE/WY | Opis |
MOSI | PB5 | WE | Wejście danych |
MISO | PB6 | WY | Wyjście danych |
SCK | PB7 | WE | Zegar szeregowy |
Gdy dane szeregowe są zapisywane do ATtiny2313A/4313, ich odczyt przez mikroprocesor następuje na narastającym zboczu sygnału zegarowego SCK. Gdy dane są odczytywane z ATtiny2313A/4313, ich próbkowanie następuje przy opadającym zboczu sygnału SCK.
Aby zaprogramować i zweryfikować mikrokontroler ATtiny2313A/4313 w trybie programowania szeregowego, zaleca następujący ciąg operacji:
Minimalne czasy opóźnienia przed zapisem następnej komórki FLASH lub EEPROM
Symbol | Opis | Minimalny czas opóźnienia |
tWD_FLASH | Opóźnienie dla zapisu FLASH | 4,5 ms |
tWD_EEPROM | Opóźnienie dla zapisu EEPROM | 4,0 ms |
tWD_ERASE | Opóźnienie dla kasowania | 9,0 ms |
tWD_FUSE | Opóźnienie dla zapisu bitu bezpiecznikowego | 4,5 ms |
Instrukcja | Format instrukcji | Operacja | |||
Bajt 1 | Bajt 2 | Bajt 3 | Bajt 4 | ||
Programming
Enable Uaktywnienie programowania |
1010 1100 |
0101 0011 |
xxxx xxxx |
xxxx xxxx |
Uaktywnia programowanie szeregowe po wysterowaniu końcówki RESET stanem niskim. |
Chip Erase Kasowanie zawartości układu |
1010 1100 |
100x xxxx |
xxxx xxxx |
xxxx xxxx |
Kasowanie zawartości EEPROM i FLASH. |
Read Program
Memory Odczyt pamięci programu |
0010 H000
|
0000 00aa
|
bbbb bbbb
|
oooo oooo
|
Odczyt danych H (górny lub dolny bajt) z pamięci programu spod adresu słowa a:b. |
Load Program
Memory Page Ładowanie do strony pamięci programu |
0100 H000
|
000x xxxx |
xxxx bbbb
|
iiii iiii |
Zapis danych H (górny lub dolny bajt) do strony pamięci programu pod adresem słowa b. Dolny bajt danej musi być zapisany przed górnym bajtem pod tym samym adresem. |
Write Program
Memory Page Zapis strony pamięci programu |
0100 1100 |
0000 00aa
|
bbbb xxxx
|
xxxx xxxx |
Zapis strony pamięci programu pod adresem a:b |
Read EEPROM
Memory Odczyt pamięci EEPROM |
1010 0000 |
000x xxxx |
xbbb bbbb |
oooo oooo |
Odczyt danych o z EEPROM pod adresem b. |
Write EEPROM
Memory Zapis pamięci EEPROM |
1100 0000 |
000x xxxx |
xbbb bbbb
|
iiii iiii |
Zapis danych i do EEPROM pod adres b. |
Load EEPROM
Memory Page Ładowanie do strony pamięci EEPROM |
1100 0001 |
0000 0000 |
0000 00bb
|
iiii iiii |
Zapis danych i do bufora strony pamięci EEPROM. Po załadowaniu danych zaprogramuj stronę EEPROM. |
Write EEPROM
Memory Page Zapis strony pamięci EEPROM |
1100 0010 |
00xx xxxx |
xbbb bb00
|
xxxx xxxx |
Zapis strony EEPROM pod adresem b. |
Read Lock
Bits Odczyt bitów blokujących |
0101 1000 |
0000 0000 |
xxxx xxxx |
xxoo oooo
|
Odczyt bitów blokujących. "0" = zaprogramowane, "1" = niezaprogramowane. |
Write Lock
Bits Zapis bitów blokujących |
1010 1100 |
111x xxxx |
xxxx xxxx |
11ii iiii
|
Zapis bitów blokujących. "0" = zaprogramowane, "1" = niezaprogramowane. |
Read
Signature Byte Odczyt bajtu sygnatury |
0011 0000 |
000x xxxx |
xxxx xxbb
|
oooo oooo
|
Odczyt bajtu sygnatury spod adresu b. |
Write Fuse
Bits Zapis dolnych bitów bezpiecznikowych |
1010 1100 |
1010 0000 |
xxxx xxxx |
iiii iiii
|
Zapis dolnego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Write Fuse
High Bits Zapis górnych bitów bezpiecznikowych |
1010 1100 |
1010 1000 |
xxxx xxxx |
iiii iiii
|
Zapis górnego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Write
Extended Fuse Bits Zapis rozszerzonych bitów bezpiecznikowych |
1010 1100 |
1010 0100 |
xxxx xxxx |
xxxx xxxi
|
Zapis rozszerzonego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Read Fuse
Bits Odczyt dolnych bitów bezpiecznikowych |
0101 0000 |
0000 0000 |
xxxx xxxx |
oooo oooo
|
Odczyt dolnego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Read Fuse
High Bits Odczyt górnych bitów bezpiecznikowych |
0101 1000 |
0000 1000 |
xxxx xxxx |
oooo oooo
|
Odczyt górnego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Read Extended
Fuse Bits Odczyt rozszerzonych bitów bezpiecznikowych |
0101 0000 |
0000 0100 |
xxxx xxxx |
oooo oooo
|
Odczyt rozszerzonego bajtu bezpieczników. "0" = zaprogramowane, "1" = niezaprogramowane. |
Read
Calibration Byte Odczyt bajtu kalibracyjnego |
0011 1000 |
000x xxxx |
0000 000b
|
oooo oooo
|
Odczyt bajtu kalibracyjnego spod adresu b. |
Poll RDY/BSY Podgląd RDY/BSY |
1111 0000 |
0000 0000 |
xxxx xxxx |
xxxx xxxo
|
Jeśli o = "1", to wciąż trwa operacja programowania. Poczekaj, aż ten bit powróci na "0", zanim wyślesz kolejny rozkaz. |
Uwagi: | a = górne bity adresu, b = dolne bity adresu, H = 0 - dolny bajt, 1 - górny bajt, o = dane wyjściowe, i = dane wejściowe, x = wartości ignorowane | |
Jeśli najmłodszy bit danych zwróconych przez podgląd RDY/BSY ma stan wysoki 1, to operacja programowania jest wciąż wykonywana. Poczekaj na powrót tego bitu do stanu niskiego 0 przed wykonaniem następnej instrukcji. | ||
W obrębie tej samej strony bajt dolny danych musi być załadowany przed bajtem górnym. | ||
Po załadowaniu danych do bufora strony, zaprogramuj stronę EEPROM |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.