Как узнать сигнатуру AVR и почему avrdude пишет Invalid device signature?
Обновлено Редакция GAW
Сигнатура — три байта в отдельной области памяти AVR, которые Microchip записывает на заводе. Программатор читает их до записи прошивки и сравнивает с моделью, указанной ключом -p. Поэтому узнать сигнатуру можно любой командой avrdude — например, avrdude -c usbasp -p m328p без -U просто подключится и покажет её.
Что означает прочитанное значение
| Прочитано | Что это | Что делать |
|---|---|---|
| 1E 95 0F | ATmega328P — всё верно | — |
| 00 00 00 или FF FF FF | программатор не получил ответа | подключение, питание, частота ISP, такт кристалла |
| 1E 95 14 | ATmega328 без P | указать -p m328, а не -p m328p |
| 1E 94 0B, 1E 93 0F | ATmega168PA, ATmega88PA | на плате другой кристалл |
| «почти правильная», меняется от раза к разу | сбои обмена | снизить частоту ISP, укоротить провода |
Сигнатуры — DS40002061B, табл. 28-10; трактовка нулей и единиц — наш вывод, разобранный и в термине «Сигнатура».
Связи нет: частота ISP
Даташит требует, чтобы низкий и высокий уровни SCK длились дольше двух тактов процессора. Наш расчёт: период SCK больше четырёх тактов, то есть частота ISP меньше fck/4. Новый ATmega328P работает на 1 МГц (RC-генератор 8 МГц и запрограммированный CKDIV8), значит, ISP — меньше 250 кГц. Многие программаторы по умолчанию дают период 1 мкс, рассчитанный на кристаллы от 4 МГц. Решение — -B 8: период 8 мкс. Подробнее — в статье «Программирование AVR» и в разборе avrdude.
Связи нет: такт
Для программирования по ISP кристаллу нужен рабочий такт по фьюзам CKSEL. Если фьюзы выбрали внешний кварц или генератор, которого на плате нет, кристалл молчит. Что задают фьюзы и какие значения безопасны, показывает калькулятор фьюзов AVR.
Сигнатура чужая
Если прочитано осмысленное значение другого кристалла, программатор работает, а ошибка в выборе модели. Частый случай — ATmega328 вместо ATmega328P на дешёвых платах. Сигнатура читается и у кристалла с включённой защитой, так что опознать модель можно всегда.
Похожие вопросы
Можно ли просто добавить ключ -F?
Только если вы точно знаете, что кристалл тот и он исправен, а сигнатура испорчена — именно для этого случая man-страница avrdude описывает -F. При 00 00 00 ключ не поможет: связи с кристаллом нет, и прошивка всё равно не запишется. При чужой сигнатуре -F приведёт к записи прошивки, собранной для другого микроконтроллера.
Почему новый ATmega328P не прошивается, а с платы Arduino — прошивается?
Новый кристалл работает от внутреннего RC-генератора с делителем CKDIV8, то есть на 1 МГц, а такт ISP должен быть медленнее четверти тактовой частоты. Наш расчёт: при 1 МГц — меньше 250 кГц, период больше 4 мкс; ключ -B 8 даёт период 8 мкс с запасом. Кристалл с Arduino работает на 16 МГц и терпит быстрый такт.
Что делать, если фьюзы выставили внешний кварц, а его нет?
Без такта кристалл не отвечает по ISP, и avrdude читает нули. Даташит требует рабочего такта, выбранного фьюзами CKSEL. Временно подключают кварц или подают внешний сигнал на XTAL1, прошивают правильные фьюзы и возвращают всё как было (наш вывод).
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 28.3, табл. 28-10 — сигнатуры: ATmega328P 1E 95 0F, ATmega328 1E 95 14, ATmega168PA 1E 94 0B, ATmega88PA 1E 93 0F; сигнатура читается и у защищённого кристалла; 28.8 — для последовательного программирования нужен рабочий такт по фьюзам CKSEL, низкий и высокий уровни SCK длиннее 2 тактов процессора при fck < 12 МГц
- AVRDUDE v8.3, man-страница avrdude.1 — -B — период или частота такта ISP; многие программаторы по умолчанию дают период 1 мкс, годный для кристаллов от 4 МГц, более медленным нужен больший период; -F — отменяет проверку сигнатуры для кристаллов с испорченной сигнатурой
Нашли ошибку?