Я не эксперт по электронике, поэтому простите меня, если я неправильно использую термины в своем вопросе или если мой вопрос содержит неточности и / или неправильное толкование того, как работает доска Леонардо. Поправки конечно приветствуются.
Я пытаюсь написать очень простую программу для перепрошивки чипов, которая с помощью HEX-файла сможет прошивать ее на плате Leonardo через ее загрузчик. Я понимаю, что Arduino Leonardo использует ATmega32u4 и что загрузчик использует протокол AVR109 .
Основываясь на этой информации, я смог написать некоторый код, который прошивает байты на плате, но после прошивания код не работает.
Мой код примерно выглядит так:
set memory address
, за которой следует write low byte
, а затем write high byte
.write page
инструкцию.Мне трудно найти, что я делаю неправильно, потому что я не уверен ни в одном из этих шагов. Шаг № 1 создает данные, которые выглядят нормально (поскольку здесь и там можно увидеть знакомые строки):
... однако, если я сравню свои данные с тем же HEX-файлом, прошитым AVRdude и снова загруженным из чипа, они сильно различаются .
Шаг №2 работает (загрузчик отвечает байтом 0xD на каждую команду, но я не знаю, правильно ли я поступаю, прошивая младший байт перед старшим .
Шаг № 3 также работает нормально, но я не уверен, действительно ли страницы памяти имеют размер 256 байт (я получил эту цифру из таблицы данных чипа, таблица 28-11).
Я буду чрезвычайно признателен всем, кто сможет просмотреть мой "алгоритм" и дать отзыв о том, что я делаю правильно или неправильно, и где распространены ошибки в такого рода приложениях.
Я успешно использую dfu-programmer в Linux (используя «голый» atmega32u2/atmega32u4) из командной строки. Так что очень легко интегрировать его в Makefile
.
Цитата с этого сайта:
dfu-programmer-0.6.2.tar.gz содержит исходное дерево этого проекта. Загрузите его для сборки и установки в системе Linux/Unix/Mac.
Так что вы должны быть в состоянии построить его на Mac. Или вы можете посмотреть исходный код.
Документация AVR109 не очень понятна, но между документацией AVR109 и исходным кодом avrdude я написал простой код Java (используя jssc для последовательного порта) для записи во флэш-память на устройствах AVR. Конкретный код для связи с устройством и чтения .hex-файла (поддерживаются не все возможности .hex-файлов) находится здесь . Я не проверял его тщательно, но он правильно записывал и читал на устройстве (BrainLink), с которым я его использовал.
ps Что касается ваших конкретных моментов, AVR109 всегда сначала нужен старший байт (и для адресов, и для размеров блоков). Кроме того, адрес указывается словами, а не байтами, поэтому байтовый адрес нужно разделить на два. И перед любой записью во флеш нужно стереть флеш.
Если вы делаете прошивальщик микросхем только для программирования, вам следует прекратить работу над ним прямо сейчас. Atmel предоставляет утилиту под названием FLIP. Он записывает шестнадцатеричные файлы на чипы для вас с прямого USB, если чип поддерживает встроенный USB, например, семейство ATmega##U#.
Вы можете написать желаемую программу в Atmel Studio, сохранить шестнадцатеричный код, открыть Atmel FlIP и прошить шестнадцатеричный файл.
встроенный .kyle
макинтош
Крис Стрэттон
ТМа