Сегодня речь пойдет о программаторе USBasp - популярном программаторе для микроконтроллеров фирмы Atmel серии AVR. Как заявляет его создатель на домашней странице проекта, USBasp работает на различных платформах (Windows, Linux, Mac OS X), не требует дополнительных компонентов и обеспечивает скорость программирования до 5 кбит/с. Кроме того его схема довольно проста и желающие могут собрать этот программатор самостоятельно. Либо можно заказать готовый на Aliexpress, как я и поступил. Обошелся он мне в $1.70 вместе с переходником на ICSP разъем.
USBasp позволяет программировать AVR микроконтроллеры через последовательный интерфейс SPI. Для этого он имеет 10-пиновый разъем SPI. И подключение программатора к Ардуино или отдельному микроконтроллеру сводится к соединению их линий SPI и Reset.
В большинство плат Ардуино присутствует ICSP разъем, в котором сгруппированы выводы для внутрисхемного программирования: MOSI, MISO, SCK, RST, GND и VCC. Поэтому удобнее всего подключать программатор именно к ICSP. Здесь вам потребуется распиновка разъемов, она приведена ниже:
Соедините соответствующие выводы программатора и Ардуино, должно получиться примерно так:
Конечно, возиться каждый раз с проводами не очень удобно, поэтому советую приобрести переходник ISP 10 pin to 6 pin. С ним всё становится гораздо проще.
Если же на плате Ардуино нет ICSP разъема, то остается подключать программатор к цифровым выводам в соответствии со следующей таблицей. В ней приведено расположение выводов MOSI, MISO и SCK для различных плат Ардуино.
Не забывайте о том, что некоторые платы требуют питания 3.3В и для них нужно менять положение джампера JP1 на программаторе.
У меня в системе установлены драйвера из этого набора, они подходят как для XP, так и для свежих версий Windows. Скачайте архив, распакуйте его и запустите InstallDriver.exe для установки драйверов.
После установки драйверов программатор будет виден в диспетчере устройств как USBasp, теперь мы можем его использовать:
При работе в Linux или MacOS X установка дополнительного ПО для USBasp не требуется.
Итак, проверим программатор USBasp в действии. В предыдущих публикациях я описывал процедуру записи загрузчика в Ардуино и работу с фьюзами с использованием Ардуино в качестве программатора. Эти же действия можно выполнить, используя USBasp.
avrdude -C ../etc/avrdude.conf -c usbasp -p m328p -U lfuse:r:-:h
В этой команде использованы следующие параметры:
Таким образом, для чтения FLASH Ардуино Уно (микроконтроллера ATmega328p) может быть использована следующая команда:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:r:flash_dump.hex:i
Файл с содержимым FLASH памяти микроконтроллера будет создан в каталоге Avrdude. Либо можно прописать в команде полный путь к файлу.
Для записи в FLASH память содержимого файла flash_dump.hex можно использовать команду:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:w:flash_dump.hex:i
Чтение EEPROM:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:r:eeprom_dump.hex:i
Запись EEPROM:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:w:eeprom_dump.hex:i
Содержание
Подключение программатора USBasp к Ардуино
Драйвера для USBasp
Чтение и запись фьюзов Ардуино
Чтение и запись FLASH и EEPROM памяти Ардуино
Запись загрузчика в Ардуино
Драйвера для USBasp
Чтение и запись фьюзов Ардуино
Чтение и запись FLASH и EEPROM памяти Ардуино
Запись загрузчика в Ардуино
Подключение программатора USBasp к Ардуино
В большинство плат Ардуино присутствует ICSP разъем, в котором сгруппированы выводы для внутрисхемного программирования: MOSI, MISO, SCK, RST, GND и VCC. Поэтому удобнее всего подключать программатор именно к ICSP. Здесь вам потребуется распиновка разъемов, она приведена ниже:
Соедините соответствующие выводы программатора и Ардуино, должно получиться примерно так:
Конечно, возиться каждый раз с проводами не очень удобно, поэтому советую приобрести переходник ISP 10 pin to 6 pin. С ним всё становится гораздо проще.
Если же на плате Ардуино нет ICSP разъема, то остается подключать программатор к цифровым выводам в соответствии со следующей таблицей. В ней приведено расположение выводов MOSI, MISO и SCK для различных плат Ардуино.
Плата Ардуино | MOSI | MISO | SCK | Уровень |
---|---|---|---|---|
Uno, Duemilanove | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Nano | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Pro Mini | 11 | 12 | 13 | 3.3В или 5В |
Mega1280, Mega2560 | 51 или ICSP-4 | 50 или ICSP-1 | 52 или ICSP-3 | 5В |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | 5В |
Due | ICSP-4 | ICSP-1 | ICSP-3 | 3.3В |
Zero | ICSP-4 | ICSP-1 | ICSP-3 | 3.3В |
101 | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 3.3В |
Не забывайте о том, что некоторые платы требуют питания 3.3В и для них нужно менять положение джампера JP1 на программаторе.
Драйвера для USBasp
Для работы с USBasp в Windows следует установить драйвера. Разработчик данного программатора рекомендует использовать драйвера Zadig, скачать их можно на странице http://zadig.akeo.ie/. Обратите внимание, начиная с версии драйвера 2.3 прекращена поддержка Windows XP и Vista. Для указанных систем используйте предыдущую версию драйвера: zadig_xp_2.2.exe для XP и zadig_2.2.exe для Vista.У меня в системе установлены драйвера из этого набора, они подходят как для XP, так и для свежих версий Windows. Скачайте архив, распакуйте его и запустите InstallDriver.exe для установки драйверов.
После установки драйверов программатор будет виден в диспетчере устройств как USBasp, теперь мы можем его использовать:
При работе в Linux или MacOS X установка дополнительного ПО для USBasp не требуется.
Итак, проверим программатор USBasp в действии. В предыдущих публикациях я описывал процедуру записи загрузчика в Ардуино и работу с фьюзами с использованием Ардуино в качестве программатора. Эти же действия можно выполнить, используя USBasp.
Чтение и запись фьюзов Ардуино
Для работы с фьюзами будем использовать уже знакомый нам Avrdude. Поэтому запускаем командную строку, переходим в каталог avrdude и вводим команду для чтения младшего конфигурационного байта:avrdude -C ../etc/avrdude.conf -c usbasp -p m328p -U lfuse:r:-:h
В этой команде использованы следующие параметры:
- -c <programmer> - псевдоним используемого программатора, в данном случае usbasp.
- -p <partno> - тип микроконтроллера. Я считываю фьюзы из Ардуино Уно, в которой установлен микроконтроллер ATmega328p, поэтому в качестве <partno> указано значение m328p.
- -U <memtype>:r|w|v:<filename>[:format] - комплексная опция для указания производимой с памятью операции (чтение. запись, проверка). -U lfuse:r:-:h означает, что требуется прочитать содержимое младшего байта конфигурации и вывести считанное значение на экран в щестнадцатеричном виде.
А вот и результат выполнения приведенной команды:
Если у вас в результате присутствует строка avrdude: warning: cannot set sck period, please check for usbasp firmware update, то не обращайте на нее внимание. Это всего лишь предупреждение, не ошибка, работе оно не мешает. Если вы всё же хотите от него избавиться, то нужно обновить прошивку USBasp, данная процедура подробно расписана в статье Прошивка USBasp. Как видно из скриншота, значение младшего конфигурационного байта равно 0xff, команда отработала успешно.
Теперь проверим запись фьюзов с использованием USBasp. Я изменю значение дополнительного конфигурационного байта с 0xFF на 0xFD, что приведет к установке порога срабатывания схемы BOD в 2.7В. Команда для Avrdude и результат ее выполнения приведены ниже:
avrdude -C ../etc/avrdude.conf -c usbasp -p m328p -U efuse:w:0xFD:m
Чтение и запись FLASH и EEPROM памяти Ардуино
В приведенных выше примерах команд для Avrdude в качестве параметра <memtype> использовались значения lfuse и efuse для доступа к конфигурационным байтам микроконтроллера. Данный параметр может принимать и другие значения, они приведены ниже:- calibration - байты калибровки RC-генератора;
- eeprom - энергонезависимая память микроконтроллера;
- efuse - дополнительный конфигурационный бит;
- flash - FLASH память микроконтроллера;
- fuse - фьюз-байт для микроконтроллеров с одним fuse-байтом;
- hfuse - старший fuse-байт;
- lfuse - младший fuse-байт;
- lock - байт блокировки (ячейка защиты);
- signature - три байта что обозначают сигнатуру чипа (device ID);
- fuseN - байт с фьюзами для ATxmega чипов, N - целое число для каждого фьюза что поддерживается устройством;
- application - область приложений во Flash памяти для МК ATxmega;
- apptable - таблица приложений в области Flash памяти для устройств ATxmega;
- boot - загрузочная область Flash памяти для устройств ATxmega;
- prodsig - область с производственной сигнатурой (calibration) для устройств ATxmega;
- usersig - область с пользовательской сигнатурой для устройств ATxmega.
Таким образом, для чтения FLASH Ардуино Уно (микроконтроллера ATmega328p) может быть использована следующая команда:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:r:flash_dump.hex:i
Файл с содержимым FLASH памяти микроконтроллера будет создан в каталоге Avrdude. Либо можно прописать в команде полный путь к файлу.
Для записи в FLASH память содержимого файла flash_dump.hex можно использовать команду:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U flash:w:flash_dump.hex:i
Чтение EEPROM:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:r:eeprom_dump.hex:i
Запись EEPROM:
avrdude -C ../etc/avrdude.conf -p m328p -c usbasp -U eeprom:w:eeprom_dump.hex:i
Запись загрузчика в Ардуино
Процедуру записи загрузчика я описывал ранее в публикации Arduino as ISP - программатор из Ардуино. Как и в прошлый раз для записи загрузчика мы будем использовать IDE Arduino. Последовательность шагов следующая:
- Соединяем USBasp с платой, в которую будем записывать загрузчик и подключаем программатор к компьютеру.
- Запускаем IDE Arduino.
- В меню Инструменты > Программатор выбираем USBasp.
- В меню Инструменты > Плата выбираем значение, соответствующее нашей плате.
- В меню Инструменты выбираем команду Записать загрузчик.
Если на spi шине меги есть устройство, без его отключения программирование вроде возможно?
ОтветитьУдалитьДа, должно получиться
УдалитьСпасибо, попробую
ОтветитьУдалить