Перейти к содержанию

Сигнатура AVR (signature bytes)

Перед прошивкой программатор спрашивает у микроконтроллера, кто он. Ответ — три байта сигнатуры, записанные на заводе. Если они не совпали с выбранной моделью, avrdude откажется продолжать, и это одна из самых частых ошибок при работе с Arduino-клонами.

Обновлено Редакция GAW

Сигнатура (signature bytes, device signature) — три байта в отдельной области памяти AVR, которые Microchip записывает на заводе для опознания модели кристалла. У всех моделей в таблице Microchip первый байт — 0x1E, второй, по нашему выводу из таблицы, меняется вместе с объёмом флеш-памяти, третий различает модели. Программатор читает сигнатуру перед прошивкой и сравнивает с выбранной моделью. Сигнатура читается в последовательном и параллельном режиме программирования, в том числе у кристалла с включёнными битами защиты (DS40002061B, разд. 28.3).

Сигнатуры семейства ATmega328P

Модель0x0000x0010x002
ATmega48A0x1E0x920x05
ATmega48PA0x1E0x920x0A
ATmega88A0x1E0x930x0A
ATmega88PA0x1E0x930x0F
ATmega168A0x1E0x940x06
ATmega168PA0x1E0x940x0B
ATmega3280x1E0x950x14
ATmega328P0x1E0x950x0F

Данные — DS40002061B, табл. 28-10. Связь второго байта с объёмом — наш вывод из таблицы: 0x92, 0x93, 0x94 и 0x95 соответствуют 4, 8, 16 и 32 КБ флеш-памяти. В той же области, в старшем байте адреса 0x000, лежит байт калибровки RC-генератора, который при сбросе попадает в OSCCAL (разд. 28.4).

Сигнатура и avrdude

avrdude проверяет, что прочитанная сигнатура правдоподобна, и останавливается при несовпадении. Ключ -F отменяет проверку: man-страница называет случай, когда сигнатура у кристалла испорчена, а сам он исправен. Там же сказано, что сигнатура «должна быть, но не всегда бывает» уникальной для модели. Поэтому при несовпадении сначала проверяют, какая модель на самом деле стоит на плате, и только потом решают, нужен ли -F.

Частый случай — платы с ATmega328 вместо ATmega328P или клоны с другими кристаллами: сигнатура отличается, хотя прошивка может подойти. Подключение программатора по ISP и типичные ошибки разобраны в статье «Программирование AVR».

Частые вопросы

Что значит ошибка «Device signature = 0x000000»?

Программатор вообще не получил ответа: все нули или 0xFFFFFF обычно означают отсутствие связи, а не другую модель. Это наш вывод: стоит проверить питание и общий провод, подключение MISO, MOSI, SCK и RESET, а также тактирование — если фьюзы выбрали внешний кварц, которого нет, кристалл не отвечает.

Можно ли прошить ATmega328 как ATmega328P?

Сигнатуры у них разные: 0x1E 0x95 0x14 у ATmega328 и 0x1E 0x95 0x0F у ATmega328P (DS40002061B, табл. 28-10), поэтому avrdude остановится на проверке. Ключ -F отменяет проверку (man avrdude), но безопаснее выбрать в программаторе правильную модель — описание регистров и фьюзов у них общее в одном даташите, но это разные изделия.

Читается ли сигнатура у защищённого кристалла?

Да. Microchip прямо указывает, что сигнатуру можно прочитать в последовательном и параллельном режиме, даже когда установлены биты защиты (DS40002061B, разд. 28.3). Поэтому опознать кристалл можно и тогда, когда прошивку прочитать уже нельзя.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — разд. 28.3 — у всех AVR трёхбайтная сигнатура, читается в последовательном и параллельном режиме, в том числе у защищённого кристалла, лежит в отдельном адресном пространстве; табл. 28-10: ATmega48A 1E 92 05, 48PA 1E 92 0A, 88A 1E 93 0A, 88PA 1E 93 0F, 168A 1E 94 06, 168PA 1E 94 0B, 328 1E 95 14, 328P 1E 95 0F; 28.4 — байт калибровки RC-генератора в той же области
  2. AVRDUDE v8.3, man-страница avrdude.1 — ключ -F (--force): avrdude обычно проверяет, что прочитанная сигнатура правдоподобна, а -F отменяет проверку для кристаллов с испорченной сигнатурой; память signature — три байта сигнатуры, которые должны быть, но не всегда бывают уникальны для модели

Нашли ошибку?