Сигнатура AVR (signature bytes)
Перед прошивкой программатор спрашивает у микроконтроллера, кто он. Ответ — три байта сигнатуры, записанные на заводе. Если они не совпали с выбранной моделью, avrdude откажется продолжать, и это одна из самых частых ошибок при работе с Arduino-клонами.
Обновлено Редакция GAW
Сигнатура (signature bytes, device signature) — три байта в отдельной области памяти AVR, которые Microchip записывает на заводе для опознания модели кристалла. У всех моделей в таблице Microchip первый байт — 0x1E, второй, по нашему выводу из таблицы, меняется вместе с объёмом флеш-памяти, третий различает модели. Программатор читает сигнатуру перед прошивкой и сравнивает с выбранной моделью. Сигнатура читается в последовательном и параллельном режиме программирования, в том числе у кристалла с включёнными битами защиты (DS40002061B, разд. 28.3).
Сигнатуры семейства ATmega328P
| Модель | 0x000 | 0x001 | 0x002 |
|---|---|---|---|
| ATmega48A | 0x1E | 0x92 | 0x05 |
| ATmega48PA | 0x1E | 0x92 | 0x0A |
| ATmega88A | 0x1E | 0x93 | 0x0A |
| ATmega88PA | 0x1E | 0x93 | 0x0F |
| ATmega168A | 0x1E | 0x94 | 0x06 |
| ATmega168PA | 0x1E | 0x94 | 0x0B |
| ATmega328 | 0x1E | 0x95 | 0x14 |
| ATmega328P | 0x1E | 0x95 | 0x0F |
Данные — 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). Поэтому опознать кристалл можно и тогда, когда прошивку прочитать уже нельзя.
Источники
- 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-генератора в той же области
- AVRDUDE v8.3, man-страница avrdude.1 — ключ -F (--force): avrdude обычно проверяет, что прочитанная сигнатура правдоподобна, а -F отменяет проверку для кристаллов с испорченной сигнатурой; память signature — три байта сигнатуры, которые должны быть, но не всегда бывают уникальны для модели
Нашли ошибку?
Смотрите также
- AVRDUDEПрошивка AVR из командной строки: ключи, Arduino, USBasp, фьюзы, ошибки
- Прошивка AVRISP, HVPP, debugWIRE, JTAG, PDI, TPI, UPDI, загрузчики, avrdude
- ISP (внутрисхемное программирование)Прошивка AVR на плате по SPI и выводу RESET
- Биты защиты AVR (lock bits)Запрет чтения прошивки и защита загрузчика от перезаписи
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C
- Совместимость по выводамВозможность поставить другую микросхему на ту же плату без её переделки