Модуль TWI микроконтроллера AVR

Блок управления. Набор предварительно заданных кодов статуса охватывает различные состояния, в которых может находиться TWI при возникновении событий TWI. Коды статуса разделяются на коды статуса ведущего устройства и коды статуса подчиненного устройства, а затем на коды статуса приема и передачи. Также существуют коды статуса для ошибочных ситуаций и для состояния незанятости шины.

Модуль TWI работает как цифровой автомат и управляется по событиям: если за условием Старт передается адрес, который совпадает с адресом, хранящимся в регистре адреса подчиненного устройства (TWAR), то устанавливается флаг TWINT и инициируется выполнение соответствующего прерывания (при условии, что установлены биты глобального разрешения прерываний и прерываний интерфейса TWI). Флаг TWINT также устанавливается при возникновении и других событий интерфейса TWINT. Программа подчиненного устройства реагирует на прерывания интерфейса TWI путем считывания кода статуса и выполнения соответствующих действий.

До тех пор, пока флаг TWINT установлен, линия SCL находится в низком состоянии. Этим обеспечивается возможность прикладной программе завершить все необходимые задачи перед продолжением передачи.

Флаг TWINT устанавливается в следующих ситуациях:

· После передачи условия Старт / Повторный Старт

· После передачи Подчин_Адр + ЧТ/ЗП (подчиненный адрес и бит чтения/записи)

· После передачи байта адреса

· После потери арбитрации

· После адресации TWI собственным подчиненным адресом или глобальным вызовом

· После приема байта данных

· После приема условия Стоп или Повторный Старт при подчиненной адресации

· При возникновении ошибки (некорректные условия Стоп или Стоп)

Выводы SCL и SDA. Данные выводы связывают двухпроводной интерфейс микроконтроллера с остальными микроконтроллерами в системе. Драйверы выходов содержат ограничитель скорости изменения фронтов для выполнения требований к интерфейсу IIC. Входные каскады содержат блок подавления помех, задача которого состоит в игнорировании импульсов длительностью менее 50 нс. Обратите внимание, что к каждой из этих линий можно подключить внутренний подтягивающий резистор путем установки разрядов PORTD.0 (SCL), PORTD.1 (SDA). Использование встроенных подтягивающих резисторов в ряде случаев позволяет отказаться от применения внешних.

Блок генератора скорости связи. Данный блок управляет периодом импульсов SCL в режиме ведущего устройства. Период SCL задается регистром скорости IIC (TWBR) и значением бит управления предделителем в регистре состояния TWI (TWSR). В подчиненном режиме значения скорости или установки предделителя не оказывают влияния на работу, но частота синхронизации CPU подчиненного устройства должна быть минимум в 16 раз выше частоты SCL. Обратите внимание, что подчиненные могут продлевать длительность низкого уровня на линии SCL, тем самым уменьшая среднюю частоту синхронизации шины TWI. Частота SCL генерируется в соответствии со следующим выражением:

FSCL= FCPU/[16+2(TWBR) · 4TWPS], где

TWBR - значение регистра скорости TWI;

TWPS - значение бит предделителя в регистре состояния TWI.

Примечание. TWBR должен быть равен не менее 10, если TWI работает в ведущем режиме. Если TWBR меньше 10, то ведущий может генерировать некорректное состояние на линиях SDA и SCL. Проблема возникает при работе в ведущем режиме при передаче условий Старт+Подчин_Адр+ ЧТ/ЗП подчиненному.

Блок шинного интерфейса. Данный блок содержит сдвиговый регистр адреса и данных (TWDR), контроллер Старт/Стоп и схему арбитрации. TWDR содержит передаваемый байт адреса или данных, или принятый байт адреса или данных. Помимо 8-разр. регистра TWDR в состав блока шинного интерфейса также входит регистр, хранящий значение передаваемого или принятого бита (Нет) Подтв. К данному регистру нет прямого доступа со стороны программного обеспечения. Однако во время приема он может устанавливаться или сбрасываться путем манипуляций с регистром управления TWI (TWCR). В режиме передатчика значение принятого бита (Нет) Подтв. можно определить по значению регистра TWSR.

Контроллер Старт/Стоп отвечает за генерацию и детекцию условий Старт, Повторный Старт и Стоп. Контроллер Старт/Стоп позволяет обнаружить условия Старт и Стоп, даже если микроконтроллер находится в одном из режимов сна. Этим обеспечивается возможность пробуждения микроконтроллера по запросу ведущего шины.

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

Блок обнаружения адреса. Блок обнаружения адреса проверяет, равен ли принятый адрес значению 7-разрядного адреса из регистра TWAR. Если установлен бит разрешения обнаружения общего вызова TWGCE в регистре TWAR, то все входящие адресные биты будут дополнительно сравниваться с адресом общего вызова. При адресном совпадении подается сигнал блоку управления, что позволяет выполнить ему необходимые действия. В зависимости от установки регистра TWCR подтверждение адреса TWI может происходит, а может и нет. Блок обнаружения адреса способен функционировать даже, когда микроконтроллер переведен в режим «сна», тем самым позволяя возобновить нормальную работу микроконтроллера по запросу мастера шины. Если при адресном совпадении TWI в экономичном режиме микроконтроллера, т.е. когда инициируется возобновление работы микроконтроллера, возникает другое прерывание (например, INT0), то TWI прекращает работу и возвращается к состоянию холостого хода (Idle). Если возникновение данного эффекта нежелательно, то необходимо следить, чтобы во время обнаружения адреса, когда микроконтроллер находится в режиме выключения (Power-down), было разрешено только одно прерывание.

Описание регистров TWI.

Регистр скорости связи шины TWI – TWBR.

Бит7,…,0. Биты регистра скорости связи шины TWI. TWBR задает коэффициент деления частоты генератора скорости связи. Генератор частоты скорости связи - делитель частоты, который формирует сигнал синхронизации SCL в режимах «Ведущий». В разделе «Блок генератора скорости связи» показана методика вычисления скоростей связи.

Регистр управления шиной TWI – TWCR.

TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
W/R W/R W/R W/R R W/R R W/R

 

Регистр TWCR предназначен для управления работой TWI. Он используется для разрешения работы TWI, для инициации сеанса связи ведущего путем генерации условия Старт на шине, для генерации подтверждения приема, для генерации условия Стоп и для останова шины во время записи в регистр TWDR. Он также сигнализирует о попытке ошибочной записи в регистр TWDR, когда доступ к нему был запрещен.

Бит7 – TWINT. Флаг прерывания TWI. Данный бит устанавливается аппаратно, если TWI завершает текущее задание и ожидает реакции программы. Если бит I в SREG и бит TWIE в TWCR установлены, то микроконтроллер переходит на вектор прерывания TWI. Линия SCL остается в низком состоянии, пока установлен флаг TWINT. Флаг TWINT сбрасывается программно путем записи в него логической 1. Обратите внимание, что данный флаг сбрасывается не автоматически при переходе на вектор прерывания. Также нужно учесть, что очистка данного флага приводит к возобновлению работы TWI. Из этого следует, что программный сброс данного флага необходимо выполнить после завершения опроса регистров TWAR, TWSR и TWDR.

Бит 6 – TWEA. Бит разрешения подтверждения. Бит TWEA управляет генерацией импульса подтверждения. Если в бит TWEA записана 1, то импульс ПОДТВ генерируется на шине TWI, если выполняется одно из следующих условий:

1. Принят собственный подчиненный адрес.

2. Принят общий вызов, когда установлен бит TWGCE в регистре TWAR.

3. Принят байт данных в режиме ведущего приемника или подчиненного приемника.

Запись 0 в бит TWEA позволяет временно отключиться от двухпроводной последовательной шины. Для возобновления распознавания адреса необходимо записать в данный бит 1.

Бит 5 – TWSTA. Бит условия Старт. Программист должен установить данный бит при необходимости стать ведущим на двухпроводной последовательной шине. TWI аппаратно проверяет доступность шины и генерирует условие Старт, если шина свободна. Однако если шина занята, то TWI ожидает появления условия Стоп, а затем генерирует новое условие Старт для перехвата состояния ведущего шины. TWSTA необходимо сбрасывает программно после передачи условия Старт Т.

Бит 4 – TWSTO. Бит условия Стоп. Установка бита TWSTO в режиме ведущего приводит к генерации условия Стоп на двухпроводной последовательной шине. Если на шине выполняется условие Стоп, то бит TWSTO сбрасывается автоматически. В подчиненном режиме установка бита TWSTO может использоваться для выхода из условия ошибки. В этом случае условие Стоп не генерируется, но интерфейс TWI возвращается к хорошо сконфигурированному безадресному подчиненному режиму и переводит линии SCL и SDA в высокоимпедансное состояние.

Бит 3 – TWWC. Флаг ошибочной записи. Бит TWWC устанавливается при попытке записи в регистр данных TWDR, когда TWINT имеет низкий уровень. Флаг сбрасывается при записи регистра TWDR, когда TWINT=1.

Бит 2 – TWEN. Бит разрешения работы TWI. Бит TWEN разрешает работу TWI и активизирует интерфейс TWI. Если бит TWEN установлен, то TWI берет на себя функции управления линиями ввода-вывода SCL и SDA. При этом разрешается работа ограничителей скорости изменения фронтов и помехоподавляющих фильтров. Если данный бит равен нулю, то TWI отключается и все передачи прекращаются независимо от состояния работы.

Бит 1 - Резервный бит. Данный бит является резервным и считывается как 0.

Бит 0 – TWIE. Разрешение прерывания TWI. Если в данный бит записана 1 и установлен бит I в регистре SREG, то запрос на прерывание TWI будет генерироваться до тех пор, пока установлен флаг TWINT.

Регистр состояния TWI – TWSR.

Разряд
  TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS1 TWPS0
W/R R R R R R R W/R W/R
Исходное значение

 

Биты 7,…,3 – TWS. Состояние TWI. Данные 5 бит отражают состояние логики блока TWI и двухпроводной последовательной шины. Различия в кодах состояния будут представлены далее в этом разделе. Считываемое значение из регистра TWSR содержит и 5-разрядный код состояния и 2-разрядное значение, управляющее предделителем. Программист должен маскировать биты предделителя во время проверки состояния. В этом случае проверка состояния не будет зависеть от настройки предделителя.

Бит 2 - Резервный бит. Данный бит является резервным и считывается как 0.

Биты 1,0 – TWPS. Биты предделителя TWI. Данные биты отличаются полным доступом (чтение/запись) и позволяют управлять предделителем скорости связи (таблю 2.60).

 

Таблица 2.60. Предделитель скорости связи TWI

TWPS1 TWPS0 Значение предделения

 

Формула для вычисления скорости связи представлена в разделе «Блок генератора скорости связи». Значение бит TWPS1..0 используется в ней.

Регистр данных шины TWI – TWDR.

Разряд
  TWD7 TWD6 TWD5 TWD4 TWD3 TWD2 TWD1 TWD0
W/R W/R W/R W/R W/R W/R W/R W/R W/R
Исходное значение

 

В режиме передатчика регистр TWDR содержит следующий байт для передачи. В режиме приемника регистр TWDR содержит последний принятый байт. Запись в регистр возможна только когда TWI не выполняет процесс сдвига данных. Такое состояние наступает, когда происходит аппаратная установка флага прерывания TWINT. Регистр данных не может инициализироваться пользователем перед возникновением первого прерывания. Данные в регистре TWDR остаются стабильными пока установлен бит TWINT. Во время сдвига последовательной передачи данных одновременно происходит сдвиг для последовательного ввода. TWDR всегда содержит последний байт представленный на шине, исключая ситуацию возобновления нормальной работы микроконтроллера по прерыванию TWI. В этом случае состояние TWDR является неопределенным. В случае потери арбитрирования шины данные, передаваемые от ведущего к подчиненному, не теряются. Управление битом ПОДТВ происходит автоматически под управлением схемы TWI, а CPU непосредственного доступа к биту ПОДТВ не имеет.

Биты 7,...,0 – TWD7-0. Регистр данных шины TWI. Данные 8 бит составляют байт данных, который необходимо передать следующим, или последний принятый байт по двухпроводной последовательной шине.

Регистр подчиненного адреса шины TWI – TWAR.

Разряд
  TWA6 TWA5 TWA4 TWA3 TWA2 TWA1 TWA0 TWGCE
W/R W/R W/R W/R W/R W/R W/R W/R W/R
Исходное значение

 

Если TWI настроен на режим подчиненного передатчика или приемника, то будет реагировать только на адрес, записанный в этот регистр (в 7 старших разрядов TWAR). В остальных режимах ведущего данный регистр не используется. В многомастерных системах регистр TWAR устанавливается в том ведущем, к которому адресуются как к подчиненному другие ведущие шины.

Младший разряд регистра TWAR используется для разрешения обнаружения адреса общего вызова ($00). Специальный компаратор выполняет сравнение подчиненного адреса (или адреса общего вызова) с принятым адресом. Если обнаруживается совпадение, то генерируется запрос на прерывание.

Биты 7,…,1 – TWA. Регистр подчиненного адреса TWI. Данные семь бит составляют подчиненный адрес блока TWI.

Бит 0 – TWGCE. Бит разрешения обнаружения общего вызова по шине TWI. После установки данного бита разрешается работа схемы обнаружения общего вызова, передаваемого по двухпроводной последовательной шине

Рекомендации по использованию TWI. TWI ориентирован на передачу данных в байтном формате с управлением по прерываниям. Прерывания возникают после обнаружения одного из событий на шине, например, прием байта или передача условия СТАРТ. Управление TWI по прерываниям позволяет освободить программное обеспечение на выполнение других задач во время передачи байта данных. Обратите внимание, что установка флага TWINT приводит к генерации запроса на прерывание только в том случае, когда установлен бит разрешения прерывания TWIE в регистре TWCR, а также разрешена работа прерываний установкой бита в регистре SREG. Если бит TWIE сброшен, то состояние TWINT должно отслеживаться программно для оценки ситуации на шине TWI.

После установки флага TWINT интерфейс TWI приостанавливает работу и ожидает реакции программы. В этом случае регистр статуса TWI (TWSR) содержит значение, которое индицирует текущее состояние шины TWI. Исходя из этого программа задает дальнейшее поведение шины TWI, манипулируя регистрами TWCR и TWDR.

Пример. Ведущий передает один байт данных подчиненному. В примере предполагается, что все символьные обозначения определены в присоединенном файле.

1. Первым шагом работы TWI является передача условия Старт.

Передача условия Старт инициируется путем записи в TWCR следующего значения:

 

TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
Значение x x x

 

Для разрешения работы двухпроводного последовательного интерфейса необходимо установить бит TWEN. Запись 1 в TWSTA инициирует передачу условия Старт, а запись 1 в TWINT приводит к сбросу флага TWINT. После записи данного значения TWI тестирует двухпроводную последовательную шину и генерирует условие Старт сразу после освобождения шины. После передачи условия Старт аппаратно устанавливается флаг INT, а в регистр TWSR помещается код состояния $08.

Однако, необходимо следить, чтобы в записываемом в регистр значении был установлен бит TWINT. Запись 1 в TWINT сбрасывает этот флаг. TWI не начнет работу до тех пор, пока будет установлен флаг TWINT в регистре TWCR. Сразу после сброса TWINT начинается передача условия Старт.

ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

out TWCR, r16 ;Передача условия Старт

 

2. После передачи условия Старт устанавливается флаг TWINT в регистре TWCR, а содержимое TWSR обновляется значением кода состояния, индицирующего об успешной передаче условия Старт.

; Ожидание установки флага TWINT. Этим индицируется завершение передачи условия Старт

wait1:

in r16,TWCR

sbrs r16,TWINT

rjmp wait1

 

3. В программе необходимо выполнить проверку значения TWSR, чтобы убедится в том, что условие Старт было успешно передано. Если TWSR индицирует прочую ситуацию, то программа выполняет особые действия, например, вызывает процедуру обработки ошибочных ситуаций. Если код состояния имеет ожидаемое значение, то выполняется загрузка условия Подчин_Адр+ЗП в TWDR. Необходимо помнить, что TWDR используется для хранения как адреса, так и данных. После загрузки в TWDR желаемого значения Подчин_Адр+ЗП в регистр TWCR должно быть записано следующее значение (табл. 2.61), которое служит командой для передачи значения Подчин_Адр+ЗП, хранящегося в TWDR.

Таблица 2.61. Команда для передачи значения Подчин_Адр+ЗП

TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
Значение x x x

 

Необходимо следить, чтобы в записываемом в регистр значении был установлен бит TWINT. Запись 1 в TWINT приводит к сбросу этого флага. TWI не начнет работу до тех пор пока установлен бит TWINT в регистре TWCR. Сразу после сброса флага TWINT инициируется передача адресного пакета.

 

in r16,TWSR ; чтение содержимого регистра статуса TWSR

andi r16, 0xF8 ; маскирование бит предделителя.

cpi r16, START ; проверка кода статуса START

brne ERROR ; если код состояния не равен START,

; то переход на ERROR

; Загрузка Подчин_Адр + ЗП в регистр TWDR.

ldi r16, SLA_W

out TWDR, r16

; Сброс бита TWINT в TWCR для начала передачи адреса

ldi r16, (1<<TWINT) | (1<<TWEN)

out TWCR, r16

 

4. После передачи адресного пакета устанавливается флаг TWINT в регистре TWCR, а содержимое регистра TWSR обновляется кодом состояния, индицирующего успешность передачи адресного пакета. В коде состояния также отражается, было ли подтверждение приема адресного пакета со стороны подчиненного или нет.

Ожидание установки флага TWINT. Этим сигнализируется завершение передачи Подчин_Адр + ЗП и получение/неполучение подтверждения (Подтв/Нет_Подтв).

wait2:

in r16,TWCR

sbrs r16,TWINT

rjmp wait2

 

5. Выполняется программная проверка значения TWSR, чтобы убедиться в успешности передачи адресного пакета и что бит Подв. имеет ожидаемое значение. Если TWSR индицирует иную ситуацию, то при необходимости выполняются особые действия, например, вызывается процедура обработки ошибочных ситуаций. Если же код состояния имеет ожидаемое значение, то программа записывает пакет данных в TWDR. Впоследствии в регистр TWCR записывается значение, которое служит командой для TWI и вызывает аппаратную передачу данных, записанных в TWDR.

Доступ на запись к TWDR разрешен только тогда, когда флаг TWINT равен 1. В противном случае доступ блокируется и устанавливается флаг ошибочной записи TWWC в регистре TWCR. После обновления TWDR необходимо сбросить бит TWINT (путем записи в него 1) для продолжения сеанса связи. Данное действие можно выполнить путем записи следующего значения в регистр TWCR:

TWCR TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE
Значение x x x

 

Последовательность повторяется до тех пор, пока не будет передан последний байт.

Необходимо учесть, что в записываемом значении должен быть установлен бит TWINT. Запись 1 в TWINT приводит к сбросу этого флага. TWI не начнет работу до тех пор, пока будет установлен бит TWINT в регистре TWCR. Сразу после сброса TWINT начинается передача пакета данных.

 

in r16,TWSR ;Проверка значения регистра состояния.

andi r16, 0xF8 ;Маскирование бит предделителя.

;Если состояние отличается от MT_SLA_ACK,

;то переход на ERROR

cpi r16, MT_SLA_ACK

brne ERROR

 

;Загрузка данных в TWDR. Сброс флага TWINT в TWCR

;для начала передачи данных

ldi r16, DATA

out TWDR, r16

ldi r16, (1<<TWINT) | (1<<TWEN)

out TWCR, r16

 

6. После передачи пакета данных устанавливается флаг TWINT в регистре TWCR, а содержимое регистра TWSR обновляется значением кода состояния, который сигнализирует об успешной передачи пакета данных. В коде состояния также отражается, было ли принято подтверждение от подчиненного или нет.

 

‘Ожидание установки флага TWINT. Этим индицируется,

;что данные были переданы и принято/не принято подтверждение.

wait3:

in r16,TWCR

sbrs r16,TWINT

rjmp wait3

7. Выполняется программная проверка значения в TWSR, чтобы убедиться в успешности передачи пакета данных и в том, что бит ПОДТВ имеет ожидаемое значение. Если TWSR индицирует иную ситуацию, то программа выполняет особые действия, в т.ч. вызывает процедуру обработки прерывания. Если код состояния имеет ожидаемое значение, то выполняется запись специального значения в TWCR, которое служит командой для TWI и инициирует передачу условия Стоп. Какое именно значение необходимо записать, сказано далее. Однако следует учесть, что во время записи должна быть произведена установка бита TWINT. Запись в TWINT приводит к очистке этого флага. TWI не начнет работу до тех пор, пока установлен бит TWINT в регистре TWCR. Сразу после сброса флага TWINT инициируется передача условия Стоп. Обратите внимание, что флаг TWINT не устанавливается по завершении передачи условия Стоп.

;Проверка значения регистра состояния TWI.

in r16,TWSR

andi r16, 0xF8 ;Маскирование бит предделителя.

cpi r16, MT_DATA_ACK ;Проверка значения регистра

;состояния TWI.

;Если состояние отличается от MT_DATA_ACK, то

;переход на ERROR.

brne ERROR

; Передача условия Стоп.

ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

out TWCR, r16

 

Не смотря на простоту изложенного примера, он показывает принципы, положенные в основу любой передачи через TWI. Из вышеизложенного можно сделать следующие выводы:

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

Если флаг TWINT установлен, то пользователь может обновлять любой из регистров TWI значением, которое относится к следующему этапу работы шины TWI. Например, в TWDR загружается значение, которое необходимо передать на следующем цикле шины.

После обновления всех регистров TWI и завершении других задач выполняется запись в TWCR. Во время записи TWCR необходимо, чтобы был установлен бит TWINT. В этом случае запись 1 в TWINT приведет к сбросу данного флага. TWI выполняет действия в соответствии установкой регистра TWCR.