Решение для внутрисхемного программирования
ООО «Остек-Электро»
Молдавская ул., д. 5, стр. 2, Москва, Россия, 121467
Тел.: +7 (495) 788-44-44, факс: +7 (495) 788-44-42,
www.ostec-group.ru, info@ostec-group.ru
ИНН 7731483966, КПП 773101001, ОГРН 5147746324754,
ОКПО 17184889

- Описание
- Технические характеристики
FlashRunner — универсальное средство для внутрисхемного программирования (ISP) в процессе производства электроники.
- универсальность — поддержка программируемых компонентов от разных производителей;
- скорость — уменьшение времени программирования, означающее уменьшение себестоимости;
- гибкость — быстрое изменение программной конфигурации;
- надежность — гарантия целостности данных, их защита и непрерывность производственного процесса.
Что такое внутрисхемное программирование In—System Programming (ISP)
Внутрисхемное программирование — это технология программирования компонентов уже после монтажа их на плату посредством различных интерфейсов.
Внутрисхемное программирование (ISP) устраняет традиционные ограничения, связанные с необходимостью программирования компонентов до установки их на плату и обеспечивает следующие преимущества:
- процесс становится проще и дешевле;
- программирование компонентов происходит на уже спаянной плате (модуле);
- есть возможность оперативного обновления прошивок без дополнительных затрат;
- происходит сокращение производственных затрат, есть совместимость с системами внутрисхемного и функционального контроля.
Flash Runner Series
A — Верхняя панель защищает основные аппаратные средства и содержит индикацию состояния программатора. Панель может быть легко удалена, если необходимо уменьшить занимаемое пространство — при интеграции с системами тестирования.
B — Встроенные часы реального времени/календарь дают возможность вести регистрацию процессов с привязкой по времени, позволяя отследить момент возникновения производственных проблем.
C — FlashRunner использует стандартную SD карту (до 2 ГБ) для хранения файлов прошивок, проектов и файлов системного журнала.
D — Легко интегрируется с тестовыми системами разных производителей, адаптерными устройствами и оснастками
E — Плата со средствами коммуникаций обеспечивает подключение к внешним системам программирования/тестирования. Включает оптоизолированные цепи, Ethernet для взаимодействия с хост-системой.
F — Основная плата программатора (едина для всей серий инструментов Flashrunner) обеспечивает основные функции программирования Flashrunner.
FlashRunner создан для ускорения процесса программирования. Аппаратные и программируемые средства спроектированы для обеспечения эффективного взаимодействия для устранения узких мест в коммуникациях. Развитые программные алгоритмы позволяют достигать технологических ограничений по скорости работы с памятью программируемого устройства. Это делает FlashRunner одним из самых быстрых универсальных внутрисхемных программаторов на рынке, позволяя значительно сократить себестоимость.
Широкая база поддерживаемых компонентов. Устройства FlashRunner полностью реконфигурируемые, имеют гибкие аппаратные средства, способные к программированию огромного количества основанных на FLASH памяти микроконтроллеров и памяти с последовательным интерфейсом. В настоящее время поддерживается больше чем 4500 устройств, и их список непрерывно увеличивается. Благодаря сотрудничеству с основными производителями программируемых компонентов идет постоянное обновление технической информации из первых рук, что дает возможность наиболее быстро и всесторонне обеспечить поддержку устройств.
FlashRunner компактен и надежен, с высокой гибкостью интеграции и расчетом способности работы в тяжелых производственных условиях. Оптоизолированные входы, ESD защита, проверка данных на ошибки при передаче и подробные отчеты делают FlashRunner отличным выбором, когда уверенность в качестве программного потока имеет особо важное значение.
Легкая интеграция с ATE и адаптерными устройствами. Универсальная интерфейсная система позволяет FlashRunner легко и эффективно интегрироваться в автоматизированные тестовые системы (ATE). FlashRunner работает как в автономном режиме, так и управляется по Ethernet или RS 232 интерфейсу.
Система защиты данных FlashRunner имеет дополнительную защиту, которая при несанкционируемом доступе делает содержание файлов для прошивки не читаемым и не копируемым. Кроме того, система защиты распространяется и на программный цикл, препятствуя вмешательству производственного персонала в процесс.
Программирование групповых заготовок. FlashRunner поддерживает программирование модулей в групповых заготовках. Многоканальные выходы ISP позволяют осуществлять программирование как нескольких устройств на одной плате, так и каждый модуль на групповой заготовке.
Особенности аппаратной части
FlashRunner разработан на современной элементной базе, обеспечивает высокую гибкость интеграции в компактном размере.
Открытая архитектура FlashRunner позволяет легко обновлять внутреннее программное обеспечение для поддержки новых устройств и новых функций.
Особенности программного обеспечения
FlashRunner управляется через систему базовых ASCII команд. FlashRunner может получать и выполнять команды двумя способами:
- через RS-232 or Ethernet соединение (Host mode);
- через скрипты (scripts), сохраненные в SD карте (Автономный режим).
В первом случае FlashRunner управляется хост-системой (например, через Windows HyperTerminal); во втором — работает в автономном режиме и полностью независимо.
FlashRunner поставляется с ПО под OS Windows, которое позволяет общаться с инструментом и выполнять наиболее распространенные операции: отправка команд, управление файлами на SD-карте, обновление внутренней прошивки оборудования и т.д.
- Полная независимость в автономном режиме благодаря SD карте.
- Управление через любую хост-систему посредством терминальных утилит и простого ASCII протокола.
- Неограниченное количество проектов (скриптов).
- Создание файлов-отчетов.
- Очистка, проверка чистоты, программирование, чтение, верификация, oscillator trimming и т.п.
| Входное питание 9-24V DC | 512 bytes динамической памяти |
| Пять цифровых линий I/O | Встроенные часы и календарь |
| Две цифровые I/O или аналоговые выходные линии | Защита по входам I/O |
| Два программируемых уровня выходного напряжения (0-15V, 0.25A и 0-5V, 0.5A) | Оптоизолированные входы для выбора проекта |
| Входная линия очистки и сброса | Две оптоизолированные командные линии (START, STOP) |
| Одна аналоговая входная линия | Три оптоизолированных линии выхода (FAIL, PASS, BUSY) |
| Один программируемый выход синхронизации | Оптоизолированные каналы RS232/ETHERNET |
| SD карта памяти (до 2GB) |
Внутрисхемное программирование Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Гаврилюк Дмитрий
Метод внутрисхемного (внутрисистемного) программирования (ISP — In-System Programmability) на сегодняшний день является основным способом программирования микроконтроллеров, ПЛИС и других приборов, в состав которых входит память Flash или EEPROM. В основе внутрисистемного программирования лежит идея использования какого-либо стандартного интерфейса, интегрированного в программируемую микросхему для последовательного занесения в нее программных или конфигурационных данных.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Гаврилюк Дмитрий
AVR – микроконтроллеры: семь ярких лет становления. Что дальше? Часть 3. Программные и аппаратные средства поддержки разработок для микроконтроллеров AVR
AVR – микроконтроллеры семь ярких лет становления. Что дальше? Часть 2. Ядро и перефирийные блоки AVR второго поколения
Avr – микроконтроллеры семь ярких лет становления. Что дальше? Часть 1. Текущее положение avr на мировом рынке микроконтроллеров
AVR микроконтроллеры: аппаратные средства разработчика
8-разрядные микроконтроллеры AVR корпорации Atmel: новинки и тенденции развития
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Текст научной работы на тему «Внутрисхемное программирование»
Компоненты и технологии, № 8’2003
Метод внутрисхемного (внутрисистемного) программирования (ISP — In-System Programmability) на сегодняшний день является основным способом программирования микроконтроллеров, ПЛИС и других приборов, в состав которых входит память Flash или EEPROM. В основе внутрисистемного программирования лежит идея использования какого-либо стандартного интерфейса, интегрированного в программируемую микросхему для последовательного занесения в нее программных или конфигурационных данных.
Типичная система ISP-программирования представляет собой комплекс средств, состоящий из персонального компьютера, интерфейсной платы и специализированного программного обеспечения. В зависимости от типа программируемой микросхемы могут использоваться различные средства программирования:
• специализированные программаторы, ориентированные на работу с определенными сериями микроконтроллеров, ПЛИС, DSP или CPLD (Complex Programmable Logic Device — комплексное программируемое логическое устройство);
• интерфейсные платы или так называемые «загрузочные кабели» для программирования с использованием персонального компьютера;
• тестовое оборудование (ATE — Automated Test Equipment), позволяющее помимо тестирования платы проводить также и программирование с использованием JTAG-интерфейса.
Основные преимущества использования ISP-технологии отражены в таблице 1.
Для понимания особенностей внутрисхемной отладки и программирования по ISP-технологии далее будут рассмотрены три основных интерфейса, используемых для этих целей:
Таблица 1. Достоинства технологии ISP
Момент использования Возможности Преимущества
Разработка и проектирование Программирование выполняется при рабочем напряжении микросхемы Не нужно использовать источник на 12 В или другое напряжение, не используемое при нормальной работе микросхемы
Микроконтроллер или ПЛИС программируется непосредственно в устройстве Снижается риск повреждения микросхемы от электростатики и механических воздействий
Сборка устройства осуществляется до окончания написания готовой программы Сокращается время выхода изделия на рынок, так как сборка устройства может проходить параллельно с написанием программы
Производство Программное обеспечение может быть загружено в микросхему с другого устройства на плате или во время производства печатной платы Упрощается и сокращается производственный цикл
Микросхема, поддерживающая ^-программирование, становится одним из многих устройств на плате и не требует к себе особого внимания
Микросхема может программироваться тестовой программой Расширяются возможности тестирования и внутрисхемной отладки
Эксплуатация Микросхема перепрограммируется непосредственно в составе работающего оборудования Возрастают функциональные возможности устройства и привлекательность для потребителя
• JTAG/IEEE 1149.1 — 4-проводной интерфейс, обеспечивающий тестирование и программирование микросхем, смонтированных на печатной плате;
• SPI — интерфейс, позволяющий реализовать высокоскоростной полнодуплексный синхронный обмен данными по 3-проводной шине и программирование в последовательном режиме;
• DebugWIRE — однопроводной интерфейс, используемый в новейших микроконтроллерах ATMEL, ориентированный на программирование встроенной памяти и отладку в составе готового устройства.
Бурное развитие электронной техники и связанный с этим рост степени интеграции микросхем к концу 70-х годов привели к необходимости разработки механизма тестирования, способного обеспечить полноценное тестирование сложных и функционально насыщенных печатных плат. В 1980 году группой JTAG (Joint Test Automation Group — объединенная рабочая группа по автоматизации тестирования) была начата разработка спецификации граничного (периферийного) сканирования, стандартизованная в 1990 году институтом IEEE. Получившийся стандарт известен как IEEE Std.1149.1-1990. В дальнейшем было выполнено несколько пересмотров стандарта. В 1994 году в него было добавлено описание языка BSDL (Boundary-Scan Description Language — язык описания устройств, поддерживающих периферийное сканирование). С этого момента стандарт был принят ведущими электронными компаниями во всем мире. В настоящее время многие небольшие фирмы, которые по экономическим причинам не могут воспользоваться дорогими внутрисхемными тестерами, используют технологию граничного сканирования. Последний раз стандарт был пересмотрен в 2001 году [1]. Текст стандарта можно приобрести в IEEE (http://shop.ieee.org).
Архитектура граничного сканирования (Boundary-Scan Test) обеспечивает тестирование соединений между интегральными схемами на плате без ис——-www.finestreet.ru—————————
Компоненты и технологии, № 8’2003
Приложения для тестирования и программирования
Рис. 1. Внутренняя организация микросхемы с поддержкой JTAG
пользования физических тестовых пробников. Предполагается, что тестируемые микросхемы имеют поддержку JTAG-интерфейса. Стандарт IEEE 1149.1 определяет 4-провод-ной (опционально 5-проводной) последовательный интерфейс доступа к микропроцессорам, DSP, CPLD. Любая совместимая с JTAG-интерфейсом микросхема (рис. 1) имеет регистры сдвига и модуль поддержки функций граничного сканирования. Ячейки регистра сдвига (BS-регистра) располагаются непосредственно между внешними выводами и функциональным ядром микросхемы.
Данные, поступающие в кристалл через вывод TDI, сохраняются в регистре инструкций или в одном из регистров данных. Последовательные данные выводятся из микросхемы через вывод TDO. Логический модуль интерфейса тактируется сигналом на входе TCK, не зависимом от системной тактовой частоты. Сигналы на входе TMS управляют состоянием порта TAP (Test Access Port). Вывод TRST является необязательным и служит для сброса логики интерфейса JTAG.
Множество микросхем, совместимых со стандартом IEEE 1149.1, могут последовательно соединяться друг за другом на печатной плате, формируя цепь граничного сканирования (рис. 2).
С ее помощью появляется возможность получать информацию о состоянии каждого вывода каждой микросхемы, являющейся частью общей цепи сканирования через последовательный TAP-интерфейс. При обычной работе устройства JTAG-интерфейс не оказывает никакого влияния на его работу.
При тестировании или внутрисхемном программировании с помощью JTAG-интерфейса можно воздействовать на логическое ядро микросхемы, выдавать логические сигналы на выводы микросхемы, считывать выходные сигналы от внутренней логики или значение логических уровней на выводах, впаянных в печатную плату.
Технология граничного сканирования позволяет испытывать плату на наличие структурных производственных ошибок и выполнять ISP-программирование почти всех устройств на плате, независимо от типа и размера встроенной памяти, через стандартный
JTAG TAP-интерфейс. В результате происходит значительное сокращение необходимых точек тестирования на плате. Это приносит много выгод: упрощается разводка печатной платы, снижаются затраты и время тестирования [2], сокращается время выхода готового изделия на рынок.
Файлы, содержащие описание поддерживаемых инструкций и конфигурационных параметров регистров сдвига JTAG-совместимых микросхем на языке BSDL, бесплатно доступны на сайтах фирм-производителей.
Интерфейс SPI (Serial Peripheral Interface — последовательный периферийный интерфейс) обеспечивает высокоскоростную передачу информации в синхронном режиме между ведущим и ведомыми устройствами. На рис. 3 показано включение ведущего и ведомого устройств с использованием SPI.
Ведущее устройство содержит 8-разрядный регистр сдвига и генератор синхроимпульсов. Инициирование цикла обмена данными происходит, когда ведущий устанавливает на выводе SS ведомого устройства лог. «0». Ведущее устройство генерирует необходимую тактовую последовательность на выводе SCK для обмена данными между сдвиговыми регистрами устройств. Данные побитно сдвигаются от ведущего к ведомому по линии MOSI (Master Out — Slave In) и от ведомого к ведущему по линии MISO (Master In — Slave Out). В итоге содержимое регистра сдвига ведущего оказывается в регистре сдвига ведомого и наоборот. После передачи каждого пакета
данных ведущий синхронизируется с ведомым установкой лог. «1» на линии SS.
Следует учитывать, что если устройство сконфигурировано как ведущее, модуль SPI-интерфейса автоматически не управляет линией SS. Передача нового байта данных происходит сразу же после его записи в регистр сдвига. При необходимости использования линии SS управлять ее состоянием должно программное обеспечение пользователя.
В AVR-микроконтроллере ATmega8 фирмы Atmel модуль SPI-интерфейса обладает следующими возможностями [3]:
• полнодуплексная 3-проводная синхронная передача данных;
• работа в режиме ведущего или ведомого;
• возможность определения порядка передачи: первым передается либо младший, либо старший бит;
• семь программируемых величин скорости передачи;
• флаг прерывания окончания передачи;
• флаг защиты от коллизий записи;
• система «пробуждения» из режима Idle;
• максимальная тактовая частота интерфейса в два раза ниже тактовой частоты процессорного ядра.
С помощью SPI легко организуется внутрисхемное программирование микроконтроллеров Atmel (рис. 4).
Для этого используется три линии интерфейса: MISO, MOSI и SCK. Вывод RESET подключается к «земле» у AVR-серии или к положительному источнику — у серии AT89Sx. В этом режиме обеспечивается программирование (запись и чтение) памяти программ и данных, а также конфигурационных битов кристалла.
8-битный регистр сдвига
Тактовый генератор SPI
8-битный регистр сдвига
Рис. 3. Подключение ведущего и ведомого устройств через SPI
Компоненты и технологии, № 8’2OO3
Выход данных -• Вход инструкций-Вход тактирования —
РВ 6 (MISO) РВ 5 (MOSI) РВ 7 (SCK)
Рис. 4. Внутрисхемное программирование микроконтроллеров Atmel через SPI-интерфейс
Рис. 5. Подключение микроконтроллера к интерфейсу DebugWIRE
В мае 2003 года Atmel анонсировала интегрированный в устройства ATtiny13 [4] и ATtiny2313 интерфейс DebugWIRE (One-Wire Debug Interface — однопроводной отладочный интерфейс). Он представляет собой встроенный в кристалл механизм отладки на основе одной двунаправленной линии передачи информации, позволяющий управлять программным потоком, выполнять AVR-инструкции ядра микроконтроллера и осуществлять программирование интегрированной энергонезависимой памяти.
Основные возможности интерфейса DebugWIRE:
• комплексное управление программным потоком;
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
• эмулирование всех функций кристалла, включая цифровые и аналоговые, за исключением вывода RESET;
• работа в реальном времени;
• поддержка символьной отладки (на основе исходных кодов ассемблера, С или других языков высокого уровня);
• неограниченное число программных точек останова;
• работа в «теневом» режиме (интерфейс не препятствует работе основной программы);
• электрические характеристики идентичны реальному устройству;
• автоматическое конфигурирование системы;
• высокая скорость работы;
• программирование энергонезависимой памяти.
Режим отладки в устройстве активируется установкой бита DWEN (debugWIRE Enable) и сброса Lock-битов микроконтроллера. Физическое подключение эмулятора интерфейса к микроконтроллеру производится через вывод RESET, который работает как двунаправленный вывод с открытым стоком с подтягивающим к шине питания резистором. На рис. 5 показана схема подключения отлаживаемого микроконтроллера в режиме debugWIRE к эмулятору.
Тактовая частота определяется установками битов CKSEL и не зависит от debugWIRE.
Когда разрабатывается система, в которой будет использоваться debugWIRE, необходимо соблюдать следующие требования:
• если используется «подтягивающий» резистор на выводе dW(RESET), величина его сопротивления должна лежать в диапазоне от 10 до 20 кОм;
• соединение вывода RESET напрямую с источником питания Vcc недопустимо;
• конденсаторы, подключенные к выводу RESET, должны быть отключены при использовании debugWIRE;
• все внешние источники сброса микроконтроллера должны быть отключены. Поддержка программных точек останова
в debugWIRE реализуется при работе с интегрированной средой разработки AVR Studio. При установке точки останова в исходной программе в AVR Studio в программную память микроконтроллера будет вставлена инструкция BREAK. Инструкция, замещенная инструкцией BREAK, будет сохранена. Когда выполнение программы будет продолжено, сначала будет выполнена инструкция, сохраненная из памяти программ. Команду останова можно вставить вручную, поместив инструкцию BREAK в программную память микроконтроллера. Следует учитывать, что Flash-память микроконтроллера перепрограммируется при каждом изменении точки останова. Этот процесс автоматически выполняет AVR Studio через интерфейс debugWIRE. Использование точек останова уменьшает ресурс Flash-памяти. Устройства, применявшиеся в отладке системы, не должны передаваться конечным пользователям.
Использование интерфейса debugWIRE накладывает некоторые ограничения на устройство, в котором он применяется. Коммуникационный вывод интерфейса dW физически совмещен с выводом внешнего сброса. Поэтому источники внешнего сброса не поддерживаются при работе debugWIRE.
Система debugWIRE точно эмулирует все входные и выходные функции на полной скорости, когда выполняется программа в CPU. Если процессорное ядро остановлено, необходимо проявлять осторожность при доступе к некоторым регистрам ввода-вывода через отладчик AVR Studio.
При установке бита DWEN (активации debugWIRE), некоторые части системы тактирования остаются в активном состоянии при переходе в режим «sleep», что приводит
к увеличению потребляемой мощности. Поэтому необходимо отключать DWEN, когда debugWIRE не используется. При работе с debugWIRE микроконтроллер использует 8-разрядный регистр DWDR, образующий коммуникационный канал между исполняемой в микроконтроллере программой и отладчиком. Этот регистр доступен только интерфейсу debugWIRE и не может быть использован как регистр общего назначения при нормальной работе.
Дальнейшее развитие идея внутрисхемного программирования получила в 8-разрядной серии AVR микроконтроллеров Atmel. В ней реализован механизм самопрограммирования Flash-памяти программ через интегрированные интерфейсы SPI, UART или TWI. Все операции по программированию и перепрограммированию процессорное ядро выполняет по программе, находящейся в загрузочной области программной памяти. Когда происходит самопрограммирование, данные считываются в оперативную память через внешний интерфейс и затем записываются в программную память блоками по 10, 128 или 256 байт. Особенности такого подхода состоят в следующем:
• возможно перепрограммирование готового изделия непосредственно в условиях его применения;
• снижаются затраты, поскольку нет необходимости использовать дополнительные компоненты;
• программирование может выполняться значительно быстрее, поскольку каждый сектор памяти стирается и программируется индивидуально;
• перепрограммирование осуществляется через различные периферийные интерфейсы;
• работа в режиме самопрограммирования осуществляется в полном температурном диапазоне и при любом допустимом напряжении питания.
Комплексы внутрисхемного программирования
Практическое применение ISP-технологии возможно с использованием аппаратно-программных комплексов самых разных производителей. Наиболее развитым направлением в этой сфере является производство разнообразных модулей и программных средств для решений на основе технологии JTAG/IEEE 1149.1. Гамма предлагаемых устройств включает контроллеры, подключаемые к портам ПК, а также устанавливаемые в слоты ISA, PCI, USB, PXI. Программное обеспечение этих приборов функционирует на платформе Windows (некоторые версии адаптированы для UNIX) и позволяет проводить тестирование, отладку модулей и перепрограммирование пользовательских микросхем на плате через стандартный TAP-интерфейс. Оборудование для работы с технологией граничного сканирования производят:
1. Corelis Inc., США (www.corelis.com).
2. JTAG Technologies, Нидерланды (www.jtag.com).
Компоненты и технологии, № 8’2003
Isp программирование что это такое
  AVR910: Внутрисистемное программирование Оригинал: Application Note AVR910 фирмы ATMEL перевел: Sinbad             г.Самара.             20.10.2000 г
- Программирование любого AVR MCU установленного в готовом устройстве
- Перепрограммирование Flash памяти данных и EEPROM памяти
- Исключается панелька из устройства
- Простой 3-х проводной SPI интерфейс программирования
Интерфейс программирования
      Для внутрисистемного программирования, программатор подключается к программируемому устройству как можно меньшим числом проводов. Для программирования любого AVR MCU в любом устройстве, используется простой 6-ти проводной интерфейс для подключения программатора к плате программируемого устройства. Рисунок 1, внизу, показывает необходимые соединения.
Рисунок 1. 6-ти проводное соединение программатора и программируемого устройства.
      Последовательный периферийный интерфейс (SPI) представляет собой 3 провода: последовательный тактовый сигнал (SCK), главный вход — подчиненный выход (MISO) и главный выход — подчиненный вход (MOSI). При программировании AVR, внутрисистемный программатор всегда функционирует как главный, а программируемое устройство как подчиненный.
      Внутрисистемный программатор (главный) формирует на линии SCK тактовый сигнал для связи. Во время каждого импульса на линии SCK, передается один бит от программатора (главный) к программируемому устройству (подчиненный) по линии MOSI. Одновременно, по каждому импульсу на линии SCK передается один бит от программируемого устройства (подчиненный) к программатору (главный) по линии MISO.
      Для обеспечения нормальной связи по трем SPI линиям, необходимо соединить земли на программаторе и программируемом устройстве (GND).
      Для входа и нахождения в режиме последовательного программирования, сброс программируемого AVR MCU должен удерживаться в активном состоянии (низкий уровень). Также, при стирании чипа, на сбросе должен быть сформирован импульс в конце цикла стирания. Чтобы упростить процедуру программирования, желательно предоставить программатору контроль над линией сброса программируемого MCU, для автоматизации этой процедуры используется четвертая управляющая линия (RES).
      Для программирования устройства работающего при любом разрешенном напряжении питания (2.7 — 6.0 V), программатор может питаться от программируемого устройства (Vcc). Это освобождает от необходимости, иметь отдельный источник питания для программатора. Аналогично, программируемое устройство может запитываться от программатора во время программирования, избавляя от необходимости питания устройства через разъем его постоянного источника питания, в течение цикла программирования.
     Таблица 1. Контакты необходимые для программирования в системе.
Рисунок 2. Рекомендуемая схема разъема, для интерфейса внутрисистемного программирования
      Рисунок 2 показывает стандартный разъем, используемый всеми внутрисистемными программаторами фирмы ATMEL для подключения к программируемому устройству. Стандартный кабель снабжен 2 Х 3 ножечным разъемом, с расстоянием между ножками 100 mils.
АППАРАТНЫЕ ОСОБЕННОСТИ ПРОЕКТИРОВАНИЯ
      Для возможности программирования в системе 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. Рекомендации при разработке устройства поддерживающего внутрисистемное программирование
Протокол программирования
      Немедленно, после того как RESET программируемого AVR MCU становиться активным, микропроцессор готов к входу в режим программирования. Внутренний Последовательный Периферийный Интерфейс (SPI) активирован, и готов к приему инструкций от программатора.
      Очень важно удерживать вывод SCK стабильным, поскольку один единственный перепад станет причиной потери синхронизации с программатором. После установки сброса в низкий уровень, ждать минимум 20 ms перед выдачей первой команды.
Формат команд
      Все команды имеют одинаковый формат, всегда состоящий из четырех байт. Первый бит содержит код команды, выбранной операции и памяти. Второй и третий биты содержат адрес выбранной ячейки памяти, Четвертый бит содержит данные, которые могут передаваться в любом направлении. Данные, возвращаемые программируемым устройством, обычно данные, посланные ему в предыдущем байте. В таблице 3 приведен пример, где передаются две последовательные команды. Обратите внимание, что все возвращаемые байты равны только что посланным. Некоторые команды возвращают один байт данных из памяти программируемого устройства. Этот байт всегда возвращается последним (байт 4).
Разрешение доступа к памяти
      После того, как вывод RESET становиться активным, доступна только команда «Programming Enable» для SPI интерфейса. Только эта команда открывает доступ к Flash и EEPROM памяти, и без этой команды любые другие команды будут игнорироваться. В таблице 3 (см. выше) приведен пример, где разрешается доступ к памяти в первой посланной команде.
      После того как команда «Programming Enable» была послана в программируемое устройство, разрешается доступ к энергонезависимой памяти микроконтроллера, в соответствии с текущими установками защитных Lock — бит. Программируемое устройство не подтверждает команду «Programming Enable». Чтобы убедиться, что команда была принята программируемым AVR MCU, мы можем попробовать считать код устройства, также и известный как сигнатура.
     Таблица 3. Пример разрешение доступа к памяти и стиранию чипа.
     Таблица 4. Формат команд последовательного программирования
Примечание:
a = адрес старших бит
b = адрес младших бит
H = 0 — младший байт, 1 — старший байт
o = выходящие данные
i = входящие данные
x = не имеет значение
1 = Lock бит 1
2 = Lock бит 2
Код устройства
      После того как команда «Programming Enable» была успешно прочитана через SPI интерфейс, программатор может прочитать код устройства, известный также как сигнатура. Код будет указывать производителя (ATMEL), семейство микроконтроллеров (AVR), размер flash в килобайтах, и тип микроконтроллера (напр. AT90S1200).Формат команды «Read Device Code» (считать код устройства), находящийся в таблице 4: «Формат Команд Последовательного Программирования», будет [$30, $XX, $adr, $code]. Допустимые адреса $0, $1 или $2. Таблица 5 показывает, каким должен быть ожидаемый результат.
     Таблица 5. Допустимые кода устройства
     Таблица 6 показывает, что код устройства иногда может читаться как $FF. Если это происходит, часть кода устройства не была запрограммирована в микроконтроллер. Это не обозначает ошибку, и эта часть может вручную устанавливаться программатором.
     Таблица 6. Таблица идентификации типа микроконтроллера
      Код устройства $FF может быть также, если программируемое устройство не готово, и на MISO линии постоянно высокий уровень. Программатор может определить эту ситуацию, если другие команды, посланные программируемому устройству, возвращены как $FF.
     Если программируемое устройство возвращает код производителя $00, семейство микроконтроллеров $01, и тип микроконтроллера$02, значит, установлены оба Lock — бита. Это защищает память от считывания, и возвращенные значения будут байтами только что полученными от программатора. Для стирания Lock — бит, необходимо выполнить команду «Chip Erase».
 Таблица 7. Пример чтения кода устройства из AT90S1200, ожидается код $1E 90 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
      Flash память записывается командой «Write Program Flash Memory» ( запись Flash памяти программ). Команда посылает адрес памяти ($0a bb) для выбора 16-битного слова, и выбирает младший или старший байт с помощью бита H ( 0 — младший, 1- старший байт). Сохраняемый байт посылается в программируемый AVR MCU в байте 4.
      В отличие от параллельного программирования, здесь нет способа определить, когда цикл записи во Flash закончен. Программатору следует просто подождать 4 ms прежде, чем пытаться послать другую команду по интерфейсу. Если команда посылается, прежде чем закончился цикл внутренней записи, запись может быть нарушена.
     Таблица 9. Пример запись ‘add r17,r18’ как $0F12 во Flash память по адресу $10С
Действие 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
      EEPROM записывается, как и Flash память, командой «Write EEPROM Memory» (запись EEPROM памяти). Эта команда выбирает байт для записи, также как и «Read EEPROM Memory», и передает данные, записанные в последнем байте посланным программируемому устройству. В отличие от параллельного программирования, здесь нет способа определить, когда цикл записи во EEPROM закончен. Программатору следует просто подождать 4 ms прежде, чем пытаться послать другую команду по интерфейсу. Если команда посылается, прежде чем закончился цикл внутренней записи, запись может быть нарушена.
      Таблица 11. Пример запись $0F из EEPROM по адресу $11
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR Чтение $0F по адресу $11 $C0 00 11 0F $zz C0 00 11 Ждать 4 ms
Доступ к LOCK битам
      Для защиты содержимого памяти от случайной перезаписи, или от неправомочного считывания, могу устанавливаться Lock биты. Как видно из таблицы 12, память может быть также защищена от записи, или интерфейс программирования может быть полностью отключен от блока памяти, делая невозможным как считывание так и запись памяти микросхемы.
      Таблица 12. Режимы защиты Lock битами
      Lock биты не могут быть прочитаны, и их установка не может быть проверена программатором. Для проверки, что Lock биты, установлены правильно, следует попробовать изменить содержимое в EEPROM. Когда установлен Lock бит 1, содержимое памяти не меняется. Когда установлены оба lock бита 1 и 2, содержимое не может быть прочитано, и в результате будет возвращен младший байт адреса пропущенной команды. Установка только Lock бит 2 не будет иметь защитного эффекта, прежде чем защищать микросхему от считывания, она должна бать защищена от записи.
      Lock биты предотвращаю изменение содержимого памяти только при программировании. Ядро MCU может считывать Flash память программ и имеет доступ к EEPROM как обычно, независимо от установки Lock бит.
      Есть только один способ вернуть доступ к памяти после установки Lock бит, путем полного стирания чипа командой «Chip Erase» (стирание чипа). Lock биты будут сброшены в 1, отключая защиту, только после полного стирания всего содержимого памяти.
      Таблица 13. Пример установки Lock бит 1 для запрещения дальнейшего программирования
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR Установка Lock бит 1 для запрещения программирования $AC FD xx yy $zz AC FD xx Ждать 4 ms
      После стирания чипа, Lock биты принимают значение 1, показывающее сброс бита. Хотя операция установки защиты называется «установка» Lock бит, но для этого в бит должно быть записано нулевое значение.
Операция стирания чипа
      Прежде чем новое содержимое сможет бать записано во Flash память программ, память должна быть стерта. Без стирания, возможно программировать нулевые биты во Flash памяти, устанавливая в некоторые 1. Стирание памяти выполняется командой «Chip Erase» (стирание чипа). Эта команда стирает все содержимое памяти, как Flash памяти программ, так и EEPROM.
      Таблица 13. Пример стирания всего содержимого Flash памяти программ и EEPROM
Действие MOSI, посланные программируемому AVR MISO, принятые от программируемого AVR Стирание чипа $AC 8x yy nn $zz AC 8x yy Ждать 10 ms Освободить сброс для окончания стирания
      После успешного стирания памяти, сбрасываются Lock биты. Этот метод гарантирует секретность данных в памяти, до того как все данные будут полностью стерты, и прежде чем доступ будет вновь предоставлен.
      После стирания чипа, все содержимое памяти будет считываться как $FF.
      Единственный способ завершить цикл стирания, временно освободить линию RESET
Простой недорогой внутрисистемный программатор
      Это примечание не обсуждает все аспекты внутрисистемного программатора. Вместо этого оно показывает, как может быть создан простой и дешевый программатор, используя только AT90S1200 и несколько дискретных компонентов. Этот программатор можно приобрести у ATMEL или у одного из её дистрибьюторов.
      Программатор подключается к любому последовательному порту любого PC. AT90S1200 не содержит аппаратную реализацию UART, но программно обеспечит полудуплексный UART используя таймер/счётчик 0 для синхронизации данных. AT90S1200 также полностью берет на себя заботу о программировании AVR, полностью программно, выполняя главный SPI.
      Схема программатора приведена на рис. 3. Питание AT90S1200 получает из программируемого устройства. Отрицательное напряжение необходимое для последовательной связи с РС через последовательный порт, сохраняется в С100, когда принимается единица (отрицательное напряжение на линии).
      Передающая линия питается этим отрицательным напряжением от С100, когда транзистор Q100 закрыт. Это посылает логическую единицу в линию передачи. Логический ноль (положительное напряжение) посылается открывающимся транзистором Q100, подсоединяя VCC (точнее V CC — 0.2 V) к передающей линии.
      Некоторые старые РС могут иметь последовательный порт, не определяющих напряжение ниже +10 вольт, как логический ноль. Однако, это не проблема для большинства существующих РС.
Рисунок 3. Недорогой внутрисистемный программатор
Про Ардуино и не только

Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.
Что такое ISP?
ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства.
Существует 2 основных подхода внутрисхемного программирования:
- С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам. Микроконтроллер в этом процессе не участвует.
- С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) — это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.
Одной из важнейших особенностей Ардуино является возможность программирования непосредственно через USB порт, без дополнительного программатора. Сразу после включения Ардуино запускается загрузчик, который работает несколько секунд. Если за это время загрузчик получает команду программирования от IDE по последовательному интерфейсу UART, то он принимает и загружает новую программу в память микроконтроллера.
Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов). Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.
Arduino as ISP. Прошивка загрузчика в Ардуино.
Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах:

Теперь подсоединим к ней плату, в которую хотим прошить загрузчик. При прошивке используются линии SPI (Serial Peripheral Interface — последовательный периферийный интерфейс). Выводы MOSI, MISO и SCK обеих плат должны быть соединены, а вывод SS Ардуино-программатора подключается к выводу Reset целевой платы. И еще 2 провода нужны чтобы запитать целевую плату. Также может потребоваться предотвратить автоматическую перезагрузку платы-программатора, для этого между ее выводами Reset и GND нужно установить электролитический конденсатор на 10мкФ. Сначала можно попробовать без конденсатора, если же прошивка не начнется, то попробуйте добавить в схему конденсатор. По моим наблюдениям конденсатор нужен при использовании дешевых Ардуино-клонов (без контроллера ATmega8u2) в качестве программатора.
Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом:

Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.
| Плата Ардуино | 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В |
![]() |
| Подключение Uno в качестве программатора к плате Nano через ICSP |
Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута.
Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:
- В меню Инструменты > Плата выбираем вариант, соответствующий нашей целевой плате.
- В меню Инструменты > Программатор выбираем Arduino as ISP.
Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:
- Запускаем Arduino IDE, открываем из примеров скетч ArduinoISP и загружаем его в плату Ардуино, которую будем использовать как программатор.
- Подключаем к Ардуино-программатору целевую плату по приведенной схеме.
- Меняем плату в Arduino IDE на целевую.
- Выбираем в IDE программатор Arduino as ISP.
- Записываем загрузчик в целевую плату командой из меню IDE.
Прошивка скетча с использованием Arduino as ISP
Еще один пример использования программатора — это загрузка скетча в целевую плату. Разумеется, это проще сделать привычным способом, подключив ее напрямую к компьютеру, но это может оказаться невозможным, например, при выходе из строя контроллера ATmega8u2/ATmega16u2 или преобразователя USB/UART. Если при этом основной микроконтроллер Ардуино остался рабочим, то мы можем прошить его, используя программатор. Для этого выполняем все шаги, описанные выше, но на последнем этапе вместо записи загрузчика необходимо:
- Открыть в Arduino IDE интересующий скетч.
- Загрузить скетч в целевую плату командой из меню IDE: Скетч > Загрузить через программатор.
