Режимы передачи
TWI может работать в одном из 4-х режимов работы. Они называются: ведущий передатчик (MT), ведущий приемник (MR), подчиненный передатчик (ST) и подчиненный приемник (SR). Некоторые из этих режимов могут использоваться в рамках одного и того же приложения. Например, TWI может использовать режим MT для записи данных в 2-пров. последовательное ЭСППЗУ, а режим MR для считывания данных из ЭСППЗУ. Если в системе имеются другие ведущие (мастера), один из которых передает данные, то у остальных используется режим SR. Какой из режимов должен использоваться определяется программно.
Далее описаны каждый из этих режимов. Возможные значения кодов состояния представлены рядом с рисунками, детализирующих процесс передачи данных в каждом из режимов. На рисунках используются следующие аббревиатуры:
- СТАРТ: Условие СТАРТ
- ПОВТ СТАРТ: Условие Повторный СТАРТ
- ЧТЕНИЕ: Бит "Чтение" (высокий уровень на SDA)
- ЗАПИСЬ: Бит "Запись" (низкий уровень на SDA)
- ПОДТВ: Бит подтверждения (низкий уровень на SDA)
- НЕТ ПОДТВ: Нет бита подтверждения (высокий уровень на SDA)
- ДАННЫЕ: 8-разр. байт данных
- СТОП: Условие СТОП
- ПОДЧИН_АДР: Подчиненный адрес
На рисунках 97-103 окружности используются для индикации установки флага TWINT. Число, записанное внутри окружности, является кодом состояния из регистра TWSR, в котором замаскированы к нулю биты предделителя. В данном состоянии ожидается действие со стороны программы для завершения передачи TWI. Передача TWI приостанавливается до тех пор, пока программно не будет сброшен флаг TWINT.
После установки флага TWINT по значению кода состояния из регистра TWSR определяется, какое действие выполнить программе. В таблицах 88-91 представлена информация о том, какие программные действия должны быть предприняты при различных значениях кода состояния. Обратите внимание, что в таблице биты предделителя замаскированы нулевыми значениями.
Режим ведущего передатчика
В режиме ведущего передатчика байты данных передаются подчиненному приемнику (см. рисунок 96). Для ввода режима ведущего необходимо передать условие СТАРТ. Формат следующего адресного пакета определяет какой режим вводится: ведущий передатчик или ведущий приемник. Если передается ПОДЧИН_АДР+ ЗАПИСЬ, то вводится режим MT (ведущий передатчик), а если ПОДЧИН_АДР + ЧТЕНИЕ, то вводится режим MR (ведущий приемник). Все упоминаемые в этом разделе коды состояния в позиции бит предделителя имеют нулевые значения.
Рисунок 96. Передача данных в режиме ведущего передатчика
Передача условия СТАРТ инициируется путем записи в TWCR следующего значения:
Для разрешения работы двухпроводного последовательного интерфейса необходимо установить бит TWEN. Запись лог. 1 в TWSTA инициирует передачу условия СТАРТ, а запись лог. 1 в TWINT приводит к сбросу флага TWINT. После записи данного значения TWI тестирует двухпроводную последовательную шину и генерирует условие СТАРТ сразу после освобождения шины. После передачи условия СТАРТ аппаратно устанавливается флаг INT, а в регистр TWSR помещается код состояния $08 (см. Таблицу 88). Для перевода в режим ведущего передатчика необходимо передать ПОДЧИН_АДР + ЗАПИСЬ. Это выполняется путем записи значения ПОДЧИН_АДР + ЗАПИСЬ в регистр TWDR. После этого необходимо сбросить флаг TWINT (путем записи в него лог. 1) для продолжения сеанса связи. Данное выполняется путем записи следующего значения в TWCR:
После передачи ПОДЧИН_АДР + ЗАПИСЬ и приема бита подтверждения флаг TWINT снова устанавливается, а в регистр TWSR помещается код состояния, который может иметь несколько значений. В режиме ведущего код состояния может быть $18, $20 или $38. Для каждого из этих кодов состояний необходимо выполнить адекватные действия, что отражено в таблице 88.
После успешной передачи ПОДЧИН_АДР + ЗАПИСЬ должен быть передан пакет данных. Его передача инициируется записью байта данных в TWDR. Доступ на запись к TWDR разрешен только тогда, когда флаг TWINT равен 1. В противном случае доступ блокируется и устанавливается флаг ошибочной записи TWWC в регистре TWCR. После обновления TWDR необходимо сбросить бит TWINT (путем записи в него лог. 1) для продолжения сеанса связи. Данное можно выполнить путем записи следующего значения в регистр TWCR:
Данная последовательность повторяется до тех пор, пока не будет передан последний байт. После этого генерируется условие СТОП или ПОВТОРНЫЙ СТАРТ. Условие СТОП генерируется путем записи следующего значения TWCR:
Условие ПОВТОРНЫЙ СТАРТ генерируется путем записи следующего значения в TWCR:
После передачи условия ПОВТОРНОГО СТАРТА (состояние $10) двухпроводной последовательный интерфейс может обращаться к тому же подчиненному устройству или же к новому, при этом не требуется передача условия СТОП. Таким образом, повторный СТАРТ полезно использовать для смены подчиненного устройства в режимах ведущий передатчик и ведущий приемник без потери управления шиной.
Таблица 88. Коды состояния в режиме ведущего передатчика
Рисунок 97. Форматы и состояния в режиме ведущего передатчика
Режим ведущего приемника
В режиме ведущего приемника принимается несколько байт данных от подчиненного приемника (см. рисунок 98). Для ввода режима ведущего необходимо передать условие СТАРТ. Формат следующего адресного пакета определит, будет ли введенный режим ведущий передатчик или приемник. Если передается ПОДЧИН_АДР+ЗАПИСЬ, то вводится режим ведущий передатчик, если же передается ПОДЧИН_АДР+ЧТЕНИЕ, то вводится режим ведущий приемник. Во всех кодах состояния, приведенных в этом разделе, не учитываются биты предделителя и они равны нулю.
Рисунок 98. Передача данных в режиме ведущего приемника
Передача условия СТАРТ инициируется путем записи следующего значения в TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 1 | x | 1 | 0 | x | 1 | 0 | x |
Для разрешения работы двухпроводного последовательного интерфейса необходимо установить бит TWEN. Передача условия СТАРТ инициируется записью лог. 1 в TWSTA. Для сброса флага TWINT необходимо записать в него лог. 1. TWI выполнит генерацию условия СТАРТ только после тестирования шины и определения ее освобождения. После передачи условия СТАРТ флаг TWINT устанавливается аппаратно, а в регистр TWSR помещается код состояния $08 (см. таблицу 88). Для ввода режима ведущий приемник необходимо передать ПОДЧИН_АДР+ЧТЕНИЕ. Данное выполняется путем записи значения ПОДЧИН_АДР+ЧТЕНИЕ в TWDR. После этого необходимо сбросить флаг TWINT (путем записи в него лог. 1) для продолжения сеанса связи. Для этого в регистр TWCR необходимо поместить следующее значение:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 1 | x | 0 | 0 | x | 1 | 0 | x |
После передачи ПОДЧИН_АДР+ЧТЕНИЕ и приема бита подтверждения устанавливается снова флаг TWINT, а в регистр TWSR помещается код состояния, который может иметь несколько значений: $38, $40 или $48. Действия, которые выполняются при каждом из этих значений представлены в таблице 97. Принятые данные хранятся в регистре TWDR после аппаратной установки флага TWINT. Данная последовательность повторяется до приема последнего байта. После этого ведущий приемник информирует подчиненный передатчик отправкой НЕТ ПОДТВерждения после приема последнего принятого байта данных. Сеанс связи завершается генерацией условия СТОП или ПОВТОРНЫЙ СТАРТ. Условие СТОП генерируется путем записи в регистр TWCR следующего значения:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 1 | x | 0 | 1 | x | 1 | 0 | x |
Условие ПОВТОРНЫЙ СТАРТ генерируется путем записи в TWCR следующего значения:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 1 | x | 1 | 0 | x | 1 | 0 | x |
После генерации условия ПОВТОРНЫЙ СТАРТ (состояние $10) двухпроводной последовательный интерфейс может обращаться к тому же подчиненному или к новому подчиненному без генерации условия СТОП. ПОВТОРНЫЙ СТАРТ позволяет ведущему переключаться между подчиненными, режимом ведущего передатчика и ведущего приемника без потери управления над шиной.
Рисунок 99. Форматы и состояния в режиме ведущего приемника
Таблица 89. Коды состояния для режима ведущего приемника
Режим подчиненного приемника
В режиме подчиненного приемника принимается несколько байт данных от ведущего передатчика (см. рисунок 100). Во всех кодах состояния, приведенных в этом разделе, не учитываются биты предделителя и они равны нулю.
Рисунок 100. Передача данных в режиме подчиненного приемника
Для ввода режима подчиненного приемника необходимо выполнить инициализацию регистров TWAR и TWCR следующим образом:
TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
Значение | Собственный подчиненный адрес устройства |
Старшие семь разрядов образуют адрес. С помощью него определяется к какому двухпроводному интерфейсу адресуется мастер. Если в младшем разряде записана лог. 1, то TWI будет отвечать на адрес общего вызова ($00). В противном случае он игнорирует адрес общего вызова.
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 0 | 1 | 0 | 0 | 0 | 1 | 0 | x |
Для разрешения работы TWI необходимо записать лог. 1 в TWEN. Для разрешения подтверждения собственно подчиненного адреса или адреса общего вызова записывается 1 в TWEA. Битам TWSTA и TWSTO необходимо присвоить нулевое значение.
После инициализации TWAR и TWCR схема TWI ожидает получения собственного подчиненного адреса (или, если разрешено, адреса общего вызова), а вслед за ним - бита направления данных. Если бит направления равен "0" (запись), то TWI переходит в режим "подчиненный приемник", в противном случае вводится режим "подчиненный передатчик". После приема собственного подчиненного адреса и бита записи устанавливается флаг TWINT, а в регистр TWSR помещается код состояния. По коду состояния определяется какие программные действия необходимо предпринять. В таблице 90 собрана информация о предпринимаемых действиях для каждого возможного значения кода состояния. Режим подчиненного приемника также вводится, если теряется арбитрация, когда TWI находился в режиме ведущего (см. состояния $68 и $78).
Если бит TWEA сбросить во время передачи, то TWI ответит "НЕТ ПОДТВ " ("1") на линии SDA после приема следующего байта данных. Данное свойство может использоваться для сигнализации состояния, когда подчиненный не может больше принимать байты данных. Если TWEA равен нулю, то TWI не подтверждает свой подчиненный адрес. Однако последовательная шина остается под контролем и функция распознавания адреса может быть активизирована в любой момент путем установки бита TWEA. Это означает, что бит TWEA можно использовать для временной изоляции TWI от двухпроводной последовательной шины.
Во всех режимах сна, кроме холостого хода (Idle), синхронизация TWI отключается. Если бит TWEA установлен, то интерфейс останется способным подтверждать прием своего собственного подчиненного адреса или адреса общего вызова за счет использования сигнала синхронизации шины в качестве тактового источника. При обнаружении запроса микроконтроллер выходит из режима сна, при этом линия SCL остается на низком уровне в процессе пробуждения и до сброса флага TWINT (записью в него "1"). Далее выполняется прием данных обычным способом при обычной системной синхронизации. Учтите, что если для микроконтроллера выбрано большое время запуска, то линия SCL может оказаться длительно в низком состоянии и заблокировать другой обмен информацией.
Обратите внимание, что после пробуждения регистр данных TWDR не отражает последний байт, присутствовавший на шине во время выхода из указанных выше режимов сна.
Таблица 90. Коды состояния для режима "Подчиненный приемник"
Рисунок 101. Форматы и состояния в режиме подчиненного приемника
Режим подчиненного передатчика
В режиме подчиненного передатчика выполняется передача нескольких байт данных ведущему приемнику (см. рисунок 102). Во всех кодах состояния, приведенных в этом разделе, не учитываются биты предделителя и они равны нулю.
Рисунок 102. Передача данных в режиме подчиненного передатчика
Для ввода режима подчиненного передатчика необходимо инициализировать регистры TWAR и TWCR следующим образом:
TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
Значение | Собственный подчиненный адрес устройства |
Старшие семь разрядов образуют адрес. С помощью него определяется к какому двухпроводному интерфейсу адресуется ведущий. Если в младшем разряде записана лог. 1, то TWI будет отвечать на адрес общего вызова ($00). В противном случае он игнорирует адрес общего вызова.
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | - | TWIE |
Значение | 0 | 1 | 0 | 0 | 0 | 1 | 0 | x |
Для разрешения работы TWI необходимо записать лог. 1 в TWEN. Для разрешения подтверждения собственного подчиненного адреса или адреса общего вызова записывается 1 в TWEA. Битам TWSTA и TWSTO необходимо присвоить нулевое значение.
После инициализации TWAR и TWCR схема TWI ожидает получения собственного подчиненного адреса (или, если разрешен, адреса общего вызова), а вслед за ним - бита направления данных. Если бит направления равен "1" (чтение), то TWI переходит в режим "подчиненный передатчик", иначе вводится режим "подчиненный приемник". После приема собственно подчиненного адреса и бита записи устанавливается флаг TWINT, а в регистр TWSR помещается код состояния. Код состояния позволяет определить, какие программные действия необходимо выполнить. Подробности по использованию кодов состояний представлены в таблице 91. Режим "подчиненный передатчик" также вводится, если теряется арбитрация, когда TWI находился в режиме ведущего (см. состояние $B0). Если бит TWEA обнулить во время передачи, то TWI передаст последний байт. Вводится состояние $C0 или состояние $C8 в зависимости от того принял ПОДТВ или НЕТ ПОДТВ ведущий приемник за последним байтом. TWI переходит в безадресный подчиненный режим и далее игнорирует ведущего, если тот продолжает передачу. Таким образом, ведущий приемник принимает все "1" как последовательные данные. Состояние $C8 вводится, если ведущий требует передачи дополнительных байт данных (путем передачи ПОДТВ), даже если подчиненный передал последний байт (TWEA равен нулю и ожидается прием НЕТ ПОДТВ от ведущего).
Пока TWEA равен нулю, TWI не отвечает на собственный подчиненный адрес. Однако последовательная шина остается под контролем и функция распознавания адреса может быть активизирована в любой момент путем установки бита TWEA. Это означает, что бит TWEA можно использовать для временной изоляции TWI от двухпроводной последовательной шины.
Во всех режимах сна, кроме холостого хода (Idle), синхронизация TWI отключается. Если бит TWEA установлен, то интерфейс останется способным подтверждать прием своего собственного подчиненного адреса или адреса общего вызова за счет использования сигнала синхронизации шины в качестве тактового источника. При обнаружении запроса микроконтроллер выходит из режима сна, при этом линия SCL остается на низком уровне в процессе пробуждения и до сброса флага TWINT (записью в него "1"). Далее выполняется прием данных обычным способом при обычной системной синхронизации. Учтите, что если для микроконтроллера выбрано большое время запуска, то линия SCL может оказаться длительно в низком состоянии и заблокировать другой обмен информацией.
Обратите внимание, что после пробуждения регистр данных TWDR не отражает последний байт, присутствовавший на шине во время выхода из указанных выше режимов сна.
Таблица 91. Коды состояния для режима "Подчиненный передатчик"
Рисунок 103. Форматы и состояния в режиме подчиненного передатчика
Прочие состояния
Имеются несколько кодов состояний, которые отличаются от упомянутых выше (см. табл. 92). Состояние $F8 индицирует, что нет доступной информации, т.к. не установлен флаг TWINT. Это может произойти между другими состояниями и когда TWI не участвует в последовательной передаче данных.
Состояние $00 индицирует, что во время последовательной передачи данных на шине возникла ошибка. Ошибка возникает, если условия СТАРТ или СТОП возникают в неверной позиции формата посылки. Примеры таких неточных позиций могут существовать во время передачи адресного байта, байта данных и бита подтверждения. После возникновения ошибки устанавливается флаг TWINT. Для выхода из состояния ошибки необходимо установить флаг TWSTO и сбросить TWINT путем записи в него "1". Это приводит к переводу TWI в безадресный режим и к сбросу флага TWSTO (другие биты в TWCR не затрагиваются). Линии SDA и SCL освобождаются и условие СТОП не передается.
Сочетание нескольких режимов
В некоторых случаях сочетаются несколько режимов TWI для обеспечения желаемого действия. В качестве примера рассмотрим чтение данных из последовательного ЭСППЗУ. Обычно, такой сеанс связи организовывается в такой последовательности:
- Инициируется сеанс связи
- В ЭССПЗУ отправляется инструкция с указанием адреса считываемой ячейки
- Выполняется чтение
- Завершается сеанс связи
Обратите внимание, что данные передаются как от ведущего к подчиненному, так и обратно, от подчиненного к ведущему. Ведущий инструктирует подчиненного какую ячейку он желает считать, для чего используется режим "Ведущий передатчик". В дальнейшем данные передаются подчиненным, что требует использования режима "Ведущий приемник". Следовательно, направление передачи данных изменяется. Ведущий должен сохранить управление над шиной на каждом из этапов, а каждый из шагов должен быть выполнен как элементарное действие. Если данный принцип нарушить в многомастерной системе, то другой ведущий может обратиться к ЭСППЗУ на шагах 2 и 3 и изменить указатель данных. Это приведет к тому, что ведущий считывает данные из ячейки с неверным адресом. Таким образом, направление передачи данных необходимо изменять только передачей условия ПОВТОРНЫЙ СТАРТ между передачей адресного байта и приемом байта. Передачей ПОВТОРНОГО СТАРТА мастер сохранит свое "господство" на шине. На следующем рисунке представлена структура потока данной передачи.
Рисунок 104. Сочетание нескольких режимов TWI для обмена данными с последовательным ЭСППЗУ
Если к одной шине подключено несколько ведущих, то передача может быть инициирована одновременно одним или несколькими из них. Стандарт TWI гарантирует, что в таких ситуациях разрешается передача только одному ведущему, при этом не будет происходить потеря данных. Пример арбитрирования такой ситуации представлен ниже, где два ведущих пытаются передавать данные подчиненному приемнику.
Рисунок 105. Пример арбитрации
Ниже приведены несколько различных сценариев, возникающих в процессе арбитрирования:
- Два или более ведущих выполняют идентичную связь с одним и тем же подчиненным. В этом случае ни один подчиненный и ни один из ведущих не узнает об этой конфликтной ситуации.
- Два или более ведущих обращаются к тому же подчиненному с различными данными или битом направления данных. В этом случае возникает арбитрирование во время передачи бита ЧТЕНИЕ/ЗАПИСЬ или же бит данных. Одни ведущие выводят на SDA лог. 1, а другие выводят лог.0. Последние теряют арбитрацию. Ведущие, которые проиграли арбитрирование, переходят в безадресный подчиненный режим или ожидают освобождения шины и затем передают новое условие СТАРТ, что зависит от программных действий.
- Два или более ведущих обращаются к различным подчиненным. В этом случае арбитрирование возникает во время передачи бит ПОДЧИН_АДР. Одни ведущие выводят на SDA лог. 1, а другие выводят лог.0. Последние теряют арбитрацию. Ведущие, которые проиграли арбитрирование во время передачи ПОДЧИН_АДР, переходят в подчиненный режим для проверки не обращается ли к ним выигравший арбитраж ведущий. Если такая адресация действительно выполняется, то они переключаются в режим "Подчиненный приемник" или "Подчиненный передатчик" в зависимости от значения бита ЧТЕНИЕ/ЗАПИСЬ. Если адресации не было, то они перейдут в безадресный подчиненный режим или будут ожидать освобождения шины и после этого передадут новое условие СТАРТ (задается программно).
Данные действия обобщены на рисунке 106. Возможные коды состояний представлены внутри окружностей.
Рисунок 106. Возможные коды состояний при потере арбитрации
<< Предыдущая страница | Оглавление | Следующая страница >> |