Синхронизация ISP-программатора с AVR

Процедура входа в ISP-программирование AVR начинается с активации сигнала сброса микроконтроллера, за которой следует передача по SPI команды входа в режим программирования. На момент активации сигнала RESET на входе SCK должен быть низкий уровень. Если это условие не выполняется, то спад сигнала SCK уже после установки низкого уровня на входе сброса приводит к непредусмотренному изменению состояния автомата программирования.

AVR programming waveforms

При передаче 4-байтовой команды входа в программирование этот лишний спад искажает команду, микроконтроллер её не опознаёт и не переходит в нужный режим. Сдвиг фаз между программатором и микроконтроллером нарушает байтовую синхронизацию, поэтому нет смысла просто передавать команду еще раз.

Потеря синхронизации может произойти и во время программирования, про это можно почитать в публикации про сообщение «synchronisation lost» в AVReAl.

В документации на микроконтроллеры AVR описаны два способа восстановления синхронизации.

В первом способе пересинхронизация осуществляется дополнительными импульсами SCK между 4-байтовыми пакетами команд. Таким образом сдвигается фаза байт-ориентированных команд в битовом потоке до тех пор, пока автомат программирования в микроконтроллере не «увидит» правильную команду.

Low-voltage Serial Programming Algorithm

3. The serial programming instructions will not work if the communication is out of synchronization. When in sync, the second byte ($53) will echo back when issuing the third byte of the Programming Enable instruction. Whether the echo is correct or not, all four bytes of the instruction must be transmitted. If the $53 did not echo back, give SCK a positive pulse and issue a new Programming Enable instruction. If the $53 is not seen within 32 attempts, there is no functional device connected.

Этот способ описан в документации на AT90S4433, AT90S8515, AT90S8535, ATtiny12, ATtiny15, ATtiny22, ATmega163 и более старые.
Для ATtiny13, ATtiny26, ATmega8, … ATmega128 и более новых рекомендован второй способ:

Serial Programming Algorithm

3. The Serial Programming instructions will not work if the communication is out of synchronization. When in sync. the second byte (0x53), will echo back when issuing the third byte of the Programming Enable instruction. Whether the echo is correct or not, all four bytes of the instruction must be transmitted. If the 0x53 did not echo back, give RESET a positive pulse and issue a new Programming Enable command.

Т.е. для всех выпускающихся сейчас микроконтроллеров AVR документация описывает способ восстановления синхронизации испульсом на входе RESET, который фактически выполняет роль сигнала Chip Select для автомата программирования.
В структурах описания микроконтроллеров программы AVReAl имеется флаг, по которому выбирается нужный алгоритм.

Но второй способ не является способом достижения синхронизации. Это просто повтор попыток войти в программирование.
Пусть записанная ранее программа включила на выводе SCK активный высокий уровень и условие «на SCK низкий уровень в момент подачи RESET» не выполняется. Если в первой команде входа в программирование синхронизация не достигнута именно по этой причине, то за время действия высокого уровня на входе RESET программа может опять дойти до этого места и синхронизация снова не осуществится.
Для уменьшения вероятности такого события AVReAl старается сделать импульс на RESET коротким, несколько тактов частоты ядра, указанной в ключе -o.

Есть некоторая дискретность изменения длительности импульса, возможность смены частоты тактирования в программе при помощи регистра CLKPR, … Импульс на входе сброса может и не помочь.
Впрочем, такая ситуация встречается редко и, как правило, надлежащий выбор частоты в ключе -o помогает.

Изредка я делаю «перекрёстный допрос» — просматриваю xml-файлы описаний микроконтроллеров из пакета AVR Studio с целью сверки сигнатур и fuses с документацией. Оказалось, что в тех файлах есть разные параметры программирования, но признака способа синхронизации нет.
Проверка осциллографом работы фирменных программаторов AVR ISP mkII и AVR Dragon показала, что для всех моделей микроконтроллеров они используют старый способ пересинхронизации импульсом SCK!

Итак, я решил изменить процедуру пересинхронизации в AVReAl.
Со следующей версии она также будет одинаковой для всех моделей и будет использовать импульс на SCK.
Проще и надёжнее.

p.s. И всё же в таких расхождениях между документацией от фирмы Atmel и её практикой мало приятного.

Leave a Reply

[flagcounter image]