AVR910: Внутрисистемное программирование
Особенности
Интерфейс программирования
     
Для внутрисистемного программирования, программатор подключается к программируемому устройству как можно меньшим числом проводов. Для программирования любого AVR MCU в любом устройстве, используется простой 6-ти проводной интерфейс для подключения программатора к плате программируемого устройства. Рисунок 1, внизу, показывает необходимые соединения.
КОНТАКТ | НАЗВАНИЕ | КОММЕНТАРИЙ |
SCK | Тактовый сигнал | Тактовый сигнал программирования, вырабатываемый внутрисистемным программатором (главным) |
MOSI | Главный выход-подчиненный вход | Линия передачи данных от программатора (главный), к программируемому MCU (подчиненный) |
MISO | Главный вход-подчиненный выход | Линия передачи данных от программируемого MCU(подчиненный) к программатору (главный) |
GND | Общая земля | Оба устройства должны иметь общую землю |
RES | Сброс программируемого MCU | Для входа в режим последовательного программирования, сброс программируемого AVR MCU должен удерживаться в активном состоянии. Чтобы упростить процедуру программирования, внутрисистемный программатор должен контролировать сброс программируемого AVR MCU. |
Vcc | Питание программируемого MCU | Для программирования при любом разрешенном напряжении питания (2.7 - 6.0 V), внутрисистемный программатор может питаться от программируемого устройства. Аналогично, программируемое устройство может питаться через разъем внутрисистемного программирования во время цикла программирования. |
АППАРАТНЫЕ ОСОБЕННОСТИ ПРОЕКТИРОВАНИЯ
     
Для возможности программирования в системе AVR MCU, нужные выводы подчиненного MCU должны быть освобождены подчиненным устройством по требованию. Этот раздел описывает детально каждый вывод использоваемый при программировании.
GND
     Системному программатору и программируемому устройству необходимо работать с одинаковым опорным напряжением. Это достигается соединением земли программируемого устройства с землей программатора. Ни какие специальные требования к этому выводу не предъявляются.
RESET
     Подчиненный AVR MCU войдет в последовательный режим программирования, только когда его линия сброса в активном состоянии (низкий уровень). При стирании чипа, линия сброса должна быть переключена в конце цикла стирания. Для упрощения этой операции, рекомендуется, чтобы сброс программируемого устройства контролировался внутрисистемным программатором. Немедленно, после активизации RESET , внутрисистемный программатор начнет обмениваться по трем предназначенным для SPI проводам - SCK, MISO и MOSI. Чтобы избежать конфликта выходов, активный RESET должен немедленно отключить любой чип, управляющий этими линиями в программируемом устройстве. Обратите внимание, что AVR MCU автоматически устанавливает все эти I/O выводы как входы, с отключенными подтягивающими резисторами, когда RESET активен. Чтобы избежать проблем, внутрисистемный программатор должен быть способен удерживать полный сброс программируемого устройства в течение цикла программирования. Программируемое устройство, никогда не должно пытаться управлять тремя SPI линиями, пока сброс активен. Если использование системного программатора для контролирования сброса программируемого устройства невозможно, сброс может управляться вручную. Программатор должен просить оператора формировать сброс, когда это необходимо. Процедура будет проходить безопаснее и быстрее, если внутри системному программатору позволят считывать значение с линии сброса, чтобы проверить, что пользователь выполняет требуемые задачи. С изменением в программном обеспечении, программаторы произведенные ATMEL, могут поддерживать этот недостаток управления. Однако этот способ не рекомендуется.
SCK
     При программировании в последовательном режиме, внутрисистемный программатор выдает тактовый сигнал на SCK ножке. Этот вывод всегда управляется программатором, и программируемое устройство не должно пытаться управлять этим проводом, когда сброс активен. Немедленно, после того как вывод RESET становиться активным, на этом выводе программатором формируется ноль. В течение первой фазы цикла программирования предохраняйте SCK линию от пульсаций, так как они будут причиной потери синхронизации с программатором. Когда синхронизация потеряна, единственный способ восстановить синхронизацию, это освободить линию сброса больше чем на 100 миллисекунд. Программируемый AVR MCU всегда будет устанавливать SCK вывод как вход без подтягивающего сопротивления, всякий раз, когда RESET активен. Смотри также описание линии RESET. Минимальные длительности низкого и высокого уровня для входного последовательного тактового сигнала определяются как:
     Низкий: >1 XTAL1 период тактовой частоты
     Высокий: >4 XTAL1 периода тактовой частоты
MOSI
     При программировании AVR в последовательном режиме, внутрисистемный программатор выдает данные для программируемого устройства на вывод MOSI. Этот вывод всегда управляется программатором, и программируемое устройство некогда не должно пытаться управлять этим проводом, когда активен сброс программируемого устройства.
Программируемый AVR MCU всегда будет устанавливать MOSI вывод как вход без подтягивающего сопротивления, всякий раз, когда RESET активен. Смотри также описание линии RESET.
MISO
      Когда формируется сброс программируемого AVR MCU, вывод MISO устанавливается как вход без подтягивающего сопротивления. Только после того, как команда "Programming Enable" (Программирование разрешено) была правильно передана программируемому устройству, программируемый AVR MCU устанавливает свой вывод MISO как выход. Вначале, внутрисистемный программатор применяет свое подтягивающее сопротивление, для удержания MISO линии стабильной до тех пор, пока она не будет под управлением программируемого MCU.
V CC
      При программировании MCU, сигнала на выводах программатора, должны оставаться в пределах указанных в DC характеристиках. Для упрощения адаптации к любому напряжению питания программируемого устройства, программатор может получать необходимое питание от программируемого устройства. Это допустимо, так как внутрисистемный программатор будет потреблять очень маленькую энергию от программируемого устройства, обычно не больше 20 mA. Программатор представленный ATMEL работает именно в этом режиме. Как альтернатива, программируемое устройство может запитываться от программатора, через тот же разъем, который используется для связи. Это позволяет программируемому устройству быть запрограммированным без подключения внешнего источника питания.
     Таблица 2. Рекомендации при разработке устройства поддерживающего внутрисистемное программирование
ВЫВОД | РЕКОМЕНДАЦИИ |
GND | Соединение земли программируемого устройства с землей внутрисистемного программатора |
RESET | Позволяет внутрисистемному программатору сбрасывать программируемое устройство |
SCK | Когда сброс программируемого AVR MCU активен, эта линия не должна управляться программируемым устройством. Перепады на этой линии после установки на RESET низкого уровня, будут причиной потери синхронизации с программатором. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс активен. |
MOSI | Когда активен сброс программируемого AVR MCU, эта линия не должна управляться программируемым устройством. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс AVR активен. |
MISO | Когда активен сброс программируемого AVR MCU, эта линия должна иметь возможность быть выходом. При программировании, колебания на этом выводе должны допускаться окружающей системой, когда сброс AVR активен. |
Vcc | Можно питать внутрисистемный программатор от программируемого устройства, для адаптации к любому допустимому программируемым устройством напряжению. В зависимости от максимально необходимого потребляемого программатором тока, проявляйте осторожность при использовании программатора. |
Протокол программирования
     
Немедленно, после того как RESET программируемого AVR MCU становиться активным, микропроцессор готов к входу в режим программирования. Внутренний Последовательный Периферийный Интерфейс (SPI) активирован, и готов к приему инструкций от программатора.
      Очень важно удерживать вывод SCK стабильным, поскольку один единственный перепад станет причиной потери синхронизации с программатором. После установки сброса в низкий уровень, ждать минимум 20 ms перед выдачей первой команды.
Формат команд
     
Все команды имеют одинаковый формат, всегда состоящий из четырех байт. Первый бит содержит код команды, выбранной операции и памяти. Второй и третий биты содержат адрес выбранной ячейки памяти, Четвертый бит содержит данные, которые могут передаваться в любом направлении. Данные, возвращаемые программируемым устройством, обычно данные, посланные ему в предыдущем байте. В таблице 3 приведен пример, где передаются две последовательные команды. Обратите внимание, что все возвращаемые байты равны только что посланным. Некоторые команды возвращают один байт данных из памяти программируемого устройства. Этот байт всегда возвращается последним (байт 4).
Разрешение доступа к памяти
     
После того, как вывод RESET становиться активным, доступна только команда "Programming Enable" для SPI интерфейса. Только эта команда открывает доступ к Flash и EEPROM памяти, и без этой команды любые другие команды будут игнорироваться. В таблице 3 (см. выше) приведен пример, где разрешается доступ к памяти в первой посланной команде.
      После того как команда "Programming Enable" была послана в программируемое устройство, разрешается доступ к энергонезависимой памяти микроконтроллера, в соответствии с текущими установками защитных Lock - бит. Программируемое устройство не подтверждает команду "Programming Enable". Чтобы убедиться, что команда была принята программируемым AVR MCU, мы можем попробовать считать код устройства, также и известный как сигнатура.
     Таблица 3. Пример разрешение доступа к памяти и стиранию чипа.
ДЕЙСТВИЕ | MOSI, ПОСЛАННЫЕ ПРОГРАММИРУЕМОМУ AVR | MISO, ПРИНЯТЫЕ ОТ ПРОГРАММИРУЕМОГО AVR |
Разрешение программирования | $9C 53 xx yy | $zz 9C 53 xx |
Чтение кода устройства $1E по адресу $00 | $30 nn 00 mm | $yy 30 nn 1E |
БАЙТ 1 | БАЙТ 2 | БАЙТ 3 | БАЙТ 4 | ФУНКЦИЯ | |
Разрешение программирования | 1010 1100 | 0101 0011 | хххх хххх | хххх хххх | Разрешение последовательного программирования после установки низкого уровня на RESET |
Стирание чипа | 1010 1100 | 100х хххх | хххх хххх | хххх хххх | Стирание Flash, EEPROM и Lock бит |
Чтение Flash памяти программ | 0010 H000 | 0000 aaaa | bbbb bbbb | oooo oooo | Чтение H (старший или младший байт) данных o из памяти программ, слова по адресу a:b |
Запись Flash памяти программ | 0110 H000 | 0000 aaaa | bbbb bbbb | i i i i i i i i | Запись H (старший или младший байт) данных i в памяти программ, слова по адресу a:b |
Чтение EEPROM памяти | 1010 0000 | 0000 0000 | bbbb bbbb | oooo oooo | Чтение o данных из EEPROM памяти по адресу b |
Запись EEPROM памяти | 1110 0000 | 0000 0000 | bbbb bbbb | i i i i i i i i | Запись i данных в EEPROM память по адресу b |
Запись Lock бит | 1010 1100 | 111x x21x | хххх хххх | хххх хххх | Запись Lock бит, Установка бит 1,2 = "0" для программирования Lock бит |
Чтение кода устройства | 0011 0000 | хххх хххх | 0000 00bb | oooo oooo | Чтение кода устройства o |
Код устройства
     
После того как команда "Programming Enable" была успешно прочитана через SPI интерфейс, программатор может прочитать код устройства, известный также как сигнатура. Код будет указывать производителя (ATMEL), семейство микроконтроллеров (AVR), размер flash в килобайтах, и тип микроконтроллера (напр. AT90S1200).Формат команды "Read Device Code" (считать код устройства), находящийся в таблице 4: "Формат Команд Последовательного Программирования", будет [$30, $XX, $adr, $code]. Допустимые адреса $0, $1 или $2. Таблица 5 показывает, каким должен быть ожидаемый результат.
     Таблица 5. Допустимые кода устройства
КОД | ЗНАЧЕНИЕ КОДА | |
$00 | Код производителя | $1E производитель ATMEL $00 устройств защищено (Lock биты установлены), смотри ниже |
$01 | Семейство микроконтроллеров и размер Flash памяти | $90 AVR с 1кВ Flash памяти $91 AVR с 2кВ Flash памяти $92 AVR с 4кВ Flash памяти $93 AVR с 8кВ Flash памяти |
$02 | Тип микроконтроллера | Показывает тип, см. таблицу 6 |
Тип микроконтроллера | Микроконтроллер | |
$90 | $01 | AT90S1200 |
$91 | $01 | AT90S2313 |
$92 | $01 | AT90S4414 |
$93 | $01 | AT90S8515 |
$FF | $FF | Код устройства стерт (или устройство отсутствует) |
$01 | $02 | Устройство защищено (Lock биты установлены) |
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Чтение кода производителя по адресу $00 | $30 xx 00 yy | $zz 30 xx 1E |
Чтение семейства и раз. Памяти по адресу $01 | $30 nn 01 mm | $yy 30 nn 90 |
Чтение типа микроконтроллера по адресу $02 | $30 xx 02 yy | $mm 30 xx 01 |
Доступ к Flash памяти программ
      Когда семейство микроконтроллеров определено, прошло время начинать доступ к Flash памяти. Используя команду "Read Flash Program Memory" (чтение Flash-памяти программ), можно прочитать один байт содержимого Flash памяти за раз. Команда посылает адрес памяти ($0a bb) для выбора 16-битного слова, и выбирает младший или старший байт с помощью бита H ( 0 - младший, 1- старший байт). Байт, хранящийся по этому адресу, возвращается программируемым AVR MCU в байте 4.
     Обычно, каждое 16 - битное слова во Flash содержит одну AVR инструкцию. Допустим, что инструкция, сохраненная по адресу $104 это 'add r16,r17', тогда код операции для этой инструкции будет сохранен как $0F01. Считывая последовательно адрес $104, ожидается, что результат, возвращенный в байте 4 будет $0F из старшего байта, и $01 из младшего. Данные на линиях MISO и MOSI будут выглядеть, как показано в таблице 8.
      Таблица 8. Пример чтения 'add r16,r17' как $0F01 из Flash памяти по адресу $104
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Чтение $01 по адресу $104, младший байт | $20 01 04 xx | $zz 20 01 01 |
Чтение $F0 по адресу $104, старший байт | $28 01 04 yy | $xx 28 01 0F |
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Запись $12 по адресу $10С, младший байт | $60 01 0C 12 | $zz 60 01 0C |
Ждать 4 ms | ||
Запись $0F по адресу $10С, старший байт | $68 01 0C 0F | $xx 68 01 0C |
Ждать 4 ms |
Доступ к EEPROM памяти данных
      Используя команду "Read EEPROM Data Memory" ( чтение EEPROM памяти данных ), может быть прочитан один байт содержимого EEPROM за раз. Команда передает адрес памяти ($0a bb) для выбора расположения байта в EEPROM.
      Таблица 10. Пример чтения $AB из EEPROM по адресу $3F
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Чтение $AB по адресу $3F | $A0 00 3F xx | $zz A0 00 AB |
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Чтение $0F по адресу $11 | $C0 00 11 0F | $zz C0 00 11 |
Ждать 4 ms |
Доступ к LOCK битам
      Для защиты содержимого памяти от случайной перезаписи, или от неправомочного считывания, могу устанавливаться Lock биты. Как видно из таблицы 12, память может быть также защищена от записи, или интерфейс программирования может быть полностью отключен от блока памяти, делая невозможным как считывание так и запись памяти микросхемы.
      Таблица 12. Режимы защиты Lock битами
Lock бит 1 | Lock бит 2 | Способ защиты |
1 | 1 | Нет защиты памяти |
0 | 1 | Запрещение дальнейшего программирования Flash и EEPROM памяти |
0 | 0 | Запрещение дальнейшего программирования и сравнения Flash и EEPROM памяти |
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Установка Lock бит 1 для запрещения программирования | $AC FD xx yy | $zz AC FD xx |
Ждать 4 ms |
Операция стирания чипа
      Прежде чем новое содержимое сможет бать записано во Flash память программ, память должна быть стерта. Без стирания, возможно программировать нулевые биты во Flash памяти, устанавливая в некоторые 1. Стирание памяти выполняется командой "Chip Erase" (стирание чипа). Эта команда стирает все содержимое памяти, как Flash памяти программ, так и EEPROM.
      Таблица 13. Пример стирания всего содержимого Flash памяти программ и EEPROM
Действие | MOSI, посланные программируемому AVR | MISO, принятые от программируемого AVR |
Стирание чипа | $AC 8x yy nn | $zz AC 8x yy |
Ждать 10 ms | ||
Освободить сброс для окончания стирания |
Простой недорогой внутрисистемный программатор
      Это примечание не обсуждает все аспекты внутрисистемного программатора. Вместо этого оно показывает, как может быть создан простой и дешевый программатор, используя только AT90S1200 и несколько дискретных компонентов. Этот программатор можно приобрести у ATMEL или у одного из её дистрибьюторов.
      Программатор подключается к любому последовательному порту любого PC. AT90S1200 не содержит аппаратную реализацию UART, но программно обеспечит полудуплексный UART используя таймер/счётчик 0 для синхронизации данных. AT90S1200 также полностью берет на себя заботу о программировании AVR, полностью программно, выполняя главный SPI.
      Схема программатора приведена на рис. 3. Питание AT90S1200 получает из программируемого устройства. Отрицательное напряжение необходимое для последовательной связи с РС через последовательный порт, сохраняется в С100, когда принимается единица (отрицательное напряжение на линии).
      Передающая линия питается этим отрицательным напряжением от С100, когда транзистор Q100 закрыт. Это посылает логическую единицу в линию передачи. Логический ноль (положительное напряжение) посылается открывающимся транзистором Q100, подсоединяя VCC (точнее V CC - 0.2 V) к передающей линии.
      Некоторые старые РС могут иметь последовательный порт, не определяющих напряжение ниже +10 вольт, как логический ноль. Однако, это не проблема для большинства существующих РС.
Список компонентов
Позиция | Значение | Компонент | Точность | Производитель | Комментарий | |
1 | C100 | 1 мкФх20 В | CE1U020V | 20% | PHILIPS | Тантаталовый конденсатор, SMD |
1 | C101 | 100 нФх50 В | C08B100N | 10% X7R | MURATA | Керамический конденсатор |
2 | D100, D101 | 75 В/ 100 мА | BAS16 | PHILIPS | Импульсный диод, корпус SO-23 | |
1 | J100 | 9 выводов | DSUB-9FSOL | HARTING | 9-штырьковый разьем D-SUB, мама | |
1 | J кабель | 6 выводов | HEADER6FC | HARTING | 6 контактный разьем, мама | |
1 | Q100 | 45 В/ 100 мА | BC857C | PHILIPS | SMD NPN транзистор, корпус SO-23 | |
1 | Q101 | 45 В/ 100 мА | BC847C | PHILIPS | SMD PNP транзистор, корпус SO-23 | |
6 | R100-105 | 4,7 кОм | R08_4K7 | 1% | KOA | Резистор, 0,125 Вт, 0805 |
1 | R106 | 1 мОм | NOT_USED | 1% | KOA | Резистор, 0,125 Вт, 0805 |
1 | U100 | SOIC - 20 | AT90S1200-4SC | ATMEL | AVR микроконтроллер | |
1 | XC100 | 4,0 МГц | CSTCC4.00MG | 0,5% | MURATA/AVX | Керамический резонатор, SMD |
1 | Корпус разъема | 9 выводов | D-SUB Корпус | 0,5% | AMP | Корпус 9-ти штырькового разъема |
1 | Кабель | 6 Проводов | Плоский кабель | HARTING | Плоский кабель, 300 мм | |
1 | Плата | FR4/ 1,6 мм | A9702.3.1000.A | ATMEL | Печатная плата |