Последовательное программирование

Источник

Флэш-память и ЭСППЗУ могут быть запрограммированы через последовательный интерфейс SPI, когда вход RESET переведен в низкое состояние. Последовательный интерфейс состоит из следующих сигналов: SCK, MOSI (вход) и MISO (выход). После подачи низкого уровня на вход RESET необходимо выполнить инструкцию разрешения программирования. В таблице 128 представлено описание сигналов программирования. Обратите внимание, что не все выводы последовательного программирования совпадают с выводами внутреннего интерфейса SPI. Также следует отметить, что повсюду при описании последовательного программирования используются наименования MOSI и MISO для описания последовательного ввода и вывода данных, соответственно. Для ATmega128 соответствующие выводы программирования именуются PDI и PDO.

Расположение выводов последовательного программирования через SPI

Несмотря на то, что при последовательном программирования используется тот же модуль SPI, что и при обычной работы микроконтроллера, имеется одно важное отличие: выводы MOSI/MISO модуля ввода-вывода SPI, которые совмещены с PB2 и PB3, не используются при программировании. Вместо них используются PE0 и PE1 для ввода и вывода данных при последовательном программировании (см. табл. 128).

Таблица. Выводы интерфейса SPI при последовательном программировании
ОбозначениеВыводНаправлениеОписание
MOSI (PDI)PE0вводПоследовательный ввод данных
MISO (PDO)PE1выводПоследовательный вывод данных
SCKPB1вводСинхронизация последовательной связи

Рисунок 6. Последовательное программирование и проверка

Во время программирования ЭСППЗУ функция стирания выполняется автоматически (только в режиме последовательного программирования) и, поэтому, нет необходимости первоначально выполнять команду "Стирание кристалла". Выполнение команды "Стирание кристалла" приводит к заполнению памяти программ и ЭСППЗУ кодом $FF.

Параметры тактового сигнала зависят от настроек синхронизации микроконтроллера конфигурационными битами CKSEL. Длительности высокого и низкого уровней тактового сигнала (SCK) должны отвечать следующим условиям:

Алгоритм последовательного программирования через SPI

Во время последовательной записи в ATmega128 данные тактируется нарастающим фронтом SCK. Во время чтения данных из ATmega128 данные тактируются падающим фронтом SCK. Временная диаграмма представлена на рисунке 145.

Опрос данных флэш-памяти

После того, как страница полностью запрограммирована во флэш-память, при чтении по адресам в пределах запрограммированной страницы возвращается $FF. Микроконтроллер готов к записи новой страницы, если запрограммированное значение считано корректно. Это используется для определения момента, когда может быть загружена следующая страница. Обратите внимание, что запись выполняется всей страницы одновременно и любой адрес в пределах страницы может использоваться для опроса. Опрос данных флэш-памяти не действует для значения $FF, т.к. при записи этого значения пользователь может не вводить задержку tWD_FLASH перед программированием новой страницы. Данная возможность объясняется тем, что очищенная память микроконтроллера содержит $FF во всех ячейках. Значение tWD_FLASH представлено в таблице.

Опрос данных ЭСППЗУ

При чтении значения по адресу, который использовался для записи нового байта и последующего его программирования в ЭСППЗУ, возвращается значение $FF. В это же время, микроконтроллер готов к записи нового байта, если запрограммированное значение корректно считывается. Это используется для определения момента, когда может быть осуществлена запись следующего байт. Данное не распространяется на значение $FF, но программист должен обратить внимание на следующее: поскольку очищенная память заполнена $FF по всем адресам, то программирование ячейки значением $FF может быть пропущено. Пропуск нельзя делать, если ЭСППЗУ перепрограммируется без предварительного стирания всей памяти. В этом случае, значение $FF нельзя использовать для опроса данных и программист должен предусмотреть задержку не менее tWD_EEPROM перед программированием следующего байта. В таблице представлен о значение tWD_EEPROM.

Таблица. Минимальные длительности задержек перед записью очередной ячейки флэш-памяти и ЭСППЗУ
ОбозначениеМинимальная задержка
tWD_FLASH4.5 мс
tWD_EEPROM9.0 мс
tWD_ERASE9.0 мс

Осциллограммы сигналов последовательного программирования интерфейса SPI
Набор инструкций последовательного программирования через SPI
ИнструкцияФормат инструкцииФункция
Разрешение программирования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.
Характеристики последовательного программирования через интерфейс SPI

COM программаторы

Bitbang

Это прямое управление выводами какого либо порта. В COM порт можно отправить байт через какой либо высокоупровневый API и он просто выйдет через линию TX потоком стандартого RS232 сигнала. А можно достучаться напрямую до регистров отвечающих за состоянием каждого пина порта и управляя ими можно сэмулировать через тот же COM порт не только RS232, но и SPI, I2C или Dallas 1-wire, HD44780 протокол.

COM программатор через USB-COM преобразователь

Источник

Наилучшие результаты показал следующий вариант адаптера:

После сборки желательно проверить осциллографом амплитуду сигналов во время чтения. При первом включении микроконтроллер лучше вынуть из панельки.

Проверка выполняется совместно с программой AVRDude (см. ниже). Периодически нажимая любую кнопку чтения фьюзов "Read", наблюдаем за следующими сигналами:

Сигнал SCK должен быть близок к меандру с частотой 100...150 Гц и амплитудой 3,5...4,5 В. Сигналы MOSI и RESET имеют аналогичную амплитуду. Если уровень всех сигналов отличается от указанного, следует подкорректировать значения резисторов R5...R7.

Нелишним будет проверить и напряжение питания на указанных в схеме выводах МК.

Если всё в порядке, нужно вставить микроконтроллер и проверить сигнал MISO на выводе 8 USB-COM преобразователя, естественно, после нажатия кнопки "Read". Далее пробуем записать в МК какую-либо программу.

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

Совместно с адаптером используется программа AVRDude с графической надстройкой AVRDudeGui:

Не забудьте поменять "mega168" и "com3" на соответствующие Вашим.

Символы "\\.\" в командной строке avrdude нужны для доступа к компортам номер которых больше 9, например к COM15 (при активном использовании микросхем FT232 количество компортов зарегистрированных в системе часто превышает 10 штук). Если номер компорта односимвольный, то этот префикс можно и не использовать. но лишним он никогда не бывает.
Информация относится вообще к Windows API. Т.е. так надо открывать файл компорта в windows , номер которого больше 9. Написано соответственно в MSDN.

Программатор AVRDude для МК AVR

Вариант COM-AVR

Источник
Источник

Пишем в контроллер программой PonyProg2000 (программа, русификатор, справочник)


AvrUsb500 by Petka. Программатор для внутрисхемного програм­мирова­ния микроконтроллеров AVR, совместимый с STK500v2 by Petka

Упрощённый вариант

Источник

Архив

Если под рукой не оказалось резонатора на требуемую частоту 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 кБ, т.е. половина всей памяти данного МК).

Исходный вариант

Источник
Источник

BQ1HC-49/U18.4320MHz, 14.7456MHz
C1C_08050,1uF
C2C_08050,1uF
C3C_08050,1uF
C4TANTAL_D4,7-47uF
C5C_08050,1uF
C6C_08050,1uF
C7C_08050,1uF
C8C_08050,1uF
C9C_08050,1uF
DD1FT232RL
DD2ATMEGA8, ATMEGA88, ATMEGA16, ATMEGA168, ATMEGA48 (light)(TQFP32!!!)
HL1LED_0805Green
L1Ferrite bead or Chip coil~10uH, 0,5A
R1R_080510k
R2R_08051k
R3R_0805100
R4R_0805100
R5R_0805220
R6R_0805220
R7R_0805100
R8R_0805220k
R9R_0805100k
X1USB_B
X2for wire to X3 in «normal mode» or to X4 in «sefl programming»
X3
X4
X51 Mhz output pad
X6Ground pad
X7IDC-10(R), BH-10(R), PLD-10(R)

USB программатор на FT232RL

Источник

С появлением микросхемы конвертера 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
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a

И можно прошивать в один клик. Вначале идут fuse, чтобы скорость тактовую поднять и шить на предельной скорости, а потом шьём прошивку.

avrdude, справочник и .conf для него. Так же GUI и .bat
Сайт для высталения fuse микроконтроллерам

Прошиваем AVR вручную

Источник

В качестве подопытного будет выступать МК ATtiny13 фирмы Atmel. Описанная методика работает практически с любым контроллером семейства AVR, разве что коды команд могут незначительно отличаться.

Интерфейс

Самым распространенным и удобным интерфейсом для прошивки AVR является SPI (Serial Peripheral Interface). Для подключения по SPI нужно всего четыре провода, не считая земли:

Таким образом, нам необходимо сформировать три сигнала и (необязательно) прочитать один. Вот так выглядит простейшая схема для этого:


Рис. 1. Простейшая схема подключения по SPI.

Для своего же удобства можно добавить индикацию входных сигналов. Схема усложняется, но не чрезмерно:


Рис. 2. Схема с индикацией сигналов.

Защита от дребезга

К сожалению, просто используя кнопки для формированя сигналов SPI, хорошего результата мы не добьёмся. Причина этого — в неприятном явлении, которое называется дребезг контактов. При замыкании механические контакты соударяются, отскакивают друг от друга, и вместо одного импульса получается несколько. Для подавления дребезга придется собрать простую схему из пары логических элементов:


Рис. 3. RS-триггер для подавления дребезга.

Это RS-триггер, который переключается в состояние «1» в момент замыкания нижнего контакта переключателя и игнорирует остальные импульсы дребезга. Сброс триггера обратно в «0» происходит при замыкании верхнего контакта, то есть при отпускании кнопки.

Сигналы MOSI и RESET не требуют подавления дребезга, в отличие от SCK: здесь значение имеет только уровень сигнала в момент выборки, а не его фронты.


Рис.4. Экспериментальная схема

Рис.5. аспиновка разъема программатора