Последовательное программирование
Флэш-память и ЭСППЗУ могут быть запрограммированы через последовательный интерфейс SPI, когда вход RESET переведен в низкое состояние. Последовательный интерфейс состоит из следующих сигналов: SCK, MOSI (вход) и MISO (выход). После подачи низкого уровня на вход RESET необходимо выполнить инструкцию разрешения программирования. В таблице 128 представлено описание сигналов программирования. Обратите внимание, что не все выводы последовательного программирования совпадают с выводами внутреннего интерфейса SPI. Также следует отметить, что повсюду при описании последовательного программирования используются наименования MOSI и MISO для описания последовательного ввода и вывода данных, соответственно. Для ATmega128 соответствующие выводы программирования именуются PDI и PDO.
Расположение выводов последовательного программирования через 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.
Параметры тактового сигнала зависят от настроек синхронизации микроконтроллера конфигурационными битами CKSEL. Длительности высокого и низкого уровней тактового сигнала (SCK) должны отвечать следующим условиям:
- Длительность низкого уровня:
- - больше двух тактов ЦПУ, если fck < 12 МГц;
- - больше трех тактов ЦПУ, если fck і 12 МГц.
- Длительность высокого уровня:
- - больше двух тактов ЦПУ, если fck < 12 МГц;
- - больше трех тактов ЦПУ, если fck і 12 МГц.
Алгоритм последовательного программирования через SPI
Во время последовательной записи в ATmega128 данные тактируется нарастающим фронтом SCK. Во время чтения данных из ATmega128 данные тактируются падающим фронтом SCK. Временная диаграмма представлена на рисунке 145.
Для программирования и проверки памяти ATmega128 в режиме последовательного программирования через SPI рекомендуется придерживаться следующей последовательности (см. четырехбайтный формат в таблице 145):
- Последовательность подачи питания: подать напряжение питания между VCC и GND, когда на входах RESET и SCK присутствует лог. 0. В некоторых системах, программатор не может гарантировать, что SCK = 0 при подаче питания. В этом случае необходимо сформировать положительный импульс на RESET длительностью не менее двух тактов ЦПУ после того, как SCK принял низкое состояние. Альтернативно сигналу RESET можно использовать вывод PEN. В этом случае будет важно только значение PEN во время сброса при подаче питания. Если программатор не гарантирует, что при подаче питания SCK =0, то использование PEN недопустимо. При использовании данного метода микроконтроллер может вернутся к нормальному режимы работы только снятием и возобновлением питания.
- Пауза не менее 20 мс и разрешение последовательного программирования путем записи команды разрешения последовательного программирования через вход MOSI.
- Инструкции последовательного программирования не выполняются, если последовательная связь не вошла в синхронизацию. Вход в синхронизацию индицирует прием значения второго байта ($53) при записи третьего байта инструкции разрешения последовательного программирования. В зависимости от того корректно или нет принятое значение передаются все четыре байта инструкции. Если принятое значение не равно $53, то формируется положительный импульс на входе RESET и вводится новая команда разрешения последовательного программирования.
- Флэш-память программируется постранично. Размер страницы показан в таблице 125. Страница памяти загружается побайтно, при этом в инструкции "загрузки страницы памяти программ" указываются данные и адрес в семи младших разрядах. Чтобы гарантировать корректность загрузки страницы сначала необходимо записать младший байт, а затем старший байт данных по каждому адресу. Запись страницы памяти программ инициируется вводом инструкции "запись страницы памяти программ", где в 9-ти старших разрядах указывается адрес страницы. Если опрос не используется, то программист должен предусмотреть задержку не менее tWD_FLASH перед вводом новой страницы (см. табл. 129).
Прим.: если какая-либо другая команда, кроме опроса (чтения), вводится перед завершением любой операции записи (флэш-память, ЭСППЗУ, биты защиты, конфигурационные биты) программирование может завершиться некорректно.
- Массив памяти ЭСППЗУ программируется побайтно, при этом, в инструкции записи указывается адрес и данные. Перед записью данных первоначально автоматически стирается адресуемая ячейка ЭСППЗУ. Если опрос не используется, то программист должен предусмотреть задержку tWD_EEPROM перед вводом следующего байта (см. табл. 129). По стирания памяти микроконтроллера необходимо записывать только данные неравные $FF.
- Любую ячейку памяти можно проверить использованием инструкции чтения, которая возвращает содержимое ячейки по указанному адресу путем последовательной передачи на выходе MISO.
- По завершении программирования вход RESET должен быть переведен в высокое состояние для возобновления нормальной работы.
- Последовательность снятия питания (при необходимости): установка RESET = "1", отключить питание VCC.
Опрос данных флэш-памяти
После того, как страница полностью запрограммирована во флэш-память, при чтении по адресам в пределах запрограммированной страницы возвращается $FF. Микроконтроллер готов к записи новой страницы, если запрограммированное значение считано корректно. Это используется для определения момента, когда может быть загружена следующая страница. Обратите внимание, что запись выполняется всей страницы одновременно и любой адрес в пределах страницы может использоваться для опроса. Опрос данных флэш-памяти не действует для значения $FF, т.к. при записи этого значения пользователь может не вводить задержку tWD_FLASH перед программированием новой страницы. Данная возможность объясняется тем, что очищенная память микроконтроллера содержит $FF во всех ячейках. Значение tWD_FLASH представлено в таблице 129.
Опрос данных ЭСППЗУ
При чтении значения по адресу, который использовался для записи нового байта и последующего его программирования в ЭСППЗУ, возвращается значение $FF. В это же время, микроконтроллер готов к записи нового байта, если запрограммированное значение корректно считывается. Это используется для определения момента, когда может быть осуществлена запись следующего байт. Данное не распространяется на значение $FF, но программист должен обратить внимание на следующее: поскольку очищенная память заполнена $FF по всем адресам, то программирование ячейки значением $FF может быть пропущено. Пропуск нельзя делать, если ЭСППЗУ перепрограммируется без предварительного стирания всей памяти. В этом случае, значение $FF нельзя использовать для опроса данных и программист должен предусмотреть задержку не менее tWD_EEPROM перед программированием следующего байта. В таблице 129 представлен о значение tWD_EEPROM.
Таблица 129. Минимальные длительности задержек перед записью очередной ячейки флэш-памяти и ЭСППЗУ
Обозначение |
Минимальная задержка |
tWD_FLASH |
4.5 мс |
tWD_EEPROM |
9.0 мс |
tWD_ERASE |
9.0 мс |
Рисунок 145. Осциллограммы сигналов последовательного программирования интерфейса SPI
Таблица 130. Набор инструкций последовательного программирования через 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. |
Прим.:
- a - адрес старших разрядов;
- b - адрес младших разрядов;
- H - 0 - мл. байт, 1 - ст. байт;
- o - вывод данных;
- i - ввод данных;
- x - произвольное значение.
Характеристики последовательного программирования через интерфейс SPI
Характеристики модуля SPI представлены в разделе "Временные характеристики интерфейса SPI".
|