AVR061: старая версия протокола обмена STK500 |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Здесь приведен перевод апноута AVR061: STK500 Communication Protocol [1], посвященного ранней версии протокола обмена STK500. В апноуте AVR068 [2] описывается версия новая версия 2.0 протокола STK500, содержащая некоторые дополнения к оригинальной старой версии (в частности, новая версия поддерживает одновременно STK500 и AVRISP, введены номер последовательности пакета и контрольная сумма). [Что такое STK500] Прим. переводчика: под STK500 часто понимают как стартеркит STK500 [3], так и протокол [1], который он поддерживает. Стартеркит STK500 - это специальная плата, позволяющая макетировать устройства на различных микроконтроллерах AVR, разрабатывать программы для них, прошивать память программ и данных микроконтроллеров, фьюзы и биты защиты. Пошаговая отладка не поддерживается, отлаживать программы firmware можно только с помощью отладочного вывода через UART и методом написал-прошил-проверил. Таким образом, стартеркит STK500 имеет в своем составе программатор микроконтроллеров AVR, и протокол STK500 по сути и предназначен для управления этим программатором. Стартеркит STK500 подключается к компьютеру через стандартный порт RS232 (COM-порт). Для подключения через USB нужно использовать переходники USB-COM порт (виртуальный COM-порт, класс USB CDC). Некоторые программаторы микроконтроллеров AVR поддерживают протокол STK500 поверх подключения по USB. Протокол STK500 поддерживает open source утилита AVRDUDE, которая может работать на *nix компьютерах (Linux, FreeBSD) и Mac OS, это позволяет использовать стартеркит STK500 или поддерживающий этот одноименный протокол программатор на других операционных системах, не только под Windows. Протокол STK500 предназначен для обмена между компьютером PC (с запущенной на нем средой разработки и программирования AVR Studio) и стартер-китом STK500. Протокол основан на более ранних разработках (прим. переводчика: см. STK200, AVR910, AVR911), и полностью совместим с ними, так что не должно быть переназначения или перекрытия команд. Последующие секции подробно описывают каждую часть протокола. Все команды и ответы на команды являются стандартными символами ASCII в диапазоне 0x00 .. 0x7F. Данные могут быть любыми символами в диапазоне 0x00 .. 0xFF. Определения всех команд, ответов, параметров и других заданных величин можно найти в файле commamd.h. Коды устройств можно найти в файле devices.h. Эти файлы можно найти в секциях сайта Atmel, посвященных программному обеспечению, или см. [4], папка AVR061 архива. В конце статьи будет приведен обзор по информации кодов устройств, сигнатуры, биты фьюзов (fuse bits), биты защиты (lock bits) каждого из поддерживаемых в настоящее время устройств. "Устройства" - это микроконтроллеры AVR (megaAVR, tinyAVR). Прим. переводчика: программатор микроконтроллеров AVR (или загрузчик bootloader) может эмулировать поведение стартеркита STK500, тогда обычно говорят, что программатор поддерживает протокол STK500. Поддержка протокола STK500 программатором (или бутлоадером) позволяет добиться совместимости с популярной средой разработки AVR Studio. Это дает возможность программировать микроконтроллеры через встроенную в AVR Studio утилиту программирования AVRISP (как с графическим интерфейсом, так и с помощью утилиты командной строки). [Определения ответов STK500 (Response Definitions)] Эта секция описывает значения допустимых ответов от стартеркита STK500. Некоторые из ответов будут частями более сложных ответов, также содержащих данные, в зависимости от команды.
[Определения команд (Command Definitions)] В этой секции описаны команды, которые распознает и обрабатывает стартеркит STK500. Check if Starterkit Present. Команда проверяет наличие подключенного к PC (через канал обмена RS-232 или виртуальный COM-порт, класс USB CDC). Формат команды: Cmnd_STK_GET_SIGN_ON, Sync_CRC_EOP Таблица 1. Параметры Cmnd_STK_GET_SIGN_ON.
Get Synchronization. Эта команда используется для того, чтобы попытаться восстановить синхронизацию, когда она потеряна. Эта команда будет периодически отправляться, пока не будет получен ответ Resp_STK_INSYNC. Формат команды: Cmnd_STK_GET_SYNC, Sync_CRC_EOP Get Parameter Value. Получение значения допустимого параметра стартеркита STK500. Если параметр не используется, то будет возвращен тот же параметр совместно с ответом Resp_STK_FAILED для указания на ошибку. См. в статье секцию "Определения параметров" для информации по допустимым параметрам и что они означают. Формат команды: Cmnd_STK_GET_PARAMETER, parameter, Sync_CRC_EOP Таблица 3. Параметры Cmnd_STK_GET_PARAMETER.
Set Parameter Value. Установка значения допустимого параметра в стартерките STK500. См. в статье секцию Параметры для информации по допустимым параметрам и что они означают. Формат команды: Cmnd_STK_SET_PARAMETER, parameter, value, Sync_CRC_EOP Таблица 4. Параметры Cmnd_STK_SET_PARAMETER.
Set Device Programming Parameters. Установка параметров программирования для текущего устройства. Эти параметры должны быть установлены перед тем, как стартеркит может войти в режим программирования (Programming mode). Формат команды: Cmnd_STK_SET_DEVICE, devicecode, revision, progtype, parmode, polling, selftimed, lockbytes, fusebytes, flashpollval1, flashpollval2, eeprompollval1, eeprompollval2, pagesizehigh, pagesizelow, eepromsizehigh, eepromsizelow, flashsize4, flashsize3, flashsize2, flashsize1, Sync_CRC_EOP Таблица 5. Параметры Cmnd_STK_SET_DEVICE.
Set Extended Device Programming Parameters. Устанавливает расширенные параметры программирования для текущего устройства. Формат команды: Cmnd_SET_DEVICE_EXT, commandsize, eeprompagesize, signalpagel, signalbs2, Synch_CRC_EOP Таблица 6. Параметры Cmnd_SET_DEVICE_EXT.
Enter Program Mode. Вход в режим программирования для выбранного устройства. Перед вызовом этой команды предварительно должны быть установлены командой Cmnd_STK_SET_DEVICE режим программирования и параметры программирования устройства. В противном случае команда Cmnd_STK_ENTER_PROGMODE потерпит неудачу, и будет возвращен ответ Resp_STK_NODEVICE. Leave Program Mode. Команда производит вывод стартеркита из режима программирования. Chip Erase. Производит очистку памяти программируемого устройства. Check for Address Autoincrement. Проверка - используется ли автоматический инкремент адреса при использовании команд Cmnd_STK_PROG/READ_FLASH/EEPROM. Поскольку STK500 всегда автоматически инкрементирует адрес, то результат выполнения этой команды всегда один и тот же - положительный. Load Address. Команда загружает в стартеркит 16-битный адрес. Эта команда используется для установки адреса последующих операций чтения или записи памяти FLASH (non-volatile, энергонезависимая память программ) или EEPROM (non-volatile, энергонезависимая память данных). Команда загрузки адреса всегда должна использоваться до вызова команд Cmnd_STK_PROG_PAGE или Cmnd_STK_READ_PAGE. Таблица 11. Параметры Cmnd_STK_LOAD_ADDRESS.
Program Flash Memory. Программирует одно слово (2 байта) в память FLASH. Прим. переводчика: память FLASH почти всегда используется для хранения программы (firmware) и/или констант в платформе микроконтроллеров AVR. Если это программа, то 1 слову (2 байтам) памяти FLASH соответствует одна инструкция исполняемого кода AVR (иногда это часть инструкции). Если это данные, то 1 слову соответствуют 2 байта данных констант. Формат команды: Cmnd_STK_PROG_FLASH, flash_low, flash_high, Sync_CRC_EOP Таблица 12. Параметры Cmnd_STK_PROG_FLASH.
Program Data Memory. Программирует 1 байт в память EEPROM (non-volatile, энергонезависимая память данных). Формат команды: Cmnd_STK_PROG_DATA, data, Sync_CRC_EOP Таблица 13. Параметры Cmnd_STK_PROG_DATA.
Program Fuse Bits. Программирует биты фьюзов. Назначение битов фьюзов поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Примечание: для программирования ISP используйте команду Cmnd_STK_UNIVERSAL с соответствующими байтами команды ISP (можно найти в даташите на программируемое устройство). Прим. переводчика: fuse переводится как "плавкий предохранитель", "перемычка". Биты фьюзов предназначены для энергонезависимой установки режима работы микроконтроллера AVR - выбор тактового генератора, тип используемого резонатора, наличие поддержки boot-секции, разрешена ли отладка, разрешено ли ISP-программирование и т. п. Формат команды: Cmnd_STK_PROG_FUSE, fuse_low, fuse_high, Sync_CRC_EOP Таблица 14. Параметры Cmnd_STK_PROG_FUSE.
Program Fuse Bits Extended. Программирует расширенные биты фьюзов. Назначение битов фьюзов поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Примечание: для программирования ISP используйте команду Cmnd_STK_UNIVERSAL с соответствующими байтами команды ISP (можно найти в даташите на программируемое устройство). Прим. переводчика: расширенные фьюзы появились при развитии линейки семейства микроконтроллеров AVR, когда потребовалось управление добавленными возможностями новых микроконтроллеров. Формат команды: Cmnd_STK_PROG_FUSE_EXT, fuse_low, fuse_high, fuse_ext, Sync_CRC_EOP Таблица 15. Параметры Cmnd_STK_PROG_FUSE_EXT.
Program Lock Bits. Программирует биты защиты микроконтроллера. Назначение битов защиты поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Прим. переводчика: биты защиты управляют доступом (на чтение, запись) к различным областям памяти микроконтроллера - память программ, boot-секция, память данных и т. п. Установка битов защиты позволяет защитить от незаконного доступа (с целью копирования или реверс-инжиниринга) к программному обеспечению (firmware) микроконтроллера AVR. 8 бит фьюзов группируются в байт фьюзов (fuse byte), и различают младший, старший и расширенный байты фьюзов. Исходное (незапрограммированное) состояние фьюзов - лог. 1 (байт фьюзов 0xFF). Когда значение фьюза программируется, то он переводится в состояние лог. 0. Такое поведение связано с технологией памяти FLASH, и иногда создает некоторую путаницу в понимании состояния бит фьюзов. Для вычисления байтов фьюзов и понимания их назначения (для разных моделей чипов AVR) есть очень хороший онлайн-ресурс - сайт Engbedded Atmel AVR® Fuse Calculator site:engbedded.com. Формат команды: Cmnd_STK_PROG_LOCK, lock, Synch_CRC_EOP Таблица 16. Параметры Cmnd_STK_PROG_LOCK.
Program Page. Загружает блок данных в стартеркит, и программирует этими данными память FLASH или EEPROM текущего устройства. Размер блока данных не должен превышать 256 байт. Таблица 17. Параметры Cmnd_STK_PROG_PAGE.
Read Flash Memory. Читает одно слово (2 байта) из памяти FLASH. Таблица 18. Параметры ответа на Cmnd_STK_READ_FLASH.
Read Data Memory. Читает 1 байт из памяти EEPROM. Таблица 19. Параметры ответа на Cmnd_STK_READ_DATA.
Read Fuse Bits. Читает состояние битов фьюзов. Назначение битов фьюзов поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Примечание: для программирования ISP используйте команду Cmnd_STK_UNIVERSAL с соответствующими байтами команды ISP (можно найти в даташите на программируемое устройство). Имейте в виду, что некоторые устройства комбинируют Lock bits и Fuse bits, так что получение действительных значений байт фьюзов требует использования Cmnd_STK_READ_LOCK. Это более подробно описано в приложении. Формат команды: Cmnd_STK_READ_FUSE, Sync_CRC_EOP Таблица 20. Параметры ответа на Cmnd_STK_READ_FUSE.
Read Fuse Bits Extended. Читает расширенные биты фьюзов. Назначение битов фьюзов поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Примечание: для программирования ISP используйте команду Cmnd_STK_UNIVERSAL с соответствующими байтами команды ISP (можно найти в даташите на программируемое устройство). Имейте в виду, что некоторые устройства комбинируют Lock bits и Fuse bits, так что получение действительных значений байт фьюзов требует использования Cmnd_STK_READ_LOCK. Это более подробно описано в приложении. Формат команды: Cmnd_STK_READ_FUSE_EXT, Sync_CRC_EOP Таблица 21. Параметры ответа на Cmnd_STK_READ_FUSE_EXT.
Read Lock Bits. Читает биты защиты. Назначение битов защиты поддерживаемых в настоящее время устройств описано в приложении, в конце статьи. Примечание: для программирования ISP используйте команду Cmnd_STK_UNIVERSAL с соответствующими байтами команды ISP (можно найти в даташите на программируемое устройство). Имейте в виду, что некоторые устройства комбинируют Lock bits и Fuse bits, так что получение действительных значений байт фьюзов требует использования Cmnd_STK_READ_LOCK. Это более подробно описано в приложении. Формат команды: Cmnd_STK_READ_LOCK, Sync_CRC_EOP Таблица 22. Параметры ответа на Cmnd_STK_READ_LOCK.
Read Page. Читает блок данных из FLASH или EEPROM в памяти текущего устройства. Размер блока данных не должен превышать 256 байт. Формат команды: Cmnd_STK_READ_PAGE, bytes_high, bytes_low, memtype, Sync_CRC_EOP Таблица 23. Параметры Cmnd_STK_READ_PAGE.
Read Signature Bytes. Чтение байт сигнатуры устройства. Формат команды: Cmnd_STK_READ_SIGN, Sync_CRC_EOP Таблица 24. Параметры ответа на Cmnd_STK_READ_SIGN.
Read Oscillator Calibration Byte. Чтение байта калибровки генератора устройства. Формат команды: Cmnd_STK_READ_OSCCAL, Sync_CRC_EOP Таблица 25. Параметры ответа на Cmnd_STK_READ_OSCCAL.
Read Oscillator Calibration Byte Extended. Расширенное чтение байта калибровки генератора устройства. Формат команды: Cmnd_STK_READ_OSCCAL_EXT, address, Sync_CRC_EOP Таблица 26. Параметры Cmnd_STK_READ_OSCCAL_EXT.
Universal Command. Универсальная команда, которая используется для отправки обычного 32-битного потока данных/команд напрямую в интерфейс SPI текущего устройства. В ответе возвращается последние выдвинутые 8 бит. Формат команды: Cmnd_STK_UNIVERSAL, byte1, byte2, byte3, byte4, Sync_CRC_EOP Таблица 27. Параметры Cmnd_STK_UNIVERSAL.
Extended Universal Command. Расширенная универсальная команда, используемая для передачи любого количества байт в интерфейс SPI текущего устройства. Формат команды: Cmnd_STK_UNIVERSAL_MULTI, number_of_bytes, data bytes, Sync_CRC_EOP Таблица 28. Параметры Cmnd_STK_UNIVERSAL_MULTI.
[Определение параметров (Parameter Definitions)] Hardware Version. Этот параметр определяет версию аппаратуры стартеркита. Software Version Major. Старшая (major) часть версии программного обеспечения firmware управляющего MCU стартеркита. Software Version Minor. Младшая (minor) часть версии программного обеспечения firmware управляющего MCU стартеркита. Status LED. Устанавливает или запрашивает текущие установки светодиода состояния (status LED) стартеркита. Светодиод состояния является двойным светодиодом (красный и зеленый), который может светиться красным цветом, зеленым цветом, или желтым (если одновременно горят оба светодиода). Таблица 32. Значение параметра Parm_STK_LEDS.
Target Voltage (VTARGET). Устанавливает или запрашивает напряжение питания текущей цели (устройства, микроконтроллера AVR), VTARGET. Действительное напряжение (Real target voltage) является функцией от значения параметра, и может быть вычислено по формуле: Real target voltage = [Parm_STK_VTARGET]/10.0 Мнемоника: Parm_STK_VTARGET Adjustable Voltage (AREF). Устанавливает или запрашивает значение текущего подстраиваемого напряжения (adjustable voltage, AREF). Действительное напряжение (Real adjustable voltage) является функцией от значения параметра, и может быть вычислено по формуле: Real adjustable voltage = [Parm_STK_VADJUST]/10.0 Мнемоника: Parm_STK_VADJUST Oscillator Timer Prescaler Value. Устанавливает или запрашивает значение прескалера для генератора таймера MCU, который используется для организации подстраиваемого генератора (adjustable Oscillator). Действительное значение частоты является функцией параметров Parm_STK_OSC_PSCALE и Parm_STK_OSC_CMATCH, см. таблицу 35. Мнемоника: Parm_STK_OSC_PSCALE Таблица 35. Значение параметра Parm_STK_OSC_PSCALE.
Oscillator Timer Compare Match Value. Устанавливает или запрашивает значение регистра совпадения таймера MCU, который используется для организации подстраиваемого генератора (adjustable Oscillator). Значение параметра Parm_STK_OSC_CMATCH - 16-битное число, от которого зависит генерируемая частота. См. описание параметра Parm_STK_OSC_PSCAL. Мнемоника: Parm_STK_OSC_CMATCH ISP SCK Duration. Устанавливает или запрашивает параметр для текущей длительности полупериода сигнала ISP SCK (тактовая частота ISP). Чтобы обеспечить корректное программирование, параметр Parm_STK_SCK_DURATION должен соответствовать следующему условию (target_freq это тактовая частота программируемого устройства в Гц): [Parm_STK_SCK_DURATION] > (8*10^6 / target_freq) - 2 Мнемоника: Parm_STK_SCK_DURATION Buffer Size. Эти параметры запрашивают размер буфера обмена данными в управляющем MCU стартеркита. Параметры идут в форме 16-битного значения, где Parm_STK_BUFSIZEH старший байт, и Parm_STK_BUFSIZEL младший байт размера буфера. Topcard Detect. Запрашивает информацию о том, установлена карта верхнего уровня на STK500 или нет. Таблица 39. Код установленной карты верхнего уровня.
[Приложение 1. Зарезервированные команды] Имеется несколько команд (или символов команд), которые зарезервированы и не должны использоваться для этого продукта. Они либо используются для других продуктов AVR, либо зарезервированы для будущего использования. Все зарезервированные команды возвратят ответ NACK (символ '?') на эти зарезервированные команды: • '%' [Приложение 2. Коды устройств (Device Codes)] Таблица 40. Коды устройств (микроконтроллеров AVR).
[Приложение 3. Байты сигнатур (Signature Bytes)] Таблица 41. Байты сигнатур устройств (микроконтроллеров AVR).
[Приложение 4. Биты защиты (Lock Bits)] Для разъяснения бит защиты обратитесь к даташиту на конкретное устройство. Незапрограммированные биты должны быть установлены в лог. 1. Таблица 42. Биты защиты устройств (микроконтроллеров AVR).
Примечания: [Приложение 5. Биты фьюзов, младший байт (Fuse Bits, Low Byte)] Для разъяснения бит фьюзов обратитесь к даташиту на конкретное устройство. Незапрограммированные биты должны быть установлены в лог. 1. Таблица 43. Биты фьюзов устройств (микроконтроллеров AVR), младший байт.
[Приложение 6. Биты фьюзов, старший байт (Fuse Bits, High Byte)] Для разъяснения бит фьюзов обратитесь к даташиту на конкретное устройство. Незапрограммированные биты должны быть установлены в лог. 1. Таблица 44. Биты фьюзов устройств (микроконтроллеров AVR), старший байт.
[Приложение 7. Расширенные биты фьюзов (Fuse Bits, Extended Byte)] Для разъяснения бит фьюзов обратитесь к даташиту на конкретное устройство. Незапрограммированные биты должны быть установлены в лог. 1. Таблица 45. Расширенные биты фьюзов устройств (микроконтроллеров AVR).
[Приложение 8. Устройства, которые на чтении комбинируют значения бит фьюзов и бит защиты] Некоторые устройства комбинируют на чтении биты фьюзов и защиты в одной и той же команде и ответе. Для них будет правильным использовать команду Cmnd_STK_READ_LOCK. Вот эти устройства: • AT90S1200 Просмотрите псевдокод в последующих секциях, чтобы получить инструкции - как распаковать биты фьюзов и биты защиты из величины, которая была возвращена в ответе на команду Cmnd_STK_READ_LOCK. [Приложение 9. Чтение и запись битов фьюзов и защиты в Serial Mode] Запись и чтение битов защиты и фьюзов в Serial mode в настоящий момент осуществляется командой Cmnd_STK_UNIVERSAL. Эта команда требует, чтобы команды ISP были корректно сформированы компьютером PC, и строго соответствовали формату. Эти команды не всегда простые. Следующие секции псевдокода иллюстрируют, как нужно использовать команду Cmnd_STK_UNIVERSAL. В псевдокоде используется функция: UniversalCommand(UCHAR byte1, UCHAR byte2, UCHAR byte3, UCHAR *byte4);
byte1 .. byte4 должны быть установлены так, чтобы содержать битовый поток, предоставляющий команду и данные. На выходе функция возвращает byte4, который содержит последние 8 бит, выдвинутые из SPI интерфейса ISP. См. описание команды Cmnd_STK_UNIVERSAL в предыдущих секциях для получения дополнительной информации. Чтение битов защиты if (m_pDevice->ucLockBytes >= 1) UniversalCommandNew(0x58, 0, 0, &data) // Некоторые устройства комбинируют чтение битов фьюзов и защиты в том же самом // байте. Чтобы получить корректное значение битов защиты этих устройств, // нужно замаскировать биты, которые не относятся к битам защиты. Также нужно // применить сдвиг битов защиты в позицию, описанную в секции приложения, // относящегося к битам защиты. // Примечание: такое же маскирование данных должно быть выполнено, когда биты // защиты читаются в Parallell mode. if (устройство комбинирует биты Fuse и Lock) { lock_byte = 0xff; if (! (data & 0x80)) lock_byte &= 0xfd; if (! (data & 0x40)) lock_byte &= 0xfb; } Запись битов защиты if (если количество байт защиты >= 1) { // Устройство, у которых имеется SPI с собственным тактированием (self-timing // programming), имеют другой формат программирования для младших бит защиты, // по сравнению с устройствами с внешним тактированием, кроме ATtiny12 и ATtiny15 if ((устройство поддерживает self-timing programming) && (устройство не Attiny12 или Attiny15)) UniversalCommand(0xAC, 0xE0, 0, &lock_byte)) else UniversalCommand(0xAC, lock_byte | 0xF9, 0, &dummy_var)) Sleep(50); // ожидание завершения операции записи бит защиты в устройство } Чтение битов фьюзов // Как уже было упомянуто, некоторые устройства комбинируют биты фьюзов и защиты // в одном и том же байте при операции чтения. Они имеют другой формат // программирования, отличающийся от других устройств (без комбинирования). if (устройство не комбинирует биты fuse и lock) { if (количество байт фьюзов >= 1) UniversalCommandNew(0x50, 0, 0, &low_fuse_byte); if (количество байт фьюзов >= 2) UniversalCommandNew(0x58, 0x08, 0, &high_fuse_byte); } // Объединение битов фьюзов и защиты. Здесь происходит все точно так же, как // при чтении битов защиты, за исключением того, что берется другая маска для // получения битов фьюзов из возвращенных данных. // Примечание: такое же маскирование данных должно быть выполнено, когда биты // фьюзов читаются в Parallell mode. else if (устройство комбинирует биты fuse и lock) { if (количество битов lock >= 1) UniversalCommandNew(0x58, 0, 0, &low_fuse_byte); low_fuse_byte |= 0xC0;// биты, не относящиеся к фьюзам, устанавливаются в 1 } Запись битов фьюзов if (количество байтов fuse >= 1) { // Устройства с self-timing SPI имеет отличающийся от других формат // программирования if (устройство поддерживает self-timing programming) UniversalCommand(0xAC, 0xA0, 0, &low_fuse_byte); else UniversalCommand(0xAC, (low_fuse_byte & 0x1F) | 0xA0, 0, &low_fuse_byte); Sleep(50); // ожидание завершения операции записи бит фьюзов в устройство } if (количество байтов fuse >= 2) { UniversalCommandNew(0xAC, 0xA8, 0, &high_fuse_byte); Sleep(50); // ожидание завершения операции записи бит фьюзов в устройство } [Ссылки] 1. AVR061: STK500 Communication Protocol site:atmel.com. |