
Последовательное программирование
Флэш-память и ЭСППЗУ могут быть запрограммированы через последовательный интерфейс SPI. Последовательный интерфейс состоит из следующих сигналов: SCK, MOSI (вход) и MISO (выход). Для программирования МК, после подачи низкого уровня на вход RESET необходимо выполнить инструкцию разрешения программирования.
Расположение выводов последовательного программирования через SPI
Несмотря на то, что при последовательном программирования используется тот же модуль SPI, что и при обычной работы микроконтроллера, имеется одно важное отличие: выводы MOSI/MISO модуля ввода-вывода SPI, которые совмещены с PB2 и PB3, не используются при программировании. Вместо них используются PE0 и PE1 для ввода и вывода данных при последовательном программировании (см. табл. 128).
Таблица 128. Выводы интерфейса SPI при последовательном программировании
Обозначение |
Вывод |
Направление |
Описание |
MOSI (PDI) |
PE0 |
ввод |
Последовательный ввод данных |
MISO (PDO) |
PE1 |
вывод |
Последовательный вывод данных |
SCK |
PB1 |
ввод |
Синхронизация последовательной связи |
Рисунок
144. Последовательное программирование
и проверка(1)
Прим.:
-
Если микроконтроллер тактируется внутренним генератором, то нет необходимости подключать тактовый источник к выводу XTAL1.
-
VCC - 0.3В < AVCC < VCC + 0.3В, но AVCC должен находится в пределах 2.7 - 5.5В.
Во время программирования ЭСППЗУ функция стирания выполняется автоматически (только в режиме последовательного программирования) и, поэтому, нет необходимости первоначально выполнять команду "Стирание кристалла". Выполнение команды "Стирание кристалла" приводит к заполнению памяти программ и ЭСППЗУ кодом $FF.
Алгоритм последовательного программирования через SPI
Во время последовательной записи в ATmega128 данные тактируется нарастающим фронтом SCK. Во время чтения данных из ATmega128 данные тактируются падающим фронтом SCK. Временная диаграмма представлена на рисунке ниже.
Для программирования и проверки памяти ATmega128 в режиме последовательного программирования через SPI рекомендуется придерживаться следующей последовательности (см. четырехбайтный формат в таблице 145):
-
Последовательность подачи питания: подать напряжение питания между VCC и GND, когда на входах RESET и SCK присутствует лог. 0. Пауза не менее 20 мс и разрешение последовательного программирования путем записи команды разрешения последовательного программирования через вход MOSI.
-
блабла
-
Флэш-память программируется постранично. Страница памяти загружается побайтно, при этом в инструкции "загрузки страницы памяти программ" указываются данные и адрес в семи младших разрядах. Чтобы гарантировать корректность загрузки страницы сначала необходимо записать младший байт, а затем старший байт данных по каждому адресу. Запись страницы памяти программ инициируется вводом инструкции "запись страницы памяти программ",
-
Массив памяти ЭСППЗУ программируется побайтно, при этом, в инструкции записи указывается адрес и данные. Перед записью данных первоначально автоматически стирается адресуемая ячейка ЭСППЗУ.
-
Любую ячейку памяти можно проверить использованием инструкции чтения, которая возвращает содержимое ячейки по указанному адресу путем последовательной передачи на выходе MISO.
-
По завершении программирования вход RESET должен быть переведен в высокое состояние для возобновления нормальной работы.
-
Последовательность снятия питания (при необходимости): установка RESET = "1", отключить питание VCC.
Рисунок
145. Осциллограммы сигналов последовательного
программирования интерфейса SPI
Для справки. Инструкции передаваемые через SPI
Набор инструкций последовательного программирования через SPI
Инструкция |
Формат инструкции |
Функция |
||||
Байт 1 |
Байт 2 |
Байт 3 |
Байт 4 |
|
||
Разрешение программирования |
1010 1100 |
0101 0011 |
xxxx xxxx |
xxxx xxxx |
Разрешение последовательного программирования после подачи лог. 0 на RESET. |
|
Стирание кристалла |
1010 1100 |
100x xxxx |
xxxx xxxx |
xxxx xxxx |
Стирание ЭСППЗУ и флэш-памяти |
|
Чтение памяти программ |
0010 H000 |
aaaa aaaa |
bbbb bbbb |
oooo oooo |
Чтение старшего (H=1) или младшего (H=0) байта данных o из памяти программ по адресу a:b. |
|
Загрузка страницы памяти программ |
0100 H000 |
xxxx xxxx |
xbbb bbbb |
iiii iiii |
Запись старшего (H=1) или младшего (H=0) байта данных i в страницу памяти программ по адресу b. Мл. байт данных должен быть загружен перед старшим байтом по тому же адресу. |
|
Запись страницы памяти программ |
0100 1100 |
aaaa aaaa |
bxxx xxxx |
xxxx xxxx |
Запись страницы памяти программ по адресу a:b. |
|
Чтение ЭСППЗУ |
1010 0000 |
xxxx aaaa |
bbbb bbbb |
oooo oooo |
Чтение данных o из ЭСППЗУ по адресу a:b. |
|
Запись ЭСППЗУ |
1100 0000 |
xxxx aaaa |
bbbb bbbb |
iiii iiii |
Запись данных i в ЭСППЗУ по адресу a:b. |
|
Чтение бит защиты |
0101 1000 |
0000 0000 |
xxxx xxxx |
xxoo oooo |
Чтение бит защиты. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 116. |
|
Запись бит защиты |
1010 1100 |
111x xxxx |
xxxx xxxx |
11ii iiii |
Запись бит защиты. Запись "0" приводит к программированию бита защиты. См. табл. 116. |
|
Чтение сигнатурного байта |
0011 0000 |
xxxx xxxx |
xxxx xxbb |
oooo oooo |
Чтение сигнатурного байта o по адресу b. |
|
Запись конфигурационных бит |
1010 1100 |
1010 0000 |
xxxx xxxx |
iiii iiii |
Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
|
Запись старших конфигурационных бит |
1010 1100 |
1010 1000 |
xxxx xxxx |
iiii iiii |
Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
|
Запись расширенных конфигурационных бит |
1010 1100 |
1010 0100 |
xxxx xxxx |
xxxx xxii |
Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
|
Чтение конфигурационных бит |
0101 0000 |
0000 0000 |
xxxx xxxx |
oooo oooo |
Чтение конфигурационных бит. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 120. |
|
Чтение расширенных конфигурационных бит |
0101 0000 |
0000 1000 |
xxxx xxxx |
oooo oooo |
Чтение расширенных конфигурационных бит. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 120. |
|
Чтение старших конфигурационных бит |
0101 1000 |
0000 1000 |
xxxx xxxx |
oooo oooo |
Чтение старших конфигурационных бит. "0" = запрограммирован, "1" = не запрограммирован. См. табл. 119. |
|
Чтение калибровочного байта |
0011 1000 |
xxxx xxxx |
0000 00bb |
oooo oooo |
Чтение калибровочного байта o по адресу b. |