-подать на микроконтроллер напряжение питания;
-подать на вывод RESET напряжение НИЗКОГО уровня и сформировать не менее трех импульсов на выводе XTAL1;
-подать на выводы PAGEL, XA1, ХА0, BS1 напряжение НИЗКОГО уровня на время не менее 100 нс;
-подать напряжение 11.5... 12.5 В на вывод RESET и удерживать напряжение НИЗКОГО уровня на выводах PAGEL, XA1, ХА0, BS1 в течение, как минимум, 10 мкс. Любая активность на указанных выводах в течение этого времени приведет к тому, что микроконтроллер не перейдет в режим программирования выждать не менее 300 мкс перед посылкой следующей команды.
Команда “Стирание кристалла” должна выполняться перед каждым перепрограммированием микроконтроллера. Данная команда полностью уничтожает содержимое FLASH- памяти и EEPROM-памяти, а затем сбрасывает ячейки защиты (записывает в них 1). Однако на состояние конфигурационных ячеек данная команда не влияет. Кроме того, в ряде моделей микроконтроллеров семейства Mega можно предотвратить стирание EEPROM-памяти путем программирования конфигурационной ячейки EESAVE.
Для выполнения команды “Стирание кристалла” необходимо выполнить следующие действия:
-загрузить команду “Стирание кристалла”;
-подать на вывод WR сигнал НИЗКОГО уровня;
-ждать появления на выводе RDY/BSY сигнала ВЫСОКОГО уровня.
Запись FLASH-памяти производится в следующей последовательности:
-загрузить команду “Запись FLASH-памяти”;
1) загрузить младший байт адреса (положение ячейки внутри страницы);
2) загрузить младший байт данных;
3) загрузить старший байт данных;
4) запомнить данные в буфере;
5) повторить пп. 2...5 до полного заполнения буфера страницы;
6) загрузить старший байт адреса (номер страницы);
7) записать страницу.
8) повторить все пункты для записи остальных страниц памяти программ;
9) завершить программирование, загрузив команду “Нет операции”.
Необходимо отметить, что если для адресации ячейки памяти внутри страницы требуется меньше 8 битов (при размере страницы менее 256 слов), то оставшиеся старшие биты младшего байта адреса используются для адресации страницы при выполнении команды “Запись страницы”.
Для чтения FLASH-памяти необходимо выполнить следующие действия:
1) загрузить команду “Чтение FLASH-памяти”;
2) загрузить старший байт адреса;
3) загрузить младший байт адреса;
4) установить ОЕ и BS1 в 0, после этого с шины данных DATA можно будет считать значение младшего байта содержимого ячейки памяти;
5) установить BS1 в 1, после этого с шины данных DATA можно будет считать значение старшего байта содержимого ячейки памяти;
6) установить ОЕ в 1.
Запись EEPROM-памяти производится в следующей последовательности:
1) загрузить команду “Запись EEPROM-памяти”;
2) загрузить старший байт адреса;
3) загрузить младший байт адреса;
4) загрузить байт данных;
5) запомнить данные в буфере;
6) повторить пп. 3...5 до полного заполнения буфера;
7) записать страницу.
Для чтения содержимого EEPROM-памяти необходимо выполнить следующие действия:
1) загрузить команду “Чтение EEPROM-памяти”;
2) загрузить старший байт адреса;
3) загрузить младший байт адреса;
4) установить ОЕ и BS1 в 0, после этого с шины данных DATA можно будет считать содержимое ячейки памяти;
5) установить ОЕ в 1.
Программирование байтов конфигурации микроконтроллеров семейства Mega осуществляется следующим образом.
Младший конфигурационный байт:
1) загрузить команду “Запись конфигурационных ячеек”;
2) загрузить младший байт данных. Если бит сброшен в 0, выполняется программирование соответствующей ячейки, если установлен в 1 – ее сброс;
3) записать младший байт конфигурации.
Старший конфигурационный байт:
1) Загрузить команду “Запись конфигурационных ячеек” (код 0100 0000).
2) Загрузить младший байт данных. Если бит сброшен в 0, выполняется программирование соответствующей ячейки, если установлен в 1 — ее сброс.
3) Записать старший байт конфигурации.
Программирование ячеек защиты выполняется аналогично программированию конфигурационных ячеек:
1) Загрузить команду “Запись ячеек защиты”;
2) Загрузить младший байт данных. Для программирования ячейки соответствующий бит должен быть сброшен в 0. Неиспользуемые биты должны быть всегда установлены в 1;
3) Записать младший байт конфигурации.
Интерфейс JTAG был разработан группой ведущих специалистов по проблемам тестирования электронных компонентов (Joint Test Action Group). В дальнейшем он был зарегистрирован в Институте инженеров по электротехнике и электронике (IEEE) в качестве промышленного стандарта IEEE Std 1149.1-1990 (IEEE Standard Test Access Port and Boundary-Scan Architecture).
Встроенный в большинство микроконтроллеров семейства, интерфейс JTAG может быть использован для следующих целей:
-тестирования печатных плат;
-конфигурирования (программирования) кристалла;
-внутрисхемной отладки.
Рассмотрим непосредственно только один из аспектов использования интерфейса JTAG, а именно программирование микроконтроллеров.
Доступ к модулю JTAG осуществляется через четыре вывода микроконтроллера, составляющих так называемый “порт тестового доступа” (Test Access Port — ТАР): TMS, TCK, TDI и TDO. Стандартная разводка 10-штырькового разъема для подключения JTAG-устройств приведена на рис. 9.4.
Работой модуля JTAG управляет так называемый ТАР-контроллер, представляющий собой конечный автомат с 16 состояниями. Диаграмма состояний ТАР-контроллера приведена на Рис. 14.14. Переход между состояниями осуществляется по нарастающему фронту сигнала ТСК в соответствии с сигналом, присутствующим на выводе TMS. После включения питания контроллер находится в состоянии Test-Logic-Reset.
Рис. 9.4. Разводка разъема JTAG
Разрешение/запрещение интерфейса JTAG осуществляется при помощи конфигурационной ячейки JTAGEN. Если она не запрограммирована (1), то выводы ТАР работают как обычные контакты портов ввода/вывода, а ТАР-контроллер находится в состоянии сброса. Для включения интерфейса ячейка JTAGEN должна быть запрограммирована (состояние по умолчанию). Кроме того, должен быть сброшен бит JTD регистра MCUCSR или MCUCR (рис. 9.5). Причем, для изменения состояния этого бита новое значение необходимо записать в него дважды в течение четырех тактов.
Описанный механизм позволяет использовать выводы ТАР как в качестве контактов портов ввода/вывода при нормальном функционировании микроконтроллера, так и в качестве выводов собственно порта JTAG при программировании кристалла. Разумеется, этот механизм не применим в том случае, если порт JTAG используется для отладки или тестирования.
Рис. 9.5. Регистры MCUCSR/MCUCR применительно к интерфейсу JTAG
Из 16 команд, поддерживаемых интерфейсом, при программировании используются только пять.
AVR_RESET
Эта команда предназначена для перевода микроконтроллера в состояние сброса и соответственно вывода его из этого состояния. В качестве регистра данных выбирается 1-битный регистр сброса (Reset Register). Запись 1 в этот регистр эквивалентна подаче на вывод RESET микроконтроллера напряжения НИЗКОГО уровня. В состоянии сброса микроконтроллер будет находиться до тех пор, пока в регистр сброса не будет записан 0.
PROG_ENABLE
Эта команда предназначена для разрешения программирования кристалла через порт JTAG. В качестве регистра данных выбирается 16-битный регистр разрешения программирования (Programming Enable Register).
При записи в этот регистр числа $А370 (сигнатура разрешения программирования) разрешается программирование микроконтроллера по интерфейсу JTAG. При выходе из режима программирования этот регистр должен сбрасываться.
PROG_COMMANDS
Эта команда предназначена для загрузки команд программирования и выдачи результатов их выполнения (если они есть). В качестве регистра данных выбирается 15-битный регистр команд (Programming Command Register).
PROG_PAGELOAD
Эта команда предназначена для непосредственной загрузки страницы памяти программ через порт JTAG. Реализация этой команды зависит от модели микроконтроллера.
PROG_PAGEREAD
Эта команда предназначена для считывания содержимого страницы памяти программ через порт JTAG. Реализация этой команды также зависит от модели микроконтроллера.