Особенности
- драйвер для ведущего TWI устройства написанный на Си
- совместимость с протоколом I2C фирмы Philips
- использование аппаратного TWI модуля
- передача данных по прерываниям
- поддержка стандартного и скоростного режима работы
Введение
Двухпроводный последовательный интерфейс (TWI) совместим с I2C протоколом фирмы Philips. Он был разработан, чтобы обеспечить простой, надежный и недорогой способ обмена данными между интегральными микросхемами. Сильными сторонами TWI шины являются возможность адресации до 128 устройств на одной шине, арбитраж и возможность использования нескольких ведущих устройств.
Аппаратный TWI модуль включен в большинство микроконтроллеров AVR.
В этой статье описывается реализация ведущего TWI устройства в виде драйвера и пример его использования. Представленный драйвер может выполнять обмен данными как в стандартном режиме (<100 кбит), так и с скоростном (<400 кбит).
Теория
В этом разделе дано короткое описание TWI интерфейса и TWI модуля микроконтроллеров AVR семейства mega. Для более детальной информации обратитесь к спецификации.
Двухпроводный последовательный интерфейс
Двухпроводный последовательный интерфейс идеально подходит для стандартных микроконтроллерных приложений. Он позволяет разработчику соединять до 128 индивидуально адресуемых устройств, используя всего две двунаправленные линии - одну для тактового сигнала (SCL), другую для данных (SDA). Единственные внешние элементы, необходимые для реализации шины, - это подтягивающие резисторы к каждой TWI линии.
Рис. 1. Подключение устройств на TWI шине
К TWI шине может быть подключено несколько ведущих устройств и только ведущие устройства могут управлять SCL и SDA линиями. Ведомые устройства могут управлять только SDA линией.
Передача данных всегда начинается ведущим. Для этого он устанавливает низкий уровень на линии SDA при высоком уровне на линии SCL. Такое сочетание сигналов называется СТАРТ состоянием.
Рис.2. Формат адресного пакета и пакета данных.
После СТАРТ состояния всегда следует уникальный 7-и разрядный адрес ведомого устройства и бит направления передачи. Если какое-нибудь ведомое устройство получает свой адрес, то оно формирует ведущему подтверждение, удерживая низкий уровень на линии SDA в течении одного такта. Если ведущий не получает подтверждение, он завершает передачу. Если передача продолжается, то далее, в зависимости от R/W бита, ведущий или ведомый передает на линию SDA 8 бит данных. В ответ на это, устройство, получившее данные, формирует подтверждение. Далее передача данных может продолжаться аналогичным образом до формирования состояния СТОП или повторный СТАРТ. Если ведущий формирует состояние СТОП, которое определено как низкий уровень на линии SDA при высоком уровне на линии SCL, то передача данных останавливается.
Если ведомое устройство не может обработать входящие данные, будучи занято другими операциями, оно может удерживать низкий уровень на SCL линии, заставляя ведущего находиться в состоянии ожидания.
Все пакеты данных передаются на TWI шине 9-ю битами, из них 8 бит - это байт данных и 1 бит - это подтверждение. Во время передачи данных ведущий формирует тактовый сигнал и условия СТАРТ и СТОП, а приемник - бит подтверждения. Подтверждение (ACK) формируется удержанием низкого уровня на линии SDA во время девятого такта на SCL линии. Если приемник оставляет на линии SDA высокий уровень - это сигнализирует об отсутствии подтверждения (NACK).
AVR TWI модуль
TWI модуль состоит из нескольких блоков, которые показаны на рисунке 3.
Рис. 3. Блок схема TWI модуля AVR микроконтроллера
Модуль контроля
TWI модуль AVR может работать как в ведущем, так и ведомом режимах. Режим работы определяет статусные коды в регистре TWSR и использование битов управляющего регистра TWCR.
Статусные коды отражают состояние, в котором находится TWI модуль после выполнения определенных операций. Набор статусных кодов фиксирован и отличается для ведущего и ведомого устройства, работающих в режиме приема или передачи данных. Также есть статусные коды для ошибочного состояния шины и режима ожидания.
TWI модуль работает как конечный автомат, реагируя на различные события. Все события TWI модуля устанавливают TWINT флаг. Если прерывания TWI модуля разрешены и установлен флаг глобального разрешения прерываний, то в этом случае вызывается обработчик прерывания TWI модуля. Обработчик анализирует статусный код в регистре TWSR и выполняет действия соответствующие этому коду.
Пока TWINT флаг установлен, на линии SCL удерживается низкий уровень. Это позволяет программному приложения завершить свои задачи, прежде чем позволить продолжить обмен данными по TWI.
TWINT флаг устанавливается в следующих ситуациях:
- было передано состояние СТАРТ (повторный СТАРТ)
- был передан адресный пакет SLA+R/W
- был передан байт данных
- TWI модуль потерял приоритет
- TWI модуль принял свой адрес или общий вызов
- был принят байт данных
- после состояния СТОП или повторный СТАРТ модуль был адресован как ведомый
- на шине произошла ошибка, связанная с некорректным состоянием СТАРТ или СТОП
Контроллер скорости передачи
Контроллер скорости передачи управляет периодом SCL сигнала, когда устройство работает в режиме ведущего. Период SCL определяется установками в регистре TWBR и младшими разрядами статусного регистра TWSR. В ведомом режиме эти настройки не влияют на скорость передачи, но тактовая частота микроконтроллера, работающего ведомым TWI устройством, должна быть в 16 раз больше, чем частота внешнего SCL сигнала. Заметьте, что ведомое устройство может продлевать длительность низкого уровня SCL сигнала, тем самым уменьшая среднюю частоту обмена по TWI шине.
Формула 1.
где TWBR - значение соответствующего регистра, TWSR - значение младших разрядов регистра, определяющих коэффициент деления тактовой частоты.
Разряды TWPS - размещены в регистре TWSR, в котором также содержатся статусные коды. Для более простой обработки статусных кодов, эти биты должны быть сброшены. Для установки требуемой скорости обмена можно использовать только регистр TWBR. В таблице 1 показаны рассчитанные значения для TWBR для различных скоростей обмена по TWI и тактовых частот микроконтроллера.
Таблица 1. Расчетные значения для контроллера скорости передачи
SCL и SDA выводы
Обе TWI линии (SDA и SCL) являются двунаправленными, поэтому выходы, подключенные к TWI шине, должны быть с открытым стоком или с открытым коллектором. Линии TWI шины имеют высокий уровень, если выводы всех устройств находятся в третьем состоянии и низкий, если хотя бы одно из устройств установило низкий уровень на своих выводах.
Каждая линия должна быть подключена к источнику питания через подтягивающий резистор. Обратите внимание, качестве этих резисторов могут использоваться встроенные подтягивающие резисторы выводов SDA и SCL.
Выходные драйверы содержат ограничители скорости нарастания сигнала. Входные каскады содержат фильтры для подавления импульсов, которые короче 50 нс.
На рисунке 4 показано подключение TWI устройств к TWI шине. Значение подтягивающих резисторов Rp зависит от напряжения питания Vcc и емкости шины. Типовое значение подтягивающих резисторов 4.7 кОм.
Рис.4. Подключение к TWI шине
Модуль контроля адреса
Модуль контроля адреса используется, когда микроконтроллер работает в режиме ведомого. Он проверяет, совпадает ли принятый адрес со значением установленным в адресном регистре TWAR. Результат сравнения адреса передается блоку управления TWI модуля, что позволяет выполнить требуемые действия. В зависимости от настроек регистра TWCR модуль TWI может подтвердить или не подтвердить свой адрес.
Хотя тактирование TWI модуля во всех спящих режимах отключается, модуль все еще может подтверждать прием собственного адреса или адреса общего вызова, используя тактовый сигнал SCL, приходящий по TWI шине. При выходе из спящего режима TWI модуль удерживает низкий уровень на линии SCL, пока не будет очищен TWINT флаг.
Блок шинного интерфейса
Этот блок содержит сдвиговый регистр адреса/данных (TWDR), контроллер формирования состояний СТАРТ/СТОП и контроллер приоритета. TWDR содержит передаваемые или принятые адрес/данные. Также в этом блоке есть регистр, содержащий принятый или переданных бит подтверждения.
Контроллер состояний СТАРТ/СТОП отвечает за формирование и детектирование состояний СТАРТ, повторный СТАРТ и СТОП. Он также детектирует состояния СТАРТ и СТОП, когда AVR микроконтроллер находится в спящем режиме и пробуждает его, если микроконтроллер адресуется ведущим устройством. Если TWI модуль инициирует передачу данных как ведущее устройства, контроллер приоритета непрерывно контролирует передачу данных, чтобы определить наличие конфликтов на шине. Если TWI модуль теряет приоритет, контроллер приоритета сообщает об этом блоку управления, который выполняет необходимые действия и генерирует статусные коды.
Реализация
В этом статье реализован драйвер ведущего устройства, но TWI модуль также поддерживает работу в режиме ведомого. Пример драйвера ведомого устройства есть в материале "AVR311 TWI Slave Implementation". Драйверы ведущего и ведомого устройств могут быть объединены, но это не входит в цели данной статьи.
Драйвер ведущего устройства состоит из трех файлов.
- TWI_Master.h
- TWI_Master.c
- Main.c
В заголовочном файле TWI_Master.h объявлены прототипы функций, определено значение регистра TWBR и все статусные коды. Этот файл нужно включать в приложение, где используются функции драйвера. Значение TWBR нужно установить согласно данному ранее описанию (смотрите таблицу выше). Статусные коды можно использовать для анализа ошибок и выполнения соответствующих действий. Файл TWI_Master.c содержит реализацию всех функций драйвера, а в main.c - пример использования этих функций.
Функции
Драйвер содержит обработчик прерывания TWI модуля и шесть функций. Описание функций приведено ниже.
void TWI_Master_Initialise(void) - эта функция устанавливает скорость передачи и задает начальные настройки TWI модуля. После вызова этой функции нужно разрешить прерывания.
void TWI_Start_Transceiver_with_Data(uchar *message, uchar messageSize) - эта функция передает подготовленное сообщение по TWI шине. Функции принимает в качестве параметров указатель на массив и количество байт для передачи. Первый байт массива должен содержать адрес ведомого устройства и бит чтения/записи. Остальные байты могут содержать передаваемую информацию или быть пустыми. Если во время вызова этой функции TWI модуль уже выполняет передачу сообщения, функция будет ожидать завершения этой операции в цикле.
void TWI_Start_Transceiver(void) - эта функция посылает последнее сообщение, сохраненное в передающем буфере. Если во время вызова этой функции TWI модуль уже выполняет передачу сообщения, функция будет ожидать завершения этой операции в цикле.
uchar TWI_Get_State_Info(void) - это функция возвращает информацию о результате последней выполненной операции TWI модуля. При возникновении ошибки, функция возвращает статусный код. Если во время вызова этой функции TWI модуль выполняет передачу данных, функция будет ожидать завершения этой операции в цикле.
uchar TWI_Get_Data_From_Transceiver(uchar *message, uchar messageSize) - эта функция используется, чтобы получить принятые данные. Она копирует содержимое передающего буфера TWI модуля в массив. Перед вызовом этой функции нужно вызывать TWI_Start_Transceiver_with_Data(...) или TWI_Start_Transceiver(). В качестве параметров функция принимает указатель на массив и количество байт, которые нужно скопировать. Если во время вызова этой функции TWI модуль выполняет передачу сообщения, функция будет ожидать завершения этой операции в цикле. Если передача предыдущего сообщения закончилась с ошибкой, функция вернет код ошибки.
__interrupt void TWI_ISR(void) - это обработчик прерывания TWI модуля. Эта функция вызывается автоматически при возникновении определенных событий. Самостоятельно вызывать эту функцию не нужно.
На рисунке 5 показана блок схема процесса отправки и приема данных по TWI интерфейсу с помощью драйвера ведущего устройства.
На рисунке 6 показаны блок схемы функций TWI драйвера.
Более детальное описание функции прерывания TWI модуля представлено на рисунке 7. Обработчик прерывания реализован в виде конечного автомата. С левой стороны расположены различные состояния/события, в которых он может находиться. Вызванная функция передачи данных копирует содержимое сообщения во внутренний буфер TWI драйвера, затем она разрешает прерывание TWI модуля и формирует состояние СТАРТ. Когда состояние СТАРТ будет выдано на шину, вызовется обработчик прерывания и начнется передача данных. При каждом вызове прерывания автомат будет выполнять действия соответствующие статусному коду TWI модуля. По завершении передачи или в случае возникновения ошибки, прерывание TWI модуля будет запрещено и во внутренней переменной драйвера будет установлен соответствующий статусный код.
Ссылки
avr315-iar.rar - проект для IAR AVR.
AVR315: Using the TWI module as I2C master
Перевод ChipEnable.Ru
Comments
Спасибо за статьи и с наступающим тебя, Павел.
RSS feed for comments to this post