- •Встраиваемые микроконтроллеры avr-8
- •Санкт-Петербург 2013 Содержание
- •Часть 1. Архитектура мк (л2, л3)
- •Понятия мк для встраиваемых приложений и семейства мк. Семейство avr-8
- •Структура и архитектура мк
- •Тактирование, процессор и арифметико-логическая группа команд
- •Структура и адресация памяти программ. Ветвления, циклы, подпрограммы, и группа команд передачи управления
- •Структура и адресация памяти данных. Группа команд передачи данных
- •Порты ввода/вывода. Типовая схема включения мк. Структура управляющей программы, поллинг.
- •Часть 2. Процесс проектирования устройств на мк (л4, л5)
- •2.1. Этапы процесса проектирования устройств на мк
- •2.2.Техническое задание и разработка алгоритма (блок-схемы)
- •2.3. Языки программирования и синтаксическая проверка проекта
- •2.4. Средства загрузки кодов программ и данных (программаторы)
- •2.5. Средства отладки для выявления логических и схемотехнических ошибок
- •2.6. Подключение индикаторов и клавиатуры
- •Часть 3. Ввод/вывод в мпу
- •3.1. Понятие и характеристики интерфейса
- •3.2. Внутрисистемные интерфейсы в мпу
- •3.3 Параллельный порт avr
- •3.4. Внешняя магистраль памяти данных avr мк
- •3.5. Принцип и средства ввода/вывода по прерываниям.
- •3.6. Принцип прямого доступа к памяти
- •Часть 4. Прерывания (л8)
- •4.1. Механизм прерываний в avr и его программирование
- •4.2. Входы прерываний inTx и pcinTx.
- •Часть 5. Таймеры/счетчики
- •5.1. Задачи формирования и измерения временных интервалов
- •5.2. Принципы программного формирования/измерения временного интервала
- •5.3. Таймер/счетчик с прерыванием по переполнению
- •5.4. Таймер/счетчик с дополнительными узлами захвата и сравнения
- •Часть 6. Задачи и устройства аналогового ввода/вывода (л12, л13)
- •6.1. Задачи аналогового ввода и вывода
- •6.2. Встроенный аналоговый компаратор
- •6.3. Встроенный многоканальный ацп
- •6.4. Встроенный цап
- •Часть 7. Задачи и устройства последовательного интерфейса (л14, л15)
- •7.1. Принципы и преимущества последовательного интерфейса
- •7.2. Функции встроенного контроллера последовательного интерфейса
- •7.3. Протокол и контроллер трехпроводного синхронного пи (spi)
- •7.4. Устройство контроллера i2c и его применение
- •7.5 Цап с последовательным интерфейсом
- •7.6. Устройство контроллера u(s)art и его применение
- •7.7. Сетевые протоколы и их стандартизация
- •7.8. Открытый протокол Modbus
- •История
- •Введение
- •Категории кодов функций
- •Модель данных
- •Стандартные функции протокола Modbus
- •Запись одного значения
- •Запись нескольких значений
- •Контроль ошибок в протоколе Modbus rtu
- •Rtu фрейм
- •Логические ошибки
- •Стандартные коды ошибок
7.2. Функции встроенного контроллера последовательного интерфейса
Несмотря на разнооборазие протоколов последовательных интерфейсов, всем им свойственен ряд общих задач, которые в современных МК решаются аппаратным путем и реализуются во встроенном специализированном контроллере.
Рассмотрим типовые узлы и структуру гипотетического контроллера последовательного интерфейса в микропроцессорном устройстве (КПИ в МПУ, рис. 7.4).
Рис. 7.4
Процедура передачи всегда начинается с загрузки байта данных в регистр данных передатчика (РД передатчика). Обычно этот регистр доступен только по записи. Если контроллер свободен, байт данных параллельным способом грузится в регистр сдвига передатчика. Под действием тактовых импульсов данные из регистра сдвига побитно (начиная со старшего или младшего бита) выводятся на вывод МК, выполняющий функцию выхода данных. После вывода последнего бита данных или замыкающего бита синхронизации процедура передачи закончена.
В этот момент устанавливается специальный битовый флаг завершения передачи в регистре состояния контроллера, может быть разрешено прерывание по этому событию.
Также встречается бит и запрос прерывания, устанавливающийся при загрузке даных из РД передатчика в сдвиговый регистр. Это сигнализирует разрешение записи в РДПер следующего байта
Процедура приема начинается с загрузки байта данных со входа данных приемника в регистр сдвига приемника РСПр под действием тактовых импульсов. По завершении загрузки данные автоматически перегружаются в регистр данных приемника РДПр. Одновременно устанавливается специальный битовый флаг завершения приема в регистре состояния контроллера, может быть разрешено прерывание для программного чтения полученного байта.
Тактовые импульсы в асинхронных протоколах формируются встроенным тактовым генератором (ТГ) делением тактовой частоты процессора. В синхронных протоколах тактовые импульсы либо поступают от другого приемопередатчика со специального входа тактов (в режиме ведомого), либо формируются встроенным ТГ и передаются через выход тактов (в режиме ведомого).
Обычно выводы приемопередатчиков автоматически настраиваются при активации функций связи контроллера, но в некоторых случаях требуется дополнительная настройка портов ввода/вывода.
Для связи на небольшие расстояния используется схемотехника обычных КМОП входов и выходов или схемотехника открытого истока с внешним подтягивающим резистором. Для формирования более помехозащищенного сигналов используются внешние устройства – драйвер передатчика и усилитель приемника.
7.3. Протокол и контроллер трехпроводного синхронного пи (spi)
Протокол синхронного последовательного периферийного интерфейса SPI (Serial Peripheral Interface) обеспечивает высокоскоростной обмен данными между микроконтроллерами или между МК и переферийными устройствами. При организации локальной сети адресация выполняется аппаратно, что ограничивает размерность сети и затрудняет смену ведущего.
Передача и прием байтов происходят между двумя устройствами одновременно (полный дуплекс), за 8 тактов сдвиговые регистры обоих устройств обмениваются байтами. Для этого используется до четырех выводов: три основных – SCK [Serial ClocK] такты, MISO [Master Input or Slave Output] данные вход ведущего или выход ведомого, MOSI [Master Output or Slave Input] данные выход ведущего или вход ведомого, и один вспомогательный – SS# [Select Slave] вход выбора ведомого (низким уровнем) для адресации и синхронции при многобайтовом обмене.
Гибкость протокола заключается в возможности программного выбора:
- роли Ведущего или Ведомого,
- скорости обмена (частоты тактирования на выходе SCK в режиме ведущего),
- порядка бит в байте (от старшего к младшему или наоборот),
- выбор исходного уровня тактов (высокий или низкий),
- выбор фазы тактов (соотношения фронта/среза и момента смены данных).
Контроллер SPI в МК AVR имеет три регистра специальных функций: управления SPCR [SPI Control Register], состояния SPSR [SPI Status Register], данных SPDR [SPI Data Register]. Схема связей и назначение выводов представлены на рис. 7.5, варианты временнух диаграмм – на рис. 7.6, распределение бит управления и состояния в регистрах – в табл. 7.1.
В режиме Мастера (ведущего) частота тактирования не может превышать 1/2 (в старых моделях – 1/4) тактовой частоты процессора. В режиме ведомого такты на входе SCK должны иметь высокий и низкий уровни не менее двух тактов частоты процессора.
Дополнительной функцией контроллера SPI в МК AVR является загрузка/выгрузка данных во FlashROM и EEPROM при выборе внутрисхемного программирования [In System Program] в состоянии сброса (Reset = 0)..
Рис. 7.5
Таблица 7.1. Регистры и биты трехпроводного интерфейса
SPI Control Register – SPCR
7 |
SPIE |
SPI Interrupt Enable |
Разрешение прерывания SPI |
6 |
SPE |
SPI Enable |
Разрешение работы SPI |
5 |
DORD |
Data Order |
1 – первый младший (LSB), 0 – первый старший (MSB) |
4 |
MSTR |
Master/Slave Select |
1 – ведущий, 0 – ведомый |
3 |
CPOL |
Clock Polarity |
|
2 |
CPHA |
Clock Phase |
|
1 |
SPR1 |
SPI Clock Rate Select 1 |
Выбор делителя тактов 1 |
0 |
SPR0 |
SPI Clock Rate Select 0 |
Выбор делителя тактов 0 |
SPI Status Register – SPSR
Рис. 7.6
SPIF [SPI Interrupt Flag] – устанавливается аппаратно по завершении 8 тактов приемопередачи или обнулением входа #SS в режиме Ведущего; сбрасывается аппаратно при входе в прерывание SPI или последовательностью чтения регистра SPSR, затем регистра SPDR.
WCOL [Write COLlision flag] – устанавливается аппаратно, если запись в регистр SPDR произошла во время передачи, сбрасывается аппаратно последовательностью чтения регистра SPSR, затем регистра SPDR.
SPI2X [Double SPI Speed bit] – отсутствует в подсемействе AT90Sxxxx, удваивает частоту тактирования в режиме Ведущего, то есть максимальная частота тактирования равна fclk/2. В режиме Ведомого максимальная частота тактирования равна fclk/4.
Процедура обмена байтами инициируется командой записи в регистр SPDR на стороне ведущего и длится 8 тактов с частотой выбранной ведущим (1/4, 1/16, 1/64 или 1/128 от частоты тактирования ядра МК fCLK).
В режиме ведущего запись байта в регистр SPDR запускает процесс его передачи и приема от ведомого. По окончании процесса передачи/приема устанавливается флаг SPIF, принятый байт данных доступен по чтению из регистра SPDR.
В режиме ведомого запись в SPDR должна предшествовать моменту начала обмена, инициируемому ведущим. После завершения обмена устанавливается флаг SPIF, принятый байт данных доступен по чтению из регистра SPDR.
Обратите внимание, что сброс флага SPIF выполняется аппаратно при входе в прерывание SPI или последовательностью чтения регистра SPSR, затем регистра SPDR.
Примеры функций настройки [Init] в режиме ведущего [Master] или ведомого [Slave] и приемопередачи [Transmit]:
void SPI_MasterInit(void) {
/* Set SS, MOSI, SCK output, all others input */
DDR_SPI = (1<<DD_SS)|(1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_SlaveInit(void) {
DDR_SPI = (1<<DD_MISO);/* Set MISO output, all others input */
SPCR = (1<<SPE); /* Enable SPI */
}
char SPI_Transmit(char cData) {
SPDR = cData; /* Write data and Start transmission */
while(!(SPSR & (1<<SPIF))); /* Wait for transmission complete */
return SPDR;/* Read data */
}
char in, out; int main(void) { PORTD = 0xff;//Вкл притяжку PD0...PD7 DDRA = 0xff;//Выходы PA0...PA7 SPI_MasterInit(); while (1) { //Основной цикл in = PIND & 0x0f; //PD0...PD3 в in out = SPI_Transmit(in);//Передача in, прием out PORTA = (in & 0x0f)|(out & 0xf0 );//4 мл in, 4 ст out } // Конец основного цикла } // Конец функции main() |
char in, out; int main(void) { PORTD = 0xff;//Вкл притяжку PD0...PD7 DDRA = 0xff;//Выходы PA0...PA7 SPI_SlaveInit(); while (1) { //Основной цикл in = PIND & 0xf0; // PD4...PD7 в in out = SPI_Transmit(in);//Передача in, прием out PORTA = (out & 0x0f)|(in & 0xf0);//4 мл out, 4 ст in } // Конец основного цикла } // Конец функции main() |
Рис. 7.7
На рис. 7.7 приведена схема, временная диаграмма и программы периодического обмена байтами между двумя МК. Переключатель DSW1 подключен к 4 младшим входам порта В ведущего МК, переключатель DSW2 – к 4 старшим входам порта В ведомого МК. Выходы порта А обоих МК дублируют состояние двух переключателей. Подробно смотрите этот пример в папке <SPI 2mcu>, Fclk = 8 МГц, передача байта около 25 мкс
Обращаем внимание, что для передачи данных только в одном направлении в любом случае требуется как запись, так и чтение ргеистра данных SPDR.
Передача одного байта (в данном случае – полубайта) потребовала три провода – это не очень выгодно. Гораздо выгоднее передавать цепочки байт, в этом случае требуется синхронизация начала новой цепочки. Для этого используется четвертый провод, например, /SS. Если в отсутствии связи на выходе /SS высокий уровень, то перевод его в низкий информирует о начале новой последовательности приема и/или передачи.
Аналогично можно организовать обмен данными по прерыванию SPIF. Подпрограмма прерывания должно содержать чтение полученного байта из SPDR, затем запись данных в SPDR для передачи.
Подключение нескольких устройств по SPI.
Рис. 7.8
Для организации шины SPI (рис. 7.8) три линии (SCK, MOSI, MISO) подключаются к одноименным выводам, а вот входы выборки ведомых микросхем – каждая к своему выходу ведущего МК. Эти выводы МК не связаны с контроллером SPI, а обычные выводы портов, настроенные как выходы в высоком состоянии. Таким образом, для обмена данными одного ведущего с N ведомыми требуется 3 + N выводов ведущего.
Программа ведущего при обращении к конкретному ведомому сначала переводит его линию выборки в низкое состояние, затем инициирует обмен через контроллер SPI требуемого количества байт и возвращает линию выборки в неактивное высокое состояние.
На стороне ведомых (как и на рис. 7.7) чаще всего используются микросхемы со встроенным контроллером ведомого SPI. Это микросхемы памяти, АЦП, ЦАП, «интеллектуальные датчики температуры» и пр. В разделе 7.5 мы подробнее ознакомимся с техническими характеристиками и моделями ЦАП с последовательным интерфейсом, схемы подключения и алгоритмы обмена данными подробно рассмотрены в лабораторной работе № 4 «Последовательный интерфейс в терморегуляторе».
