Флэш-память и ЭСППЗУ могут быть запрограммированы через последовательный интерфейс SPI, когда вход RESET переведен в низкое состояние. Последовательный интерфейс состоит из следующих сигналов: SCK, MOSI (вход) и MISO (выход). После подачи низкого уровня на вход RESET необходимо выполнить инструкцию разрешения программирования. В таблице 128 представлено описание сигналов программирования. Обратите внимание, что не все выводы последовательного программирования совпадают с выводами внутреннего интерфейса SPI. Также следует отметить, что повсюду при описании последовательного программирования используются наименования MOSI и MISO для описания последовательного ввода и вывода данных, соответственно. Для ATmega128 соответствующие выводы программирования именуются PDI и PDO.
Несмотря на то, что при последовательном программирования используется тот же модуль SPI, что и при обычной работы микроконтроллера, имеется одно важное отличие: выводы MOSI/MISO модуля ввода-вывода SPI, которые совмещены с PB2 и PB3, не используются при программировании. Вместо них используются PE0 и PE1 для ввода и вывода данных при последовательном программировании (см. табл. 128).
Таблица. Выводы интерфейса SPI при последовательном программированииОбозначение | Вывод | Направление | Описание |
MOSI (PDI) | PE0 | ввод | Последовательный ввод данных |
MISO (PDO) | PE1 | вывод | Последовательный вывод данных |
SCK | PB1 | ввод | Синхронизация последовательной связи |
Во время программирования ЭСППЗУ функция стирания выполняется автоматически (только в режиме последовательного программирования) и, поэтому, нет необходимости первоначально выполнять команду "Стирание кристалла". Выполнение команды "Стирание кристалла" приводит к заполнению памяти программ и ЭСППЗУ кодом $FF.
Параметры тактового сигнала зависят от настроек синхронизации микроконтроллера конфигурационными битами CKSEL. Длительности высокого и низкого уровней тактового сигнала (SCK) должны отвечать следующим условиям:
Во время последовательной записи в ATmega128 данные тактируется нарастающим фронтом SCK. Во время чтения данных из ATmega128 данные тактируются падающим фронтом SCK. Временная диаграмма представлена на рисунке 145.
Прим.: если какая-либо другая команда, кроме опроса (чтения), вводится перед завершением любой операции записи (флэш-память, ЭСППЗУ, биты защиты, конфигурационные биты) программирование может завершиться некорректно.
После того, как страница полностью запрограммирована во флэш-память, при чтении по адресам в пределах запрограммированной страницы возвращается $FF. Микроконтроллер готов к записи новой страницы, если запрограммированное значение считано корректно. Это используется для определения момента, когда может быть загружена следующая страница. Обратите внимание, что запись выполняется всей страницы одновременно и любой адрес в пределах страницы может использоваться для опроса. Опрос данных флэш-памяти не действует для значения $FF, т.к. при записи этого значения пользователь может не вводить задержку tWD_FLASH перед программированием новой страницы. Данная возможность объясняется тем, что очищенная память микроконтроллера содержит $FF во всех ячейках. Значение tWD_FLASH представлено в таблице.
При чтении значения по адресу, который использовался для записи нового байта и последующего его программирования в ЭСППЗУ, возвращается значение $FF. В это же время, микроконтроллер готов к записи нового байта, если запрограммированное значение корректно считывается. Это используется для определения момента, когда может быть осуществлена запись следующего байт. Данное не распространяется на значение $FF, но программист должен обратить внимание на следующее: поскольку очищенная память заполнена $FF по всем адресам, то программирование ячейки значением $FF может быть пропущено. Пропуск нельзя делать, если ЭСППЗУ перепрограммируется без предварительного стирания всей памяти. В этом случае, значение $FF нельзя использовать для опроса данных и программист должен предусмотреть задержку не менее tWD_EEPROM перед программированием следующего байта. В таблице представлен о значение tWD_EEPROM.
Таблица. Минимальные длительности задержек перед записью очередной ячейки флэш-памяти и ЭСППЗУОбозначение | Минимальная задержка |
tWD_FLASH | 4.5 мс |
tWD_EEPROM | 9.0 мс |
tWD_ERASE | 9.0 мс |
Инструкция | Формат инструкции | Функция |
Разрешение программирования | 10101100 01010011 xxxxxxxx xxxxxxxx | Разрешение последовательного программирования после подачи лог. 0 на RESET. |
Стирание кристалла | 10101100 100xxxxx xxxxxxxx xxxxxxxx | Стирание ЭСППЗУ и флэш-памяти |
Чтение памяти программ | 0010H000 aaaaaaaa bbbbbbbb oooooooo | Чтение старшего (H=1) или младшего (H=0) байта данных o из памяти программ по адресу a:b. |
Загрузка страницы памяти программ | 0100H000 xxxxxxxx xbbbbbbb iiiiiiii | Запись старшего (H=1) или младшего (H=0) байта данных i в страницу памяти программ по адресу b. Мл. байт данных должен быть загружен перед старшим байтом по тому же адресу. |
Запись страницы памяти программ | 01001100 aaaaaaaa bxxxxxxx xxxxxxxx | Запись страницы памяти программ по адресу a:b. |
Чтение ЭСППЗУ | 10100000 xxxxaaaa bbbbbbbb oooooooo | Чтение данных o из ЭСППЗУ по адресу a:b. |
Запись ЭСППЗУ | 11000000 xxxxaaaa bbbbbbbb iiiiiiii | Запись данных i в ЭСППЗУ по адресу a:b. |
Чтение бит защиты | 01011000 00000000 xxxxxxxx xxoooooo | Чтение бит защиты. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 116. |
Запись бит защиты | 10101100 111xxxxx xxxxxxxx 11iiiiii | Запись бит защиты. Запись "0" приводит к программированию бита защиты. См. табл. 116. |
Чтение сигнатурного байта | 00110000 xxxxxxxx xxxxxxbb oooooooo | Чтение сигнатурного байта o по адресу b. |
Запись конфигурационных бит | 10101100 10100000 xxxxxxxx iiiiiiii | Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
Запись старших конфигурационных бит | 10101100 10101000 xxxxxxxx iiiiiiii | Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
Запись расширенных конфигурационных бит | 10101100 10100100 xxxxxxxx xxxxxxii | Указывайте "0" для программирования, "1" для стирания. См. табл. 120. |
Чтение конфигурационных бит | 01010000 00000000 xxxxxxxx oooooooo | Чтение конфигурационных бит. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 120. |
Чтение расширенных конфигурационных бит | 01010000 00001000 xxxxxxxx oooooooo | Чтение расширенных конфигурационных бит. "0" - запрограммирован, "1" - не запрограммирован. См. табл. 120. |
Чтение старших конфигурационных бит | 01011000 00001000 xxxxxxxx oooooooo | Чтение старших конфигурационных бит. "0" = запрограммирован, "1" = не запрограммирован. См. табл. 119. |
Чтение калибровочного байта | 00111000 xxxxxxxx 000000bb oooooooo | Чтение калибровочного байта o по адресу b. |
Это прямое управление выводами какого либо порта. В COM порт можно отправить байт через какой либо высокоупровневый API и он просто выйдет через линию TX потоком стандартого RS232 сигнала. А можно достучаться напрямую до регистров отвечающих за состоянием каждого пина порта и управляя ими можно сэмулировать через тот же COM порт не только RS232, но и SPI, I2C или Dallas 1-wire, HD44780 протокол.
Наилучшие результаты показал следующий вариант адаптера:
После сборки желательно проверить осциллографом амплитуду сигналов во время чтения. При первом включении микроконтроллер лучше вынуть из панельки.
Проверка выполняется совместно с программой AVRDude (см. ниже). Периодически нажимая любую кнопку чтения фьюзов "Read", наблюдаем за следующими сигналами:
Сигнал SCK должен быть близок к меандру с частотой 100...150 Гц и амплитудой 3,5...4,5 В. Сигналы MOSI и RESET имеют аналогичную амплитуду. Если уровень всех сигналов отличается от указанного, следует подкорректировать значения резисторов R5...R7.
Нелишним будет проверить и напряжение питания на указанных в схеме выводах МК.
Если всё в порядке, нужно вставить микроконтроллер и проверить сигнал MISO на выводе 8 USB-COM преобразователя, естественно, после нажатия кнопки "Read". Далее пробуем записать в МК какую-либо программу.
Поскольку скорость записи крайне мала, то для экономии времени следует проверять адаптер на небольших файлах прошивок с обязательной верификацией записанной программы. После успешного тестирования верификацию можно запретить.
Совместно с адаптером используется программа AVRDude с графической надстройкой AVRDudeGui:
programmer id = "stk500_by_petka"; desc = "AvrUsb500 by Petka, reset=!txd sck=!rts mosi=!dtr miso=!cts"; type = serbb; reset = ~3; sck = ~7; mosi = ~4; miso = ~8; ;
Не забудьте поменять "mega168" и "com3" на соответствующие Вашим.
Символы "\\.\" в командной строке avrdude нужны для доступа к компортам номер которых больше 9, например к COM15
(при активном использовании микросхем FT232 количество компортов зарегистрированных в системе часто превышает 10 штук).
Если номер компорта односимвольный, то этот префикс можно и не использовать. но лишним он никогда не бывает.
Информация относится вообще к Windows API. Т.е. так надо открывать файл компорта в windows , номер которого больше 9.
Написано соответственно в MSDN.
Программатор AVRDude для МК AVR
Пишем в контроллер программой PonyProg2000 (программа, русификатор, справочник)
Если под рукой не оказалось резонатора на требуемую частоту 14,7456 МГц, можно установить резонатор со старой материнской платы на частоту 14,3181 МГц. Сбоев в работе программатора не наблюдалось.
После монтажа программатора необходимо запрограммировать микроконтроллер. При этом должны быть запрограммированы (т.е. установлены = "0") следующие фьюзы (ATmega8, 14.7456 МГц):
Все остальные фьюзы должны быть незапрограммированные, т.е. установлены = "1". Как правило, установка флажка напротив названия фьюза в программе программатора, соответствует программированию соответствующего фьюза, однако бывают исключения.
После установки запрограммированного МК в программатор подключаем преобразователь USB-COM к компьютеру. В диспетчере устройств операционной системы узнаём номер появившегося виртуального порта. Запускаем программу HyperTerminal. Запуск либо из главного меню Пуск \ Программы \ Стандартные \ Связь \ HyperTerminal (C:\ ProgramFiles \ Windows NT \ hypertrm.exe), либо через файл в архиве с документацией. Основные настройки программы, кроме номера порта, следующие:
После выполнения настроек включаем питание программатора. При этом светодиод должен быстро мигнуть шесть раз,
затем светиться постоянно (горизонтальный масштаб 100 мс/дел):
Далее в программе HyperTerminal два раза нажимаем "Enter" на клавиатуре. Должно появиться сообщение:
Если сообщение не появляется, нужно проверить осциллографом прохождение сигнала по линии PC_TxD от преобразователя
USB-COM к микроконтроллеру. Периодически нажимая клавишу "Enter" на клавиатуре проверяем наличие и амплитуду сигнала.
Верхняя эпюра соответствует сигналу на контакте 3 разъёма RS-232, нижняя - на выводе 2 микроконтроллера.
Вертикальный масштаб: 5 В/дел, горизонтальный масштаб: 20 мкс/дел:
Если данные к микроконтроллеру поступают, проверяем "ответ" микроконтроллера на полученную команду.
На верхней эпюре показан сигнал на выводе 3 микроконтроллера после нажатия "Enter", на нижней -
сигнал на контакте 2 разъёма RS-232. Вертикальный масштаб: 2 В/дел, горизонтальный масштаб: 20 мкс/дел:
Амплитуды всех сигналов за исключением контакта 3 разъёма RS-232 должны быть близки к напряжению питания программатора.
Итак, если сообщение есть, вводим цифру "2", нажимаем "Enter". После этого появляется новая строка:
Переключаем раскладку на английскую и вводим букву "a", что соответствует десятичной цифре "10". То, что сейчас было введено - версия программатора. Должна быть 2.10, иначе данный программатор нельзя будет использовать с некоторыми управляющими программами "верхнего уровня".
Программатор может определять подключение к программируемому контроллеру. Реализовано это путём проверки
"подтяжки" линии Reset к Vcc (со стороны программируемого микроконтроллера). Если подключение есть,
то программатор включит светодиод HL1. Этот тест можно отключить или включить:
"1", "Enter" - тест включён; "0", "Enter" - тест выключен.
Сигнал 1 МГц включается / выключается в следующем "пункте меню":
"1", "Enter" - сигнал присутствует, скорость программирования небольшая; "0", "Enter" - сигнал выключен,
при этом скорость программирования максимальна.
Конфигурирование программатора завершено:
Закрываем программу HyperTerminal. После этого пробуем запрограммировать какой-либо микроконтроллер.
Для работы с программатором можно использовать программу AVRDude (см. файлы к статье). Эта программа консольная,
управляется из командной строки. Для упрощения использования имеется надстройка AVRDudeGui, внешний вид которой показан на рисунке:
Скорость работы программатора можно косвенно оценить по следующему: при отключенном сигнале 1 МГц программирование микроконтроллера ATmega16 занимает 4 секунды (размер прошивки 8 кБ, т.е. половина всей памяти данного МК).
BQ1 | HC-49/U | 18.4320MHz, 14.7456MHz |
C1 | C_0805 | 0,1uF |
C2 | C_0805 | 0,1uF |
C3 | C_0805 | 0,1uF |
C4 | TANTAL_D | 4,7-47uF |
C5 | C_0805 | 0,1uF |
C6 | C_0805 | 0,1uF |
C7 | C_0805 | 0,1uF |
C8 | C_0805 | 0,1uF |
C9 | C_0805 | 0,1uF |
DD1 | FT232RL | |
DD2 | ATMEGA8, ATMEGA88, ATMEGA16, ATMEGA168, ATMEGA48 (light) | (TQFP32!!!) |
HL1 | LED_0805 | Green |
L1 | Ferrite bead or Chip coil | ~10uH, 0,5A |
R1 | R_0805 | 10k |
R2 | R_0805 | 1k |
R3 | R_0805 | 100 |
R4 | R_0805 | 100 |
R5 | R_0805 | 220 |
R6 | R_0805 | 220 |
R7 | R_0805 | 100 |
R8 | R_0805 | 220k |
R9 | R_0805 | 100k |
X1 | USB_B | |
X2 | for wire to X3 in «normal mode» or to X4 in «sefl programming» | |
X3 | ||
X4 | ||
X5 | 1 Mhz output pad | |
X6 | Ground pad | |
X7 | IDC-10(R), BH-10(R), PLD-10(R) |
С появлением микросхемы конвертера USB-UART FT232R стал доступен битбанг режим не через виртуальный COM порт, а напрямую через драйвер FTDI.
За это там отвечают 8 выводов:
В datasheet её нет, но она есть в
Application Note AN_232R-01 for the FT232R and FT245R Bit Bang Modes.
Но у этого программатора есть один минус — он не отдает линию RESET по завершении программирования. Поэтому чтобы схема стартанула надо отключить от программируемого контроллера разьём ISP, что очень неудобно. Поэтому добавим к этой схеме буфферную микросхему 74HC244. Такая же использовалась в программаторе STK200.
Прошиваются микроконтроллеры этим программатором посредством программы avrdude, причём, она не простая, а немного переделанная и с дополнительной библиотечкой именно для битбанга. Со старой программой, то что под USBASP, ничего не заработало. А также немного подправленный avrdude.conf, где определен новый программатор.
#FTDI_Bitbang programmer id = "ftbb"; desc = "FT232R Synchronous BitBang"; type = ft245r; miso = 3; # CTS(11 PIN FT232R) sck = 5; # DSR(9 PIN FT232R) mosi = 6; # DCD(10 PIN FT232R) reset = 7; # RI (6 PIN FT232R) ;
В архиве программа avrdude с файлом конфигурации. Также надо поставить драйвера FTDI и воткнуть прорамматор в USB, чтобы в системе появился виртуальный COM порт. Это будет означать что все встало и работает.
Распаковать архив с avrdude в папку с именем из латинских символов и коротким путём, C:\FTBB\ например. Консольные утилиты, очень не любят русские символы, а также длинные имена с пробелами.
Avrdude очень мощная программа, она поддерживает практически все возможные программаторы. Но она консольная, для чего потребуется некоторая сноровка.
Для примера возьмём бутлоадер на ATmega16.
Для прошивки нам потребуется командная строка такого вида:
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a
Но, так как изначально atmega16 настроена на частоту в 1Мгц, а битбангом пытаемся прошить данные на максимальной скорости, то ничего не получится. Для обхода этой проблемы есть ключ снижения скорости -В, и команда будет выглядеть следующим образом:
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a -В 4800В результате чего, прошиваться будет медленно, раз так в 10. Но и тут можно схитрить, и в начале прошить fuse-биты на более высокую частоту, а потом вернуть их обратно.
Запустив эту команду, можно увидеть в консоли следующие сообщения:
c:\FTBB>avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a -B 4800 avrdude.exe: BitBang OK avrdude.exe: pin assign miso 3 sck 5 mosi 6 reset 7 avrdude.exe: drain OK ft245r: bitclk 4800 -> ft baud 2400 avrdude.exe: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude.exe: Device signature = 0x1e9403 avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be perfo rmed To disable this feature, specify the -D option. avrdude.exe: erasing chip ft245r: bitclk 4800 -> ft baud 2400 avrdude.exe: reading input file «m16boot.hex» avrdude.exe: input file m16boot.hex auto detected as Intel Hex avrdude.exe: writing flash (16310 bytes): Writing | ################################################## | 100% 115.44s avrdude.exe: 16310 bytes of flash written avrdude.exe: verifying flash memory against m16boot.hex: avrdude.exe: load data flash data from input file m16boot.hex: avrdude.exe: input file m16boot.hex auto detected as Intel Hex avrdude.exe: input file m16boot.hex contains 16310 bytes avrdude.exe: reading on-chip flash data: Reading | ################################################## | 100% 109.06s avrdude.exe: verifying … avrdude.exe: 16310 bytes of flash verified avrdude.exe: safemode: Fuses OK avrdude.exe done. Thank you.
Fuse-биты шьются следующей командной строко. Внимание!!! Справедливо ТОЛЬКО ДЛЯ ATmega16, для других AVR значение fuse-байтов другие, и их надо уточнять в datasheet, иначе можно заблокировать кристалл!!!:
avrdude.exe -p m16 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:mТут старший, младший и биты защиты задаются просто числом. Если перевести его в двоичное, то получим конкретные биты. Не очень удобный способ, зато ошибиться с нотацией сложней. Скорость сделать лучше маленькой, т.к. они все равно прошиваются мгновенно на любой скорости.
Чтобы упростить работу с командами в консоли, можно создать командный файл burnboot.cmd в который вписать две строчки:
avrdude.exe -p m16 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:mИ можно прошивать в один клик. Вначале идут fuse, чтобы скорость тактовую поднять и шить на предельной скорости, а потом шьём прошивку.
В качестве подопытного будет выступать МК ATtiny13 фирмы Atmel. Описанная методика работает практически с любым контроллером семейства AVR, разве что коды команд могут незначительно отличаться.
Самым распространенным и удобным интерфейсом для прошивки AVR является SPI (Serial Peripheral Interface). Для подключения по SPI нужно всего четыре провода, не считая земли:
Таким образом, нам необходимо сформировать три сигнала и (необязательно) прочитать один. Вот так выглядит простейшая схема для этого:
Для своего же удобства можно добавить индикацию входных сигналов. Схема усложняется, но не чрезмерно:
К сожалению, просто используя кнопки для формированя сигналов SPI, хорошего результата мы не добьёмся. Причина этого — в неприятном явлении, которое называется дребезг контактов. При замыкании механические контакты соударяются, отскакивают друг от друга, и вместо одного импульса получается несколько. Для подавления дребезга придется собрать простую схему из пары логических элементов:
Это RS-триггер, который переключается в состояние «1» в момент замыкания нижнего контакта переключателя и игнорирует остальные импульсы дребезга. Сброс триггера обратно в «0» происходит при замыкании верхнего контакта, то есть при отпускании кнопки.
Сигналы MOSI и RESET не требуют подавления дребезга, в отличие от SCK: здесь значение имеет только уровень сигнала в момент выборки, а не его фронты.