AVR315
Использование модуля TWI в качестве ведущего интерфейса I2C
Отличительные особенности:
- Си-код драйвера для ведущего TWI
- Совместимость с протоколом I2C компании Philips
- Использование аппаратного модуля TWI
- Передача с использованием прерываний
- Поддержка стандартного и ускоренного режимов
Введение
Двухпроводной последовательной интерфейс (TWI) совместим с протоколом I2C компании Philips. Этот шинный интерфейс был разработан для организации простой, надежной и недорогой связи между интегральными схемами в электронных устройствах. Сильными сторонами шины TWI являются возможность адресации до 128 микросхем на одной шине, арбитраж и возможность работы нескольких ведущих устройств (мастеров) на одной шине.
Аппаратный модуль TWI входит в состав многих микроконтроллеров AVR.
В данных рекомендациях по применению описывается реализация ведущего интерфейса TWI в виде полнофункционального драйвера и приведен пример использования данного драйвера. Драйвер управляет процессом передачи в стандартном режиме (< 100 кбит/сек) и в ускоренном режиме (< 400 кбит/сек).
Принцип действия
В данном разделе приведена краткая информация об интерфейсе TWI и модуле TWI, который входит в состав микроконтроллеров серии megaAVR. Более подробная информация приведена в документации на микроконтроллеры.
Двухпроводной последовательный интерфейс
Двухпроводной последовательный интерфейс (TWI) идеально подходит для применения в типичных микроконтроллерных приложениях. Протокол TWI позволяет разработчикам подключать до 128 индивидуально-адресуемых микросхем с помощью всего лишь двух двунаправленных шинных линий: SCL - линия синхронизации и SDA - линия данных. В качестве внешних элементов требуются только подтягивающие резисторы, по одному на каждой линии шины TWI. Все микросхемы, подключенные к шине, имеют индивидуальный адрес, а механизмы извлечения этой информации поддерживаются протоколом TWI.
Рисунок 1. Подключения к шине TWI
Шина TWI является многомастерной, в которой одна или несколько микросхем могут взять на себя функции управления шиной. Только ведущие микросхемы могут управлять обеими линиями шины SCL и SDA, а подчиненные микросхемы могут влиять на состояние только линии данных SDA.
Передача данных всегда инициируется ведущей микросхемой. Переход из высокого в низкое логическое состояние на линии SDA, когда на линии SCL установлен высокий уровень, является условием СТАРТ или условием повторного старта.
Рисунок 2. Адрес TWI и формат пакета данных
За условием СТАРТ всегда следует единообразный 7-разрядный подчиненный адрес, а затем бит направления передачи данных. Адресуемое подчиненное устройство после этого подтверждает получение запроса удержанием линии SDA в низком состоянии в течение одного периода синхронизации. Если ведущее устройство не принимает подтверждения, то передача прекращается. В зависимости от состояния бита направления данных ведущее или подчиненное устройство передает 8 бит данных по линии SDA. Принимающее устройство после приема подтверждает прием данных. Перед передачей со стороны ведущего устройства условия повторный СТАРТ или СТОП в одном направлении можно передать несколько байт. Передача прекращается, когда ведущее устройство передает условие СТОП. Условие СТОП передается, когда на линии SCL присутствует высокий логический уровень, путем изменения уровня на линии SDA с низкого к высокому уровню.
Если подчиненное устройство не успевает обработать входящие данные в связи с необходимостью выполнения некоторых других функций, то ему необходимо удержать линию SCL в низком состоянии для перевода ведущего устройства в состояние ожидания.
Все пакеты данных, передаваемые по шине TWI, имеют 9-битный формат: один байт данных и бит подтверждения. В процессе передачи данных ведущее устройство генерирует синхроимпульсы и условия СТАРТ и СТОП, а приемник отвечает за подтверждение принимаемых данных. Подтверждение (ПОДТВ) выполняется приемником путем установления низкого уровня на линии SDA во время 9-го периода синхронизации на линии SCL. Если приемник оставляет линию SDA в высоком состоянии, то этим сигнализируется НЕТ ПОДТВ (нет подтверждения).
Модуль TWI микроконтроллера AVR
Модуль TWI состоит из нескольких субмодулей (см. рисунок 3). Все регистры, выделенные толстой линией, подключены к встроенной шине данных микроконтроллера AVR.
Рисунок 3. Структура модуля TWI в микроконтроллерах AVR
Блок управления
Набор предварительно заданных кодов статуса охватывает различные состояния, в которых может находиться TWI при возникновении событий TWI. Коды статуса разделяются на коды статуса ведущего устройства и коды статуса подчиненного устройства, а затем на коды статуса приема и передачи. Также существуют коды статуса для ошибочных ситуаций и для состояния незанятости шины.
Модуль TWI работает как цифровой автомат и управляется по событиям: если за условием СТАРТ передается адрес, который совпадает с адресом, хранящимся в регистре адреса подчиненного устройства (TWAR), то устанавливается флаг TWINT и инициируется выполнение соответствующего прерывания (при условии, что установлены биты глобального разрешения прерываний и прерываний интерфейса TWI). Флаг TWINT также устанавливается при возникновении и других событий интерфейса TWINT. Программа подчиненного устройства реагирует на прерывания интерфейса TWI путем считывания кода статуса и выполнения соответствующих действий.
До тех пор, пока флаг TWINT установлен, линия SCL находится в низком состоянии. Этим обеспечивается возможность прикладной программе завершить все необходимые задачи перед продолжением передачи.
Флаг TWINT устанавливается в следующих ситуациях:
- После передачи условия СТАРТ/ПОВТОРНЫЙ СТАРТ
- После передачи ПОДЧИН_АДР + ЧТ/ЗП (подчиненный адрес и бит чтения/записи)
- После передачи байта адреса
- После потери арбитрации
- После адресации TWI собственным подчиненным адресом или глобальным вызовом
- После приема байта данных
- После приема условия СТОП или ПОВТОРНЫЙ СТАРТ при подчиненной адресации
- При возникновении ошибки (некорректные условия СТАРТ или СТОП)
Генератор скорости связи
Блок генератора скорости связи управляет периодом импульсов на линии SCL в ведущем режиме работы. Период SCL управляется путем установки регистра скорости связи TWI (TWBR) и бит предделителя в регистре статуса TWI (TWSR). Работа подчиненного устройства зависит от установок регистра скорости связи или предделителя, однако частота синхронизации ЦПУ подчиненного устройства должна быть минимум в 16 раз больше частоты SCL. Обратите внимание, что подчиненные устройства могут продлевать низкое состояние SCL, тем самым, снижая среднее значение частоты синхронизации шины TWI. Частота SCL генерируется в соответствии с выражением 1.
Выражение 1
FSCL= FЦПУ/[16+2(TWBR) · 4TWPS],
где
- TWBR - значение в регистре скорости связи TWI;
- TWPS - значение бит предделителя в регистре статуса TWI.
Если TWI работает в ведущем режиме, то значение TWBR должно быть не менее 10. Если значение TWBR меньше 10, то ведущее устройство шины может генерировать некорректные сигналы на линиях SDA и SCL во время передачи байта.
Биты TWPS находятся в регистре статуса TWISR вместе с битами статуса. Для простоты обработки бит статуса рекомендуется записывать нулевые значения в TWPS. В этом случае, желаемая скорость связи достигается путем варьирования значением в TWBR. В таблице 1 приведены результаты вычислений значений TWBR для некоторых частот ЦПУ и SCL.
Таблица 1. Частоты ЦПУ и SCL в зависимости от установок регистра скорости связи
Частота ЦПУ, МГц |
TWBR |
TWPS |
Частота SCL, МГц |
16 |
12 |
0 |
400 |
16 |
72 |
0 |
100 |
14.4 |
10 |
0 |
400 |
14.4 |
64 |
0 |
100 |
12 |
10 |
0 |
~333 |
12 |
52 |
0 |
100 |
8 |
10 |
0 |
~222 |
8 |
32 |
0 |
100 |
4 |
12 |
0 |
100 |
3.6 |
10 |
0 |
100 |
2 |
10 |
0 |
~55 |
1 |
10 |
0 |
~28 |
Выводы SCL и SDA
Обе линии TWI (SDA и SCL) являются двунаправленными, все выходы, подключаемые к линиям шины TWI должны быть либо с открытым стоком, либо с открытым коллектором. Каждая линия должна быть связана с линий питания через подтягивающий резистор. В этом случае на линии присутствует высокий уровень, если выходы всех устройств отключены, и низкий уровень, если хотя бы одна микросхема устанавливает низкий уровень.
В состав драйверов выходов входит ограничитель скорости изменения фронтов. Во входных каскадах содержится схема подавления импульсов длительностью менее 50 нс. Обратите внимание, что можно активизировать внутренние подтягивающие резисторы на выводах микроконтроллера. Это выполняется путем установки бит регистра PORT, соответствующего выводам SCL и SDA (см. раздел "Порт ввода-вывода"). Использование внутренних подтягивающих резисторов в некоторых случаях позволяет избавиться от внешних. На рисунке 4 показано, как подключить блоки TWI к шине TWI. Номинал Rp зависит от VCC и емкости шины (обычно 4.7 кОм).
Рисунок 4. Подключение TWI
Блок сравнения адреса
Блок сравнения адреса используется только в подчиненном режиме и выполняет поиск совпадения принятого адреса с 7-разрядным адресом в регистре адреса TWI (TWAR). При совпадении адреса в блок управления подается соответствующий сигнал. TWI может подтвердить или не подтвердить данный адрес в зависимости от установок регистра TWCR.
Несмотря на то, что во всех режимах сна от блока TWI отключен сигнал системной синхронизации, интерфейс продолжает подтверждать собственный подчиненный адрес или адрес общего вызова за счет использования синхронизации шины TWI в качестве тактового источника. В этом случае микроконтроллер возобновляет нормальную работу, а в процессе возобновления работы и до сброса флага TWINT блок TWI удерживает низкий уровень на линии SCL.
Блок шинного интерфейса
Данный блок содержит сдвиговый регистр данных и адреса (TWDR), контроллер управления условиями СТАРТ/СТОП и схему арбитрации. TWDR содержит передаваемый байт адреса/данных или принятый байт адреса/данных. Кроме того, в регистре также содержится передаваемый или принятый бит ПОДТВ или НЕТ ПОДТВ.
Контроллер СТАРТ/СТОП отвечает за генерацию и детекцию условий СТАРТ, ПОВТОРНЫЙ СТАРТ и СТОП. Контроллер СТАРТ/СТОП позволяет определить условия СТАРТ и СТОП даже при нахождении микроконтроллера в одном из режимов сна, позволяя возобновить нормальную работу микроконтроллера при адресации со стороны ведущего устройства. Если TWI инициирует передачу в качестве ведущего устройства, то схема арбитрации непрерывно следит за передачей, пытаясь определить, находится ли арбитрирование в процессе. Если TWI потерял арбитрацию, то блок управления информируется об этом. В этом случае выполняются требуемые действия и генерируются соответствующие коды статуса.
Реализация
В данных рекомендациях по применению программная реализация ограничивается кодом драйвера ведущего устройства. Модули TWI поддерживают также подчиненный режим работы. См.пример драйвера подчиненного устройства в рекомендациях по применению "AVR311: Использование подчиненного режима работы TWI". Универсальный драйвер ведущего и подчиненного устройства можно получить путем объедения рассматриваемого драйвера с указанным выше, но это не входит в рамки данных рекомендаций по применению. В состав Си-кода драйвера ведущего устройства входят три файла.
- TWI_Master.c
- TWI_Master.h
- Main.c
Пример использования драйвера приведен в файле main.c. Файл TWI_Master.h должен быть включен в основную программу и содержит объявления всех функций, а также определения регистра скорости связи (TWBR) и всех кодов статуса TWI. TWBR необходимо установить в соответствии с вышеизложенным описанием. Коды статуса TWI могут использоваться для выявления ошибочных сообщений и выполнения соответствующих действий. Файл TWI_Master.c содержит все функции драйвера.
Функции
Драйвер состоит из процедуры обработки прерывания TWI и шести функций. Все функции могут использоваться за пределами драйвера. Однако некоторые из них также используются драйвером. Перечень и краткое описание функций представлены в таблице 2. Размер результирующего кода для всех функций, полученного с помощью компилятора IAR, представлен в таблице 4.
Таблица 2. Описание функций драйвера ведущего интерфейса TWI
Имя функции |
Описание |
void TWI_Master_Initialise( ) |
Данная функция вызывается для установки ведущего TWI в исходное состояние ожидания. Не забудьте разрешить прерывания в основной программе после инициализации TWI. |
void TWI_Start_Transceiver_with_Data ( uchar *message, uchar messageSize) |
Данная функция вызывается для отправки подготовленного сообщения. Первый байт должен содержать адрес подчиненного устройства и бит выбора операции чтения/записи. В последующих байтах содержатся передаваемые данные или пустые позиции для считывания данных из подчиненного устройства. В параметрах также указывается количество отправляемых/принимаемых байт с учетом адресного байта. Нахождение в теле функции задерживается до тех пор, пока TWI_ISR завершит обработку предыдущего задания, а затем инициализируется следующее действие и выполняется возврат в основную программу. |
void TWI_Start_Transceiver( ) |
Данная функция вызывается для повторной отправки последнего сообщения. Драйвер повторно передает данные, которые были ранее размещены в буфере трансивера. Нахождение в теле функции задерживается до тех пор, пока TWI_ISR завершит обработку предыдущего задания, а затем инициализируется следующее действие и выполняется возврат в основную программу. |
uchar TWI_Transceiver_Busy( ) |
Данная функция вызывается для тестирования на предмет занятости TWI_ISR передачей. |
valign="top"uchar TWI_Get_State_Info( ) |
Данная функция вызывается для получения информации о статусе предыдущей операции. Нахождение в теле функции задерживается до завершения TWI_ISR обработки предыдущей операции. Если возникла ошибка, то данная функция возвращает код состояния TWI. |
uchar TWI_Get_Data_From_Transceiver ( uchar *message, uchar messageSize) |
Данная функция вызывается для считывания запрашиваемых данных из буфера трансивера TWI. Первоначально вызывается функция TWI_Start_Transceiver для отправки запроса данных подчиненному устройству. После этого выполняется данная функция для накопления данных по факту их поступления. При вызове функции необходимо указать, куда разместить данные и количество запрашиваемых байт (с учетом адресного поля). Перед выводом данных и возвратом в основную программу нахождение в теле функции задерживается до завершения обработки предыдущей операции в TWI_ISR. Если в процессе предыдущей передачи возникала ошибка, то функция возвращает код ошибки.
|
__interrupt void TWI_ISR( ) |
Данная функция является процедурой обработки прерывания (ISR) и автоматически вызывается при возникновении прерывания TWI, т.е. при возникновении любого события TWI. Данная функция вызывается непосредственно из основной программы. |
Таблица 3. Описание регистра драйвера с информацией о статусе последней операции приема-передачи. Доступны в виде битовых полей в пределах байта
TWI_statusReg |
Описание |
TWI_statusReg.lastTransOK |
Равен 1, когда операция завершается успешно. |
Таблица 4. Размер программного кода, полученного с помощью компилятора IAR 3.10
TWI Master functions |
[байт] |
TWI_Master_Initialise( ) |
14 |
TWI_Transceiver_Busy( ) |
6 |
TWI_Get_State_Info( ) |
12 |
TWI_Start_Transceiver_With_Data( ) |
72 |
TWI_Start_Transceiver( ) |
8 |
TWI_Get_Data_From_Transceiver( ) |
50 |
TWI_ISR( ) |
194 |
Всего: |
356 |
На рисунке 5 представлена блок-схема процесса отправки и запроса данных через интерфейс TWI. Данные передаются как параметры в функции, а статус запрашиваемой операции доступен через глобальную переменную статуса. На рисунке 6 представлена блок-схема собственно драйвера TWI. Более подробное описание действий в каждом состоянии и при каждом событии в процедуре обработки прерывания TWI может быть найдено на рисунке 7. На рисунке 7 в левом столбце показаны различные состояния/события цифрового автомата TWI, которые могут быть активными при возникновении прерывания. В зависимости от состояния TWI на момент возникновения прерывания выполняются соответствующие действия.
Функция Transceiver копирует содержимое всего сообщения в буфер передачи. Затем она разрешает прерывание TWI для инициации передачи. Далее прерывание отвечает за завершение передачи и отключает само себя по завершении передачи или при возникновении ошибки. Драйвер имеет возможность определить состояние передачи путем опроса бита разрешения прерывания. Когда трансивер TWI не занят, основной программе разрешается доступ только к глобальным переменным. В прерывании сохраняется код ошибки в переменной, которая доступна из основной программы путем вызова функции.
Рисунок 5. Вызов драйвера TWI из приложения
Рисунок 6. Функции драйвера TWI
Рисунок 7. Процедура обработки прерывания TWI
Документация:
|
|
Engl 162 Kb Исходный файл |
|
|
7 Kb Программа |
Работа, вакансии - Москва
|