AVR060: протокол JTAG ICE Печать
Добавил(а) microsin   

Здесь приведен перевод апноута Atmel "AVR060: JTAG ICE Communication Protocol" [1]. Описывается протокол обмена между средой разработки AVR Studio® (фронтэнд) и аппаратным отладчиком (эмулятором) JTAG ICE. Затрагиваются следующие темы:

• Команды, которые посылает AVR Studio в JTAG ICE и их детальное описание
• Ответы, которые отправляет JTAG ICE в AVR Studio и их детальное описание
• Описание конфигурируемых параметров
• Описание различных типов памяти
• Специальные символы и форматы пакетов для синхронизации пакета и управления ошибками
• Поддержка в JTAG ICE точек останова (Break Point)

Назначение этого документа - разрешить сторонним фирмам разрабатывать свое собственное программное обеспечение (фронтэнд, интерфейс пользователя), которое может использовать эмулятор JTAG ICE.

Прим. переводчика: эмулятор JTAG ICE в настоящее время является устаревшим, он подключается к компьютеру через интерфейс RS-232 (COM-порт). К отлаживаемому микроконтроллеру подключение осуществляется через JTAG (10-контактный разъем JTAG10 [3]), причем JTAG имеют не все микроконтроллеры AVR. Сейчас вместо JTAG ICE используются отладчики AVR Dragon и JTAGICE mkII [2], подключаемые к компьютеру через USB. Эти отладчики могут работать также и как ISP-программаторы. Подключаются AVR Dragon и JTAGICE mkII к отлаживаемому микроконтроллеру либо через JTAG10, либо через специальный однопроводный интерфейс debugWIRE.

AVR JTAG_ICE AVR JTAG_ICE_clone_elecfreaks

[Команды фронтэнда]

Эта секция содержит описание команд, отправляемых от AVR Studio (это и есть фронтэнд) для управления эмулятором JTAG ICE. Все команды независимые, так что последовательность, с которой выдаются команды, не имеет значения. Все команды сопровождаются 2-байтным словом синхронизации Sync_CRC/EOP. Если было детектировано Sync_CRC/EOP, JTAG ICE подтверждает его ответом Resp_OK. Если не было Sync_CRC/EOP, когда ожидалось, то JTAG ICE ответит Resp_SYNC_ERROR. Это правило применяется ко всем командам. Внимание! На все неизвестные команды JTAG ICE должен выдать ответ Resp_SYNC_ERROR.

Поле формата [BYTE] показывает одиночный символ из 8 бит. Поле формата [WORD] показывает целое 16-битное число без знака (unsigned 16-bit integer).

Cmnd_GET_SIGN_ON - проверка наличия эмулятора. Служит для чтения сообщения подписи (sign-on) из эмулятора, чтобы определить - подключен в настоящее время эмулятор, или нет.

Формат команды: Cmnd_GET_SIGN_ON, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, SIGN_ON_MESSAGE, Resp_OK

Таблица 1. Параметр ответа на команду Cmnd_GET_SIGN_ON.

Имя параметра Использование (описание) содержимого Формат
SIGN_ON_MESSAGE Текстовая строка "AVRNOCD". Она содержит 7 символов, нулевой завершающий символ не используется. [BYTE] * 7

Cmnd_SET_PARAMETER - записать параметр эмулятора. Записывает новую установку в ключевые параметры JTAG ICE. При включении питания эмулятор всегда возвращает все параметры в значения по умолчанию.

Формат команды: Cmnd_SET_PARAMETER, parameter, setting, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно, и запрошенный код параметра распознан): Resp_OK, Resp_OK
Формат ответа (если Sync_CRC/EOP был прочитан успешно, но запрошенный код параметра не распознан): Resp_OK, Resp_FAILED

Примечание: когда записываются параметры скорости обмена, то подтверждение передается перед тем, как скорость обмена будет изменена на новое значение.

Таблица 2. Параметры команды Cmnd_SET_PARAMETER.

Имя параметра Использование (описание) содержимого Формат
Parameter Идентификатор записываемого параметра. [BYTE]
setting Новое значение параметра. [BYTE]

См. раздел "Параметры" и таблицу 23 для описания параметров, которые могут быть записаны.

Cmnd_GET_PARAMETER - прочитать параметр из эмулятора. Читает ключевую установку в JTAG ICE.

Формат команды: Cmnd_GET_PARAMETER, parameter, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно, и запрошенный код параметра распознан): Resp_OK, setting, Resp_OK
Формат ответа (если Sync_CRC/EOP был прочитан успешно, но запрошенный код параметра не распознан): Resp_OK, Resp_FAILED, Resp_FAILED

Таблица 3. Параметры команды Cmnd_GET_PARAMETER.

Имя параметра Использование (описание) содержимого Формат
Parameter Идентификатор параметра для чтения. [BYTE]
setting Значение параметра. [BYTE]

См. раздел "Параметры" и таблицу 23 для описания параметров, которые могут быть прочитаны.

Cmnd_WRITE_MEMORY - записать память. Позволяет записывать регистры, область ввода/вывода (I/O), ячейки памяти SRAM, EEPROM и памяти программ (FLASH). Имейте в виду, что память не может быть записана, когда эмулятор находится в режиме Run. Команда Cmnd_WRITE_MEMORY работает совместно с командой Cmnd_DATA, которая содержит блок актуальных данных.

Формат команды: Cmnd_WRITE_MEMORY, memory type, word count, start address, Sync_CRC/EOP, Cmnd_DATA, word0, word1 (....) wordn.
Формат ответа: на каждый успешно прочитанный Sync_CRC/EOP выдается ответ Resp_OK.

AVR Studio должна детектировать поступление Resp_OK перед тем, как блок данных записывается в эмулятор. Эмулятор не ожидает никакие данные, следующие за сообщением Resp_SYNC_ERROR, если Sync_CRC/EOP не был успешно прочитан. В этом случае запись блока данных (командой Cmnd_DATA) может привести к неожиданному поведению эмулятора.

Таблица 4. Параметры команды Cmnd_WRITE_MEMORY.

Имя параметра Использование (описание) содержимого Формат
Memory Type Тип памяти. [BYTE]
Word Count Количество слов в пакете минус 1 (0 означает 1 слово, 1 означает 2 слова, 255 означает 256 слов). [BYTE]
Start Address Начальный адрес памяти. [BYTE]*3, MSB идет первым
Word0 .. WordN Слова, записываемые в память. [BYTE] или [WORD](1)

Примечание(1): см. "Типы памяти" и таблицу 25 для описания типов памяти.

Cmnd_READ_MEMORY - чтение памяти. Позволяет читать регистры, SRAM, область I/O, EEPROM, память программ (FLASH) и регистр останова (Break Register). Имейте в виду, что память не может быть прочитана, когда эмулятор находится в режиме Run.

Формат команды: Cmnd_READ_MEMORY, memory type, word count, start address, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был успешно прочитан, и все байты были также успешно прочитаны): Resp_OK, word0, word1, … , wordn, checksum, Resp_OK
Формат ответа (если Sync_CRC/EOP был успешно прочитан, но эмулятор не смог прочитать данные): Resp_OK, word0, word1, … , wordn, checksum, Resp_FAILED

Примечание: если по какой-то причине эмулятор не смог прочитать данные, то все равно будет возвращено корректное количество слов, так что вся система останется в режиме синхронизации (обмена). AVR Studio должен определить ошибку по ответу Resp_FAILED.

Таблица 5. Параметры команды Cmnd_READ_MEMORY.

Имя параметра Использование (описание) содержимого Формат
Memory Type Тип памяти. [BYTE]
Word Count Количество слов в пакете минус 1 (0 означает 1 слово, 1 означает 2 слова, 255 означает 256 слов). [BYTE]
Start Address Начальный адрес памяти. [BYTE]*3, MSB идет первым
Word0 .. WordN Слова, прочитанные из памяти. [BYTE] или [WORD](1)
Checksum В настоящее время в JTAG ICE не реализована проверка контрольной суммы. Будет отправлено 0x00. [BYTE]

Примечание(1): память программ (Program Memory): одно слово состоит из 2 байт, в которых старший байт (MSB) идет первым. Все другие типы памяти: 1 байт.

См. "Типы памяти" и таблицу 25 для описания типов памяти.

Cmnd_WRITE_PC - запись значения счетчика команд. Команда записывает новое значение в AVR Program Counter. Имейте в виду, что Program Counter нельзя записать, когда эмулятор находится в режиме Run.

Формат команды: Cmnd_WRITE_PC, program counter, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, Resp_OK

Таблица 6: параметры команды Cmnd_WRITE_PC.

Имя параметра Использование (описание) содержимого Формат
Program Counter Новое значение для счетчика команд программы. [BYTE]*3, MSB идет первым (1)

Примечание(1): имейте в виду, что Program Counter в JTAG ICE всегда 16-битный, так что старший байт будет игнорирован. Но он все равно должен быть передан.

Cmnd_READ_PC - чтение счетчика команд. Команда читает текущее значение Program Counter. Имейте в виду, что Program Counter нельзя прочитать, пока эмулятор находится в режиме Run.

Формат команды: Cmnd_READ_PC, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно, и счетчик команд был возвращен успешно): Resp_OK, program counter, Resp_OK
Формат ответа (если Sync_CRC/EOP был прочитан успешно, но счетчик команд не был определен): Resp_OK, 0XAA55AA, Resp_FAILED

Таблица 7. Параметры команды Cmnd_READ_PC.

Имя параметра Использование (описание) содержимого Формат
Program Counter Текущее значение счетчика команд программы. [BYTE]*3, MSB идет первым (1)

Примечание(1): имейте в виду, что Program Counter в JTAG ICE всегда 16-битный, так что старший байт будет прочитан как 0x00. Он все равно должен быть передан.

Cmnd_GO - запуск программы. Приводит к выполнению программы начиная с текущего адреса в Program Counter.

Формат команды: Cmnd_GO, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно, и выполнение началось): Resp_OK, Resp_OK

Cmnd_SINGLE_STEP - один шаг. Запускает выполнение одной инструкции по текущему адресу Program Counter.

Формат команды: Cmnd_SINGLE_STEP, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, Resp_OK

Cmnd_FORCED_STOP - останов выполнения программы.

Формат команды: Cmnd_FORCED_STOP, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, program counter, checksum, Resp_OK

Таблица 10. Параметры ответа на команду Cmnd_FORCED_STOP.

Имя параметра Использование (описание) содержимого Формат
Program Counter Текущее значение счетчика команд программы. [BYTE]*3, MSB идет первым
Checksum См. таблицу 5. [BYTE]

Cmnd_RESET - сброс программы пользователя. Эмулятор выполняет все действия, которые необходимы для перезапуска выполнения программы. При этом все регистры и порты ввода/вывода микроконтроллера возвращаются в состояние по умолчанию (эмулируется аппаратный сброс, аналогичный включению питания).

Формат команды: Cmnd_RESET, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно, и был выполнен сброс программы): Resp_OK, Resp_OK

Cmnd_GET_SYNC - получить синхронизацию. Эта команда отправляется AVR Studio для того чтобы добиться синхронизации обмена с JTAG ICE, если она была потеряна.

Формат команды: Cmnd_GET_SYNC
Формат ответа: Resp_OK

Cmnd_GET_DEBUG_INFO - прочитать информацию отладки. Возвращает 0x00. Эта команда функционально не реализована, и является заглушкой для будущего использования.

Формат команды: Cmnd_GET_DEBUG_INFO, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, checksum, Resp_OK

Таблица 13. Параметры ответа на команду Cmnd_GET_DEBUG_INFO.

Имя параметра Использование (описание) содержимого Формат
Checksum См. таблицу 5. [BYTE]

Cmnd_Set_Device_Descriptor - установить описатель устройства (Device Descriptor). AVR Studio отправляет через устройство AVR специальную информацию.

Формат команды: Cmnd_Set_Device_Descriptor, Structure, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, Resp_OK

Таблица 14. Параметры команды Cmnd_Set_Device_Descriptor.

Имя параметра Использование (описание) содержимого Формат
Structure Информация, специфичная для устройства (отлаживаемого микроконтроллера). [BYTE]*123

Примечание: см. таблицу 30 "Описание устройства", описывающую действительное содержимое структуры.

Cmnd_ERASEPAGE_SPM - Erase Page SPM. Очищает целиком страницу памяти FLASH с использованием инструкции SPM. Эта команда совместно с командами чтения памяти Cmnd_READ_MEMORY и записи памяти Cmnd_WRITE_MEMORY.

Формат команды: Cmnd_ERASEPAGE_SPM, PageAddress, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, Resp_OK

Таблица 15. Параметры команды Cmnd_ERASEPAGE_SPM.

Имя параметра Использование (описание) содержимого Формат
PageAddress Адрес первого байта очищаемой страницы. [WORD]

CmndFirmwareUpgrade - обновление программного обеспечения (Firmware Upgrade). Принуждает JTAG ICE перейти в режим обновления встроенного программного обеспечения (Upgrade mode). В этом режиме AVR Prog может подключиться к эмулятору и обновить firmware JTAG ICE.

Формат команды: CmndFirmwareUpgrade, string, Sync_CRC/EOP
Формат ответа (если Sync_CRC/EOP был прочитан успешно): Resp_OK, Resp_OK

Таблица 16. Параметры команды CmndFirmwareUpgrade.

Имя параметра Использование (описание) содержимого Формат
String Строка, сигнализирующая об обновлении "JTAGupgr". [BYTE]*8

[Ответы JTAG ICE]

В этой секции описываются ответы, которые посылает JTAG ICE к AVR Studio. Большинство ответов отправляются как результат принятых команд. Ответы Resp_BREAK, Resp_INFO и Resp_SLEEP отправляются из режима Run. Значения ответов перечислены в таблице 27.

Resp_OK - OK. Положительное подтверждение для AVR Studio. Resp_OK будет отправлен после детектирования Sync_CRC/EOP, и после корректного выполнения допустимой команды.

Resp_FAILED - ошибка. Этот ответ отправляется, если выполнение команды потерпело неудачу.

Resp_SYNC_ERROR - ошибка синхронизации. Отправляется в сторону AVR Studio, когда в обмене потеряна синхронизация. Resp_SYNC_ERROR отправляется, когда ожидался, но не был детектирован Sync_CRC/EOP. AVR Studio пытается заново восстановить синхронизацию путем постоянных отправок команды Cmd_GET_SYNC. Если JTAG ICE детектировал команду Cmd_GET_SYNC, то он должен подтвердить её ответом Resp_OK.

Resp_BREAK - останов, Break. Отправляется, если программа останавливается по точке останова.

Формат ответа: Resp_BREAK, status

Таблица 20. Параметры ответа Resp_BREAK.

Имя параметра Использование (описание) содержимого Формат
Status Слово состояния (статус) JTAG ICE. [WORD]

Resp_INFO - информация. Если IDR не чист, то IDR будет прочитан и значение передано в AVR Studio.

Формат ответа: Resp_INFO, IDR, Resp_OK

Таблица 21. Параметры ответа Resp_INFO.

Имя параметра Использование (описание) содержимого Формат
IDR Байт JTAG ICE IDR. [BYTE]

Resp_SLEEP - сон (Sleep). Если отлаживаемое ядро AVR (AVR MCU) выполняет инструкцию SLEEP (вход в режим сна, или режим пониженного энергопотребления), или возобновляет выполнение после сна, то JTAG ICE детектирует это событие и отправляет соответствующий ответ Resp_SLEEP.

Формат ответа: Resp_SLEEP, status, Resp_OK

Таблица 22. Параметры ответа Resp_SLEEP.

Имя параметра Использование (описание) содержимого Формат
Status Индицирует состояние сна (TRUE или FALSE). [BYTE]

[Параметры]

Командами Cmd_GET_PARAMETER и Cmd_SET_PARAMETER могут быть прочитаны/записаны следующие параметры, значение которых перечислены в таблице 23.

Таблица 23. Ключевые параметры JTAG ICE.

Имя параметра Описание Read/Write Формат поля
Baud Rate Определяет скорость обмена данными через RS-232 (скорость COM-порта). R/W [BYTE]
Flash Page size Устанавливает текущий размер страницы памяти FLASH. W [WORD]
EEPROM Page size Устанавливает текущий размер страницы памяти EEPROM. W [BYTE]
Hardware Version(1) Определяет текущую версию аппаратуры. Для JTAG ICE V1.10 значение параметра равно 0x40. R [BYTE]
Software Version(1) Определяет текущую версию программного обеспечения (firmware). Для JTAG ICE V1.10 значение параметра равно 0x72, но оно может поменяться с выходом нового релиза программы. R [BYTE]
JTAG ID Byte0, 1, 2, и 3. Индицирует JTAG ID для эмулируемого устройства. ID сохраняется в структуре в AVR Studio. ID имеет длину 4 байта. R [BYTE]
Timers Running Разрешение запуститься для таймеров. W [BYTE]
Units Before Количество юнитов спереди, с которыми будет обмениваться AVR. По умолчанию 0. W [BYTE]
Units After Количество юнитов после, с которыми будет обмениваться AVR. По умолчанию 0. W [BYTE]
Bit Before Количество IR-битов спереди AVR. По умолчанию 0. W [BYTE]
Bit After Количество IR-битов после AVR. По умолчанию 0. W [BYTE]
Change of Flow Смена потока (выполнения). CPU устанавливается в режим останова (Stopped mode), когда сработало условие останова Break Point. W [BYTE]
OCD Vtarget Изменение напряжения питания отлаживаемой цели (target, имеется в виду отлаживаемый AVR). R [BYTE]
OCD JTAG Clock Определяет тактовую частоту JTAG. Она составляет ? от тактовой частоты источника. R/W [BYTE]
Break Address 1 H/L Адрес точки останова 1. W [BYTE]
Break Address 2 H/L Адрес точки останова 2. W [BYTE]
Combined Break Control Комбинированное управление остановом. Значение, записываемое в регистр Break Control Register (BCR). Этот параметр вызывается после установки Break Address 1 и 2. R/W [BYTE]
IReg H/L Используется средой разработки AVR Studio для того, чтобы поместить инструкцию в цепочку сканирования JTAG (scan chain). Чтобы избежать износа (уменьшение количества возможных перезаписей) FLASH, это значение помещается во внутреннюю цепочку сканирования и выполняется немедленно, вместо того чтобы записывать во FLASH. Используется при работе с инструкцией останова AVR (AVR Break Instruction). R/W [WORD]
OCD Break Cause Позволяет получить значение регистра состояния останова Break Status Register. R [BYTE]
External Reset Выполняет внешний сброс путем принудительного перевода вывода nSRST в состояние лог. 0. W [BYTE]
MCU_mode Используется средой AVR Studio, чтобы определить, в каком режиме находится AVR - в режиме работы (Run mode) или в режиме останова (Stopped mode). R [BYTE]
PSB0 H/L Используется для установки 16-битного адреса в регистре сравнения (Compare Register). Когда счетчик команд (PC, Program Counter) достигнет этого значения, то произойдет останов (сработает Break Point). W [BYTE]
PSB1 H/L То же самое, что и в PSB0 H/L. W [BYTE]

Примечание(1): значение этого параметра в AVR Studio можно прочитать в подсказке Help -> About AVR Studio -> Info.

Таблица 24. Значения параметра скорости обмена (Baud Rate), бит/сек.

Значение параметра Скорость
0xFF 115200
0xFE 57600
0xFD 38400
0xFA 19200
0xF8 14400
0xF4 9600

[Типы областей памяти (Memory Types)]

Следующие типы памяти поддерживаются JTAG ICE для использования совместно с командами Cmnd_WRITE_MEMORY и Cmnd_READ_MEMORY.

Таблица 25. Константы типов памяти [MEM_TYPE].

Область памяти Значение MEM_TYPE
SRAM 0x20
EEPROM 0x22
PML(2) 0xA0
BreakReg 0x90
IOShadow 0x30
FLASH_JTAG(1) 0xB0
EEPROM_JTAG(1) 0xB1
FUSE_JTAG(1) 0xB2
LOCK_JTAG(1) 0xB3
SIGN_JTAG(1) 0xB4
OSCAL_JTAG(1) 0xB5

Примечания: (1) Доступ к памяти этих типов будет происходить через интерфейс программирования JTAG (JTAG Programming Interface). Устройство (target device, микроконтроллер, подключенный к JTAG ICE) должно находиться в режиме программирования (Programming mode) перед использованием этих команд. FLASH_JTAG является типом памяти, когда программа выгружается в целевое устройство (target device).
(2) PML доступ к FLASH с использованием инструкций SPM и LPM. Запись основывается на базе страниц, и вся страница целиком должна быть очищена перед записью в неё (очистка страницы производится командой Cmnd_ERASEPAGE_SPM).

Если AVR Studio выдает команды прочитать память (Read Memory) или записать память (Write Memory) с типом памяти SRAM, то можно выполнить 3 различные действия в зависимости от диапазона адреса. Если адрес в диапазоне 0x0000 .. 0x001F, то JTAG ICE должен захватить данные из файла рабочих регистров общего назначения (General Purpose Working Register file). Если адрес в диапазоне 0x0020 .. 0x005F, то данные должны быть захвачены из файла регистров ввода/вывода (IO Register file). Если AVR поддерживает расширенные регистры ввода/вывода (Extended IO Registers), и то тогда диапазон адреса 0x0060 .. 0x00FF, данные должны быть захвачены из файла расширенных регистров ввода/вывода (External IO Register file).

Если адрес вне диапазона 0x005F и не используется файл расширенных регистров ввода/вывода (External IO Register file), то данные будут захватываться из Internal/External SRAM. Если файл расширенных регистров ввода/вывода (External IO Register file) используется, то адрес должен вне диапазона 0x0FF, чтобы данные захватывались из Internal/External SRAM.

Тип памяти EEPROM_JTAG использует страничную запись (page write) или запись байта (byte write) и чтение байта (byte read). Типы памяти FUSE_JTAG, LOCK_JTAG, SIGN_JTAG и OSCAL_JTAG используют чтение байта (и запись).

Адреса, отправленные в JTAG ICE являются адресом слова для памяти программ (Program Memory) и адресом байта для всех других типов памяти. Должны быть предоставлены только начальный адрес и количество байт для чтения/записи.

Программа эмулятора сообщает об ошибках чтения памяти как Resp_FAILED. Чтение и запись неизвестных типов памяти игнорируется.

[Синхронизация]

Sync_CRC/EOP - это специальная порция из 2 байт, которая помещается в конец всех пакетов, которые передаются от компьютера PC в JTAG ICE. Проверка CRC не реализована в JTAG ICE, так что эти 2 байта всегда будут прочитаны как 0x20 0x20. Когда JTAG ICE их продетектировал, то он должен на них ответить Resp_OK. Внимание! От PC не будет выполняться никакая отправка команд, пока не будет подтвержден Sync_CRC/EOP. JTAG ICE будет искать эти 2 байта в конце каждой отправленной от PC команды. Если по какой-то причине JTAG ICE примет некие символы, отличающиеся от ожидаемого Sync_CRC/EOP, то JTAG ICE ответит отправкой Resp_SYNC_ERROR.

Восстановление синхронизации (Synchronization Recovery). Если JTAG ICE не прочитал Sync_CRC/EOP когда ожидалось, то он автоматически принимает, что произошла рассинхронизация с PC. В этом случае JTAG ICE прервет выполнение команды и возвратит к PC сообщение Resp_SYNC_ERROR. Когда JTAG ICE детектирует допустимую команду Cmnd_GET_SYNC, то ответит на неё Resp_OK. Если PC не принял Resp_OK от JTAG ICE, то PC должен постоянно посылать команды Cmnd_GET_SYNC, пока не получит подтверждение.

[Точки останова (Break Points)]

Система OCD (расшифровывается On Chip Debug, встроенная в чип система отладки) использует компараторы точки останова (Break Point Comparators) для установки Break Point. Узел управления Break Point содержит две одиночные точки останова на памяти программ (single Program Memory Break Point), и две комбинированные точки останова (combined Break Point). Всего могут быть сконфигурированы до 4 точек останова следующими способами (при этом для пошагового выполнения всегда задействована одна Break Point):

• 4 одиночные точки останова на программе (Program Memory Break Point)
• 3 одиночные точки останова на программе + 1 одиночная точка останова на памяти данных (Data Memory Break Point)
• 2 одиночные точки останова на программе + 2 одиночные точки останова на памяти данных
• 2 одиночные точки останова на программе + 1 точка останова на программе с маской (Program Memory Break Point with mask, так называемая точка останова с диапазоном, "range Break Point")
• 2 одиночные точки останова на программе + 1 точки останова на памяти данных с маской (Data Memory Break Point with mask, "range Break Point")

Data Memory Break Point может быть установлена в один из трех режимов Data Memory Read, Data Memory Write или Data Memory Read or Write. Data Memory break устанавливает AVR CPU в режим останова (Stopped mode) после завершения инструкции, которая привела к выполнению условия точки останова. Условие останова по содержимому данных не поддерживается.

Система OCD содержит разные регистры в узле управления точками останова (Break Point control unit).

PSBO и PSB1 – Program Break на одиночный адрес, это 16-bit регистры сравнения для счетчика программ (Program Counter) CPU.

PDMSB – Program/Data Mask or Single Break, это регистр, используемый для установки одиночной точки останова в программе либо на адрес памяти программ, либо на адрес памяти данных. Альтернативно PDMSB может действовать как маска на адресе для компаратора PDSB, что реализует точку останова на диапазоне (range-break).

PDSB – Program/Data Single Break, используется для установки одиночной точки останова либо на адрес памяти программ, либо на адрес памяти данных. Альтернативно PDSB может замаскировать адрес для компаратора PDSB, что реализует точку останова на диапазоне (range-break).

BCR – Break Control Register, кроме всего прочего этот регистр используется для управления установками четырех различных вышеупомянутых регистра останова.

Для установа Break Point-ов в JTAG ICE AVR Studio использует команду Cmnd_setParameter и параметры PSB0 H/L и PSB1 H/L для установки регистров PSB0 или PSB1. В этом случае адрес в команде установки параметра является адресом, на котором будет размещена Break Point, и значение показывает должен ли быть установлен PSB0 или PSB1 Break Point на этом месте (0 = PSB0, 1 = PSB1). Необходимая модификация BCR выполняется автоматически.

CmndSetParameter и Parameter BreakAddr устанавливают регистры PDMSB и PDSB. В этом случае BCR автоматически не модифицируется. Чтобы активизировать PDMSB и PDSB Break Point-ы, должна использоваться команда CmndSetParameter и параметр CombBreakCtrl для установки BCR в нужное значение.

Когда JTAG ICE останавливается, то все Break Point-ы очищаются, так что перед каждым запуском должны быть установлены все Break Point-ы. Так что команда очистки точек останова не нужна (Clear Break Points).

[Общий обзор протокола JTAG ICE]

Здесь для ясности подводится итог описания JTAG ICE Communication Protocol. Жирным шрифтом показаны данные, которые отправляет JTAG ICE.

Таблица 26. Команды протокола JTAG ICE.

Hex Команда Последовательность
0x20 Get Synch [Resp_OK]
0x31 Single Step [Sync_CRC/EOP] [Resp_OK]
0x32 Read PC [Sync_CRC/EOP] [Resp_OK] [program counter] [Resp_OK]
0x33 Write PC [program counter] [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0xA2 Firmware Upgrade [upgrade string] [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0xA0 Set Device Descriptor [device info] [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0x42 Set Parameter [parameter] [setting] [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0x46 Forced Stop [Sync_CRC/EOP] [Resp_OK] [checksum][program counter] [Resp_OK]
0x47 Go [Sync_CRC/EOP] [Resp_OK]
0x52 Read Memory [memory type] [word count] [start address] [Sync_CRC/EOP] [Resp_OK] [word 0] ... [word n] [checksum] [Resp_OK]
0x53 Get Sign On [Sync_CRC/EOP] [Resp_OK] ["AVRNOCD"] [Resp_OK]
0xA1 Erase Page spm [address] [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0x57 Write Memory [memory type] [word count] [start address] [Sync_CRC/EOP]
[Resp_OK] [Cmd_DATA] [word 0] ... [word n]
0x64 Get Debug Info [Sync_CRC/EOP] [Resp_OK] [0x00] [Resp_OK]
0x71 Get Parameter [parameter] [Sync_CRC/EOP] [Resp_OK] [setting] [Resp_OK]
0x78 Reset [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0xA3 Enter Progmode [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0xA4 Leave Progmode [Sync_CRC/EOP] [Resp_OK] [Resp_OK]
0xA5 Chip Erase [Sync_CRC/EOP] [Resp_OK] [Resp_OK]

Таблица 27. Расшифровка кодов ответа.

Hex ASCII Ответ Последовательность
0x41 A OK  
0x42 B Break [Resp_Break] [break status register H] [break status register L]
0x47 G Info [IDR dirty] [Resp_INFO] [IDR] [Resp_OK]
0x46 F Failed  
0x45 E Sync Error getchar() != Sync_EOP
0x48 H Sleep  
0x49 I Power -

Таблица 28. Имена параметров.

Hex ASCII Параметр Значение в JTAG ICE
0x7A   Hardware Version  
0x81   Ireg High  
0x82   Ireg Low  
0x62 b Baudrate  
0x7B { SwVersion 0x68
0x84   OCD Vtarget  
0x86   OCD JTAG Clock ? от тактовой частоты устройства.
0x87   OCD Break cause  
0xA0   Timers Running  
0xA1   Change of Flow  
0xA2   Break Addr1H  
0xA3   Break Addr1L  
0xA4   Break Addr2H  
0xA5   Break Addr2L  
0xA6   CombBreakCtrl  
0xA7   JTAGIDByte0 Специфично для устройства.
0xA8   JTAGIDByte1 Специфично для устройства.
0xA9   JTAGIDByte2 Специфично для устройства.
0xAA   JTAGIDByte3 Специфично для устройства.
0xAB   Units Before  
0xAC   Units After  
0xAD   Bit Before  
0xAE   Bit After  
0x8B   External Reset  
0x88   Flash PageSizeL Специфично для устройства.
0x89   Flash PageSizeH Специфично для устройства.
0x8A   EEPROM PageSize Специфично для устройства.
0xB3   MCU_mode  
0xAF   PSB0L  
0xB0   PSB0H  
0xB1   PSB1L  
0xB2   PSB1H  

Таблица 29. Типы памяти.

Память Адрес
SRAM 0x20
EEPROM 0x22
Event L 0x60
PML 0xA0
Break Reg 0x90
IO Shadow 0x30
FLASH_JTAG 0xB0
EEPROM_JTAG 0xB1
FUSE_JTAG 0xB2
LOCK_JTAG 0xB3
SIGN_JTAG 0xB4
OSCAL_JTAG 0xB5

Таблица 30. Описание устройства (Device Description).

Device Значения структуры
ATmega16 0xCF,0xAF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,
0x87,0x26,0xFF,0xEF,0xFE,0xFF,0x3F,0xFA,
0x00,0x00,0x00,0x00,0x00,0x2F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x2F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x31,0x57,0x00, 128,  0,  0,  0x80,0x1F,0x00,0x00, 0
ATmega162 0xF7,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF3,0x66,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x18,0x00,0x30,0xF3,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x02,0x18,0x00,0x20,0xF3,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x04,0x57,0x00, 128, 0,   4,  0x80,0x1F,0x00,0x00,0x8B
ATmega169 0xFF,0xFF,0xFF,0xF0,0xDF,0x3C,0xBB,0xE0,
0xB6,0x6D,0x1B,0xE0,0xDF,0x3C,0xBA,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x43,0xDA,0x00,0xFF,0xF7,0x0F,0x00,0x00,0x00,0x00,0x4D,0x07,0x37,0x00,0x00,0x00,
0xF0,0xF0,0xDE,0x7B, 0x43,0xDA,0x00,0xFF,0xF7,0x0F,0x00,0x00,0x00,0x00,0x4D,0x05,0x36,0x00,0x00,0x00,
0xE0,0xF0,0xDE,0x7B, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x31,0x57,0x00, 128, 0,   4,  0x80,0x1F,0x00,0x00,0xFE
ATmega323 0xCF,0xAF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,
0x87,0x26,0xFF,0xEF,0xFE,0xFF,0x3F,0xFA,
0x00,0x00,0x00,0x00,0x00,0x2F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x2F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x31,0x57,0x00, 128, 0,   0,  0x00,0x3F,0x00,0x00, 0
ATmega32 0xFF,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x66,0xFF,0xFF,0xFF,0xFF,0xBF,0xFA,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x31,0x57,0x00, 128, 0,   4,  0x00,0x3F,0x00,0x00, 0
ATmega64 0xCF,0x2F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xCF,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3E,0xB5,0x1F,0x37,0xFF,0x1F,0x21,0x2F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x3E,0xB5,0x0F,0x27,0xFF,0x1F,0x21,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x22,0x68,0x00,0x00,0x10,0x08,0x00,0x7E,0x00,0x00,0x9D
ATmega128 0xCF,0x2F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xCF,0x27,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3E,0xB5,0x1F,0x37,0xFF,0x1F,0x21,0x2F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x3E,0xB5,0x0F,0x27,0xFF,0x1F,0x21,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0x22,0x68,0x3B, 0,   1,   8,  0x00,0xFE,0x00,0x00,0x9D

[Ссылки]

1. AVR060: JTAG ICE Communication Protocol site:atmel.com.
2. Atmel AVR JTAGICE mkII.
3. Цоколевка интерфейсов JTAG.
4HappyJTAG: простой интерфейс JTAG для AVR.
5HappyJTAG2: JTAG и ISP для AVR.