ISP — внутрисхемное программирование
ISP — способ записать программу в микроконтроллер AVR, не вынимая его из платы: программатор подключается к выводам SPI и RESET и получает доступ к флеш-памяти, EEPROM и фьюзам. Так прошивают классические ATmega и ATtiny, в том числе записывают загрузчик Arduino.
Обновлено Редакция GAW
ISP (in-system programming, внутрисхемное программирование; у Arduino — ICSP) — способ программирования микроконтроллеров AVR, при котором программатор подключается к уже установленному на плате кристаллу через выводы SPI. Пока на выводе RESET низкий уровень, флеш-память, EEPROM, фьюзы и биты защиты доступны по SPI: данные в кристалл идут по MOSI и защёлкиваются по фронту SCK, из кристалла читаются по MISO (DS40002061B, раздел 28.8).
Как это работает
- Программатор подаёт питание при RESET = 0 и SCK = 0.
- Через 20 мс посылает команду Programming Enable — AC 53 00 00. Если связь синхронна, второй байт возвращается эхом.
- Стирает кристалл, загружает и записывает флеш-память страницами, проверяет записанное и отпускает RESET.
Уровни SCK должны длиться больше двух тактов процессора, поэтому скорость ISP ограничена тактовой частотой кристалла: новый ATmega328P работает на 1 МГц, и программатор нужно замедлить. Команды ISP, высоковольтный режим и другие интерфейсы прошивки — debugWIRE, TPI, UPDI — разобраны в статье «Как прошить AVR».
Программаторы и разъём
ISP поддерживают USBasp, USBtinyISP, AVRISP mkII, STK500 и плата Arduino со скетчем ArduinoISP. Их обслуживает утилита avrdude. Разъёмы ISP на 6 и 10 контактов с назначением выводов показаны на странице «Распиновка AVR ISP». Работает ISP, только если кристалл тактируется, фьюз SPIEN запрограммирован, а RSTDISBL — нет; перед изменением фьюзов это стоит проверить, чтобы не потерять доступ к кристаллу.
Частые вопросы
Почему программатор не видит новый ATmega328P?
Чаще всего из-за скорости SCK. С завода ATmega328P работает от внутреннего генератора 8 МГц с запрограммированным фьюзом CKDIV8, то есть на 1 МГц, а низкий и высокий уровни SCK должны длиться больше двух тактов процессора. Замедлите программатор опцией avrdude -B, например -B 32.
Какие выводы нужны для ISP?
MOSI, MISO, SCK, RESET, питание и общий провод. У ATmega328P сигналы SPI — на выводах PB3, PB4 и PB5. Стандартные разъёмы ISP на 6 и 10 контактов собирают их в одном месте; на Arduino Uno такой разъём на 6 контактов подписан ICSP.
Когда ISP перестаёт работать?
Когда кристалл не тактируется — выбран отсутствующий кварц, — когда снят фьюз SPIEN или запрограммирован RSTDISBL, превращающий RESET в обычный вывод. В первом случае помогает внешний тактовый сигнал на XTAL1, в остальных — только высоковольтное программирование с 11,5–12,5 В на выводе RESET.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 28.8 — последовательное программирование: выводы, алгоритм, длительности уровней SCK, табл. 28-19 — команды, Programming Enable AC 53 00 00
- AVRDUDE 8.3: руководство avrdude.1 и файл avrdude.conf (github.com/avrdudes/avrdude) — программаторы ISP (USBasp, USBtinyISP, AVRISP mkII, ArduinoISP), опция -B для скорости SCK
Нашли ошибку?