Шина I2C. Подробности аппаратной реализации. Шина sda


Шина I2C. Подробности аппаратной реализации

Добавлено 21 июня 2017 в 12:13

Сохранить или поделиться

Основная информация для понимания и проектирования аппаратного обеспечения, необходимого для шины I2C.

Дополнительная информация

Шина I2C. Основные понятия

Иногда небольшое усложнение – это хорошо

Протокол I2C отличается некоторыми непростыми особенностями: вы не просто соединяете выводы нескольких микросхем вместе, а затем позволяете низкоуровневым аппаратным средствам брать управление на себя, пока вы читаете или записываете в соответствующий буфер, как это примерно происходит в случаях с SPI (последовательным периферийным интерфейсом) и UART (универсальным асинхронным приемником/передатчиком). Но сложность I2C небезосновательна; остальная часть данной статьи поможет вам понять несколько нюансов аппаратной реализации, которые делают I2C настолько универсальным и надежным вариантом для последовательной связи между несколькими независимыми микросхемами.

Открытый сток

Определяющей особенностью I2C является то, что каждое устройство на шине, должно подключаться к линиям тактового сигнала (сокращенно SCL) и сигнала данных (сокращенно SDA) через выходные драйверы с открытым стоком (или открытым коллектором). Давайте посмотрим, что это на самом деле означает. Сначала рассмотрим типовой CMOS (инвертирующий) выходной каскад:

Если на входе присутствует высокий логический уровень, NMOS транзистор открыт, а PMOS транзистор закрыт. Таким образом, выход имеет низкоомное соединение с землей. Если на входе присутствует низкий логический уровень, ситуация меняется на противоположную, а выход имеет низкоомное соединение с VDD. Это называется двухтактным выходным каскадом, хотя это название не особенно информативно, поскольку оно не подчеркивает низкое сопротивление соединений, которые управляют выходом. В общем случае вы не можете напрямую соединять два двухтактных выхода, поскольку ток будет свободно протекать от VDD до земли, если на одном выходе выдается логическая единица, а на другом – логический ноль.

Теперь рассмотрим схему с открытым стоком:

PMOS транзистор был заменен резистором, внешним по отношению к микросхеме. Если на входе присутствует высокий логический уровень, NMOS транзистор обеспечивает низкоомное соединение с землей. Но если на вход подается низкий логический уровень, NMOS транзистор выглядит как разомкнутая цепь, а это означает, что выход подтягивается к VDD через внешний резистор. Такой механизм приводит к двум важным отличиям. Во-первых, появляется неочевидное рассеивание мощности, когда на выходе низкий логический уровень, поскольку ток протекает через резистор, через канал NMOS транзистора на землю (в двухтактной схеме этот ток блокируется высоким сопротивлением закрытого PMOS транзистора). Во-вторых, выходной сигнал ведет себя по-другому, когда на выходе высокий логический уровень, так как выход подключен к VDD через гораздо более высокое сопротивление (обычно не менее 1 кОм). Эта особенность позволяет напрямую соединять два (и более) устройства с открытым стоком: даже если на одном из них низкий логический уровень, а на другом – высокий логический уровень, то подтягивающий резистор гарантирует, что ток не протекает свободно от VDD на землю.

Некоторые последствия использования на шине схемы с открытым стоком:

  • Сигналы всегда по умолчанию находятся в состоянии логической единицы. Напримем, если ведущее устройство I2C пытается связаться с ведомым устройством, которое вдруг перестало функционировать, сигнал данных никогда не войдет в неопределенное состояние. Если ведомое устройство не управляет сигналом, то он будет считан как логическая единица. Аналогично, если ведущее устройство выключается в середине передачи, линии SCL и SDA вернутся в состояние логической единицы. Другие устройства могут определить, что шина доступна для новых передач, наблюдая, что и SCL, и SDA находятся в состоянии логической единицы в течении определенного периода времени.
  • Любое устройство на шине может безопасно приводить сигналы в состояние логического нуля, даже если другое устройство пытается привести их в состояние логической единицы. Это является основой функции «тактовой синхронизации» или «растяжки тактового сигнала» на шине I2C: ведущее устройство генерирует последовательность тактовых импульсов, но при необходимости ведомое устройство может удерживать линию SCL на низком уровне и тем самым уменьшать тактовую частоту.
  • Устройства с различными напряжениями питания могут сосуществовать на одной и той же шине, пока устройства с более низким напряжением не будут повреждены более высоким напряжением. Например, устройство 3,3 В может связываться с устройством 5 В, если SCL и SDA подтянуты до 5 В – схема с открытым стоком приводит к тому, что высокий логический уровень достигает напряжения 5 В, хотя устройство 3,3 В с типовым двухтактным каскадом не может управлять линией 5 В.

Если у вас есть R, то у вас есть RC

Выходной каскад с открытым стоком ни в коем случае не является стандартной схемой среди цифровых микросхем, и для этого есть причина: он обладает некоторыми существенными недостатками. Один из этих недостатков становится очевидным, когда мы напоминаем, что емкость есть везде. Изменение напряжения ограничено временем, необходимым для заряда или разряда емкости, связанной с определенным узлом. Проблема в том, что подтягивающие резисторы на линиях SCL и SDA ограничивают ток заряда; другими словами, мы имеем гораздо большее сопротивление в RC цепи, постоянная времени которой регулирует переход напряжения от логического низкого уровня в логическому высокому уровню.

Как показывают эти диаграммы, переход от низкого уровня к высокому будет происходить значительно медленнее, чем переход от высокого уровня к низкому, что приводит к классической «пилообразной» форме сигналов I2C:

Эти две осциллограммы показывают переход от низкого уровня к высокому и от высокого уровня к низкому для тактового сигнала шины I2C с подтягивающим резистором 1 кОм и минимальной емкостью (только два устройства на шине с короткими дорожками на печатной плате).

Как выбрать номинал подтягивающих резисторов

На этом этапе должно быть очевидно, что подтягивающее сопротивление накладывает ограничения на максимальную тактовую частоту конкретной шины I2C. На самом деле здесь оказывают влияние и сопротивление, и емкость, хотя емкость от нас мало зависит, потому что она определяется, главным образом, тем, сколько устройств подключено к шине, и характером соединений между этими устройствами. Это приводит к важному вопросу: «Какой выбрать номинал для подтягивающего резистора?». Компромисс между скоростью и рассеиваемой мощностью: более низкое сопротивление уменьшает постоянную времени RC цепи, но увеличивает величину тока, протекающего от VDD на землю (через подтягивающий резистор), когда на SCL или SDA выставлен низкий логический уровень.

Официальная спецификация I2C (стр. 9) гласит, что напряжение не считается «логическим высоким уровнем», пока не достигнет 70% от VDD. Вы можете вспомнить, что постоянная времени RC цепи говорит нам, сколько времени потребуется, чтобы напряжение достигло примерно 63% от конечного напряжения. Таким образом, для простоты будем считать, что R×C говорит нам, сколько времени потребуется, чтобы уровень сигнала вырос от напряжения, близкого к потенциалу земли, до уровня логической единицы.

Теперь, как найти емкость? «Простой» способ – это сборка всей системы и измерение емкости; по крайней мере, это, вероятно, проще, чем пытаться выполнить точный расчет, который учитывает каждый источник емкости – как отмечает рекомендация от Texas Instruments, «при обычном построении электрических схем формируется невообразимое количество конденсаторов». Если подход с измерением не подходит (как это часто бывает), вы можете выполнить приблизительную оценку, определив емкость вывода для каждого устройства на шине (здесь вам поможет техническое описание), а затем добавить 3 пФ на дюйм дорожки на печатной плате и 30 пФ на фут коаксиального кабеля (эти цифры взяты из той же рекомендации, стр. 3).

Предположим, что у нас емкость шины составляет 50 пФ, и мы хотим соответствовать спецификации «стандартного режима» I2C, в которой указано, что максимальное время нарастания составляет 1000 нс.

\[t_{нарастания}=1000\ нс=\left(R\right)\left(50\ пФ\right)\ \ \Rightarrow\ \ R=20\ кОм\]

Таким образом, можно соответствовать требованиям спецификации с Rподтягивающий = 20 кОм: это значение также дает минимальное энергопотребление. Как насчет скорости? Предположим, вы хотите, чтобы длительность присутствия высокого логического уровня на линии синхронизации было, по крайней мере, в три раза больше времени нарастания.

\[t_{лог.1}=3t_{нараст}=3000\ нс\ \ \Rightarrow\ \ f_{max}=\frac{1}{2t_{лог.1}}=167\ кГц\]

Если 167 кГц не достаточно много, вы можете снизить сопротивление (за счет увеличения энергопотребления), пока не достигните желаемой тактовой частоты. (Фактически, «стандартный режим» ограничивает тактовую частоту до 100 кГц, но вы можете адаптировать эти спецификации под потребности вашей системы.)

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

Заключение

Если эта статья выполняет свою цель, то вы теперь хорошо знакомы с основными деталями, связанными с разработкой аппаратного обеспечения I2C. А реализацию программного обеспечения мы рассмотрим в отдельной статье.

Оригинал статьи:

Сохранить или поделиться

radioprog.ru

Шина I2C. Основные понятия

Добавлено 19 июня 2017 в 18:30

Сохранить или поделиться

В данной статье рассматриваются основные характеристики и преимущества протокола последовательной связи I2C (Inter-Integrated Circuit).

Связь через алфавитную кашу

Неудивительно, что общей особенностью электронных систем является необходимость обмена информацией между двумя или тремя или десятью отдельными компонентами. Инженеры разработали ряд стандартных протоколов, которые помогают различным микросхемам успешно общаться, что становится очевидным, когда вы сталкиваетесь с потоком сокращений в разделе «Связь» в списке характеристик микроконтроллера или сигнального процессора: UART, USART, SPI, I2C, CAN... Каждый протокол имеет свои плюсы и минусы, и важно немного знать о каждом из них, чтобы вы могли принимать обоснованные решения при выборе компонентов или интерфейсов.

Эта статья посвящена шине I2C, которая обычно используется для связи между отдельными интегральными микросхемами, расположенными на одной печатной плате. Два других распространенных протокола, которые также входят в эту основную категорию – это UART (универсальный асинхронный приемник/передатчик) и SPI (последовательный периферийный интерфейс). Вам необходимо знать основные характеристики I2C, прежде чем вы сможете полностью понять сравнение этих трех интерфейсов, поэтому обсудим эту тему в конце статьи.

Много названий, а шина одна

Нет сомнений в том, что протокол I2C страдает серьезной терминологической проблемой. Фактическое название – шина Inter–Integrated Circuit. Самая простая и, вероятно, наименее распространенная аббревиатура – IIC. Возможно, эту аббревиатуру недолюбливали из-за того, что две заглавные буквы I выглядят как две единицы, или как две строчных буквы l, или как римская цифра II, или как символ параллельных прямых... В любом случае аббревиатура I2C (произносится как «I в квадрате C») приобрела популярность, несмотря на сомнительную логику обращения с обычной буквой, как если бы она была переменной, подверженной возведению в степень. Третий вариант – I2C («I два C»), который позволяет избежать неудобств форматирования верхнего индекса, а также несколько легче в произношении, чем «I в квадрате C»

Дополнительная путаница вносится, когда вы замечаете, что SMB или SMBus явно используется в качестве еще одного способа обращения к шине I2C. Фактически эти сокращения относятся к шине управления системой SMB (System Management Bus), которая отличается, хотя и почти идентична, от шины I2C. Оригинальный протокол I2C был разработан компанией Phillips Semiconductor, а спустя годы Intel определил протокол SMBus как расширение I2C. Эти две шины в значительной степени взаимозаменяемы; если вас интересуют незначительные отличия между ними, то смотрите страницу 57 спецификации шины управления системой SMB.

Выглядит, как попытка обсудить что-то важное в комнате, полной людей...

Чтобы оценить ловкие технические приемы, которые делают I2C настолько эффективной, вам нужно подумать о трудностях достижения надежной, но универсальной связи между несколькими независимыми компонентами. Ситуация достаточно проста, если у вас есть одна микросхема, которая всегда является ведущей (master), и одна микросхема, которая всегда является ведомой (slave). Но что, если у вас есть несколько ведомых? Что если ведомые не знают, кто ведущий? Что, если у вас есть несколько ведущих? Что произойдет, если ведущий запросит данные у ведомого устройства, которое по какой-то причине перестало функционировать? Или что, если ведомый перестал функционировать в середине передачи? Что делать, если ведущий утверждает, что шина осуществляет передачу, а затем он выйдет из строя, прежде чем освободить шину?

Возможные проблемы на шине

Дело в том, что в системе связи такого типа есть много вещей, которые могут пойти не так. Вы должны помнить об этом, когда будете изучать I2C, потому что в противном случае этот протокол будет казаться невыносимо сложным и перегруженным. Дело в том, что эта дополнительная сложность – это то, что позволяет I2C обеспечивать гибкую, расширяемую, надежную и низкоуровневую последовательную связь.

Обзор

Прежде чем вдаваться в детали, давайте рассмотрим ключевые характеристики I2C:

Шина I2C
  • Используется только два сигнала (тактовая синхронизация и данные) независимо от токо, сколько устройство подключено к шине.
  • Оба сигнала подтягиваются к положительному напряжению питания через резисторы, соответствующих номиналов.
  • Каждое устройство взаимодействует с сигналами данных и тактовой синхронизации через драйверы вывода с открытым стоком (или с открытым коллектором).
  • Каждое ведомое устройство идентифицируется с помощью 7-битного адреса; устройство мастер должно знать эти адреса, чтобы общаться с конкретным ведомым устройством
  • Все передачи инициируются и прекращаются мастером; масте может передавать данные одному или нескольким ведомым устройствам или запрашивать данные из ведомого устройства.
  • Метки «ведущий/master» и «ведомый/slave» по своей сути непостоянны: любое устройство может функционировать и как ведущее, и как ведомое устройство, если оно содержит необходимое аппаратное и/или программное обеспечение. На практике, однако, встраиваемые системы часто используют архитектуру, в которой одни мастер отправляет команды или собирает данные с нескольких ведомых устройств.
  • Сигнал данных обновляется по заднему фронту тактового сигнала, а его выборка происходит по переднему фронту следующим образом: Временная диаграмма сигналов шины I2C
  • Данные передаются в однобайтовых секциях, причем каждый байт сопровождается однобитным сигналом подтверждения, называемым битом ACK/NACK (подтверждение или неподтверждение).

I2C против UART и SPI

Преимущества I2C можно резюмировать следующим образом:

  • требует малое количество выводов/сигналов даже с большим количеством устройств на шине;
  • адаптируется к потребностям разных ведомых устройств;
  • легко поддерживает несколько ведущих устройств;
  • включает в себя функционал ACK/NACK для улучшения обработки ошибок.

А вот некоторые недостатки:

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

С этих точек зрения видно, что I2C особенно подходит, когда у вас сложная, разнообразная или обширная сеть связанных устройств. Интерфейсы UART обычно используются для соединений «точка-точка», потому что не имеют стандартного способа адресации различных устройств и совместного использования линий связи. SPI отлично работает, когда у вас есть одно ведущее и несколько ведомых устройств, но для каждого ведомого устройства требуется отдельный сигнал выбора ведомого, что приводит к большому количеству линий связи и к трудностям разводки печатной платы, когда на шине находится много устройств. И SPI неудобен, когда вам нужно поддерживать несколько ведущих устройств.

Возможно, вам придется сознательно избегать I2C, если пропускная способность является приоритетом; SPI поддерживает более высокие частоты тактового сигнала и минимизирует накладные расходы. Кроме того, разработка низкоуровнего аппаратного обеспечения для SPI (или UART) намного проще, поэтому, если вы работаете с FPGA и разрабатываете свой последовательный интерфейс с нуля, I2C, вероятно, стоит выбирать последним.

Заключение

Мы рассмотрели основные характеристики I2C, и теперь мы достаточно хорошо знаем о преимуществах и недостатках этого протокола, чтобы принять обоснованное решение о том, какую последовательную шину выбрать для какого-то конкретного приложения. В будущих статьях мы рассмотрим протокол и как его реализовать более подробно.

Оригинал статьи:

Сохранить или поделиться

radioprog.ru

назначение, основные технические характеристики, принципы передачи данных.

Многие МК имеют в своем составе модуль последовательного синхронного интерфейса SPI (Serial Peripheral Interface). Интерфейс предназначен для связи МК с периферийными устройствами МКС. Интерфейс SPI организован по принципу «ведущий/ведомый». В качестве ведущего обычно выступает МК. На рис. 15.1 приведена схема подключения МК (ведущего) к микросхеме памяти EEPROM (ведомому) с использованием интерфейса SPI.

Рис. 15.1. Сопряжение МК с периферийной микросхемой посредством интерфейса SPI

Интерфейс SPI имеет три информационные линии: MOSI (Master Output Slave Input) – линия передачи данных от ведущего к ведомому; MISO (Master Input Slave Output) – линия передачи данных от ведомого к ведущему; SCK (Serial ClocK) – линия синхронизации (стробирования) данных. Имеется также линия управления SS, на которую ведущий выставляет низкий уровень для выбора ведомого.

Для подключения к интерфейсу SPI микросхема должна иметь встроенный контроллер. Основные элементы контроллера – 8-разрядный сдвиговый регистр и два буферных регистра данных приемника и передатчика. На рис. 15.2 приведены временные диаграммы обмена данными между ведущим и ведомым по интерфейсу SPI.

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

К недостаткам интерфейса SPI можно отнести очень малую длину линий связи: обычно в пределах платы, длина – несколько десятков сантиметров.

Рис. 15.2. Временные диаграммы обмена по интерфейсу SPI

27. Интерфейс i2c: назначение, основные технические характеристики, принципы передачи

Интерфейсная шина I2C

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

Для увеличения эффективности, упрощения схемотехнических решений фирма Philips разработала простую шину I2C или I2C. Для эффективного использования все присоединенные к ней устройства должны иметь встроенный интерфейс, который позволяет связываться друг с другом по шине I2C. Фирма Philips разработала и изготавливает более 200 интегральных микросхем и других устройств с различной технологией, имеющих встроенный интерфейс I2C. Благодаря своим качествам интерфейс I2C стал стандартом и многие ведущие электронные фирмы (Atmel, Motorola, Microchip, Texas Instruments и др.) также выпускают микросхемы с интерфейсом I2C.

Основные характеристики шины I2C:

  • скорость обмена – до 100 кбит/с для стандартного режима, до 400 кбит/с в скоростном и до 3,4 Мбит/с в высокоскоростном режимах работы;

  • максимальное количество микросхем, присоединенных к шине, ограничивается только суммарной емкостью нагрузки, которая не должна быть больше 400 пФ;

  • максимальная длина линий шины – 2 метра для стандартного режима.

Шина I2C– двунаправленная асинхронная с последовательной передачей данных. Она использует 2 сигнальные линии:

SDA(SerialDAta) – двунаправленная шина данных;

SCL(SerialClock) – линия синхронизации (тактового сигнала).

Для управления линиями применяются выходные каскады с открытым стоком или открытым коллектором, чтобы устройства можно было соединять по схеме «монтажного И». Типовая конфигурация шины I2Cпоказана на рис. 15.3.

Для обеспечения высокого уровня при отсутствии на шине активного устройства используются внешние подтягивающие резисторы RPUсопротивлением 1…10 кОм, в зависимости от длины линии и скорости передачи данных. На одной линии могут работать устройства стандартного и скоростного режимов.

Рис. 15.3. Подключение устройств к шине I2C

Вследствие различных технологий микросхем (n-МОП, КМОП, ТТЛ), которые могут быть подключены к шине, уровни логических 0 и 1 не фиксированы определенными значениями, а зависят от напряжения питанияUCC. Наиболее часто величинаUCCравна +5 В.

Все устройства, подключаемые к шине, делятся на два класса: “Master” (ведущий) и “Slave” (ведомый). Устройство “Master” генерирует тактовый сигналSCLи является ведущим. Оно может самостоятельно выходить на шину и адресовать любое ведомое устройство с целью передачи или приема из него информации. В протоколеI2Cкаждое устройство имеет свой адрес. Обычно в качестве ведущего выступает микроконтроллер.

Когда ведущий желает инициировать передачу данных, он сначала передает адрес устройства, с которым будет производить обмен. Все устройства на шине следят за выставленным адресом и сравнивают его с собственным. Вместе с адресом передается бит направления передачи R/W, который определяет, будет ли ведущий читать из ведомого или записывать в него. ПриR/W= 0 реализуется режим записи в ведомое устройство, приR/W= 1 – режим чтения. Во время обмена всегда один из абонентов – передатчик, а другой – приемник. Таким образом, ведущий и ведомый могут работать в одном из двух режимов обмена:

  • ведущий передает, а ведомый принимает;

  • ведущий принимает, а ведомый передает.

Условия START и STOP. Когда нет передачи данных по шине I2C, реализуется режим ожидания: на линиях SDA и SCL будут высокие уровни напряжения (логические 1) за счет подтягивающих резисторов. Процедура обмена начинается с того, что ведущий формирует условие START: он генерирует переход сигнала на линии SDA из высокого уровня в низкий при высоком уровне на линии SCL, как показано на рис. 15.4. Этот переход воспринимается всеми устройствами, подключенными к шине, как признак начала процедуры обмена. Сеанс обмена завершается тем, что ведущий формирует условие STOP – переход сигнала на линии SDA из низкого уровня в высокий при высоком уровне на линии SCL. Условия START и STOP всегда вырабатываются ведущим. Считается, что шина занята после фиксации условия START. Шина считается освободившейся через некоторое время после фиксации условия STOP.

После формирования условия START ведущий выставляет на линии SCL низкий уровень, а на линии SDA – старший бит первого байта сообщения. Спецификация шины I2C разрешает изменение сигнала на линии SDA только при низком уровне на линии SCL.

Подтверждение. Для подтверждения приема байта сообщения в спецификации протокола шины I2C вводится специальный бит подтверждения ACK, выставляемый приемником на линию SDA после приема 8 бит данных. Для этой цели ведущий формирует 9-й тактовый импульс на линии SCL, при котором приемник выставляет низкий уровень на линии SDA, как признак успешного приема байта. Подтверждение при передаче данных обязательно. На время синхроимпульса подтверждения передатчик отпускает линию SDA, путем вывода сигнала DATA_OUT = 1, при котором выходной транзистор передатчика закрывается. Приемник должен удерживать линию SDA в течение высокого состояния синхроимпульса в стабильном низком состоянии. В том случае, когда ведомый-приемник не может подтвердить прием байта, линия данных должна быть оставлена в высоком состоянии. Это является признаком отсутствия приема байта и оценивается ведущим как отсутствие подтверждения. После этого ведущий может выдать условие STOP для прерывания пересылки данных.

Если в пересылке участвует ведущий-приемник, то он должен сообщить об окончании обмена ведомому-передатчику путем неподтверждения приема последнего байта. После этого ведомый-передатчик должен освободить линию SDA для того, чтобы позволить ведущему выдать условие STOP или повторить START.

Адресация в шине I2C. Для адресации устройств используется два формата адреса: 7-разрядный и 10-разрядный. На рис. 15.5 приведен формат 7-разрядного адреса.

Рис. 15.5. Формат 7-разрядного адреса (ST-START;

R/W – бит направления «чтение/запись»; АСК - подтверждение)

Адрес передается в первом байте ведущим после формирования условия START.

Первые семь битов байта образуют адрес ведомого, причем сначала передается старший разряд адреса A6. Восьмой бит передаваемого байта R/W определяет направление пересылки данных. Если «0», то ведущий будет записывать информацию в ведомый-приемник. Если «1», то ведущий будет читать информацию из ведомого-передатчика. После того, как адрес послан, все устройства на шине сравнивают первые семь бит после условия START со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приемник или как ведомый-передатчик, в зависимости от бита направления. Выбранное устройство посылает на линию SDA бит подтверждения ACK низкого уровня во время 9-го синхроимпульса на линии SCL. Формат 7-разрядной адресации используется в обычном режиме работы шины I2C. Теоретически он позволяет обращаться к 128 устройствам, однако часть адресов используется для служебных целей, что сокращает размер адресного пространства. Адрес ведомого устройства состоит из фиксированной и программируемой частей.

Передача данных. Все передачи по шине I2C производятся байтами. Число байтов, которые могут быть переданы за один сеанс обмена, не ограничено. Каждый байт должен сопровождаться битом подтверждения. Данные передаются, начиная со старшего бита.

Достоинства интерфейса I2C следующие: не нужно разрабатывать схемы сопряжения с интерфейсом, так как они уже интегрированы в микросхемы; большое количество типов микросхем, которые могут быть присоединены к интерфейсу; очень низкое энергопотребление; высокая помехоустойчивость; широкий диапазон питающего напряжения.

К недостаткам I2Cможно отнести небольшую длину линий интерфейса. Обычно они должны располагаться в пределах одной печатной платы.

studfiles.net

Диагностика последовательных шин I2C - Радиотехника и электроника для разработчиков

Информация\Измерения\Цифровые осциллографы\Диагностика последовательных шин I2C

I2С Исходные данные

I2С или "I квадрат C" — шина связи IС. Эта шина была разработана в начале 1980-x компанией Philips и предназначалась для предоставления недорогого способа подключения контроллеров к периферийным микросхемам в телевизорах, a затем была принята в качестве мирового стандарта для обмена данных между устройствами во встроенных системах. Простая двухпроводная конструкция нашла применение в различных микросхемах, таких как микросхемы ввода/вывода, АПЦ, ЦАП, датчиках температуры, микроконтроллерах и микропроцессорах различных ведущих производителей, включая: Analog Devices, Atmel, lnfineon, Cyprus, Intel, Maxim, Philips, Silicon Laboratories, STMicroelectronics, Texas Instruments, Xicor и др.

Принцип работы

Физически шина I2С представляет собой двухпроводный интерфейс с двунаправленными линиями последовательной синхронизации (SCL) и линии передачи данных (SDA). Шина I2С поддерживает несколько ведомых и ведущих устройств, но одновременно может быть активно только одно ведущее устройство. Любое устройство I2С можно подключить к шине и осуществлять обмен данными c ведущим устройством. Все устройства распознаются по уникальному адресу и могут использоваться в качестве передатчика или приемника, в зависимости от их функций. Изначально в шине I2С использовались 7-разрядные адреса, сейчас — 10-разрядные. Поддерживается три скорости передачи бытов: 100 кбит/c (стандартный режим), 400 кбит/c (быстрый режим) и 3,4 Мбит/с (быстродействующий режим). Максимальное количество подключаемых устройств определяется максимальной емкостью 400 пФ или примерно 20-30 устройств. Стандарт I2С определяет следующий формат, представленный на рис. 4: — Start (Старт) — указывает, что управление шиной передано устройству и будет передано сообщение. — Address (Адрес) — 7- или 10-разрядный номер, соответствующий адресу устройства, с которого будут считываться данные или на которое будут записываться данные. — R/W Bit (Бит чтения/записи) — один бит, указывающий, что данные будут считываться c одного устройства или записываться в другое устройство. — Ack (Подтверждение) — один бит с ведомого устройства c подтверждением действия ведущего устройства. Как правило, подтверждение требуется для каждого адреса и байта данных, но не всегда. — Data (Данные) — целое число байт, считываемых или записываемых устройством. — Stop (Стоп) — указывает на завершение сообщения, ведущее устройство освобождает шину.

Рис. 4. Структура сообщения I2C. Рис. 5. Меню настройки шины I2C. Рис. 6. Пример шины I2C. Работа с шиной I2С

Благодаря модулю последовательного запуска DPO4EMBD и приложению анализа, осциллографы серии DPO4000 представляют собой эффективный инструмент для разработчиков встроенных систем c шинами I2C. На передней панели имеются две кнопки шины (В1 и В2), позволяющие пользователям определить входы осциллографа в качестве шины. На рис. 5 показано меню настройки шины I2C. Определяя, какие каналы синхросигналов и данных включены, a также пороги определения логической 1 и О, можно использовать осциллограф для анализа протокола передачи. Благодаря этому осциллограф может выполнять запуск по любой заданной информации на уровне сообщения, a затем декодировать зарегистрированную осциллограмму и выводить понятные результаты. Времена запуска по фронту в надежде обнаружить нужное событие и последующее ручное декодирование сообщения ушли в прошлое. B качестве примера рассмотрим встроенную систему, представленную на рис. 6. Шина I2C подключена к нескольким устройствам, включая CPU (ЦПУ), память EEPROM, контроллер скорости вентилятора, DAC (ЦАП) и пару датчиков температуры. Инструмент вернули на доработку и анализ неисправностей, так как он постоянно грелся и самопроизвольно отключался. Первое, что необходимо проверить, — контроллер вентилятора и сам вентилятор, но они работают нормально. Далее нужно проверить датчик температуры. Контроллер скорости вентилятора периодически опрашивает два датчика температуры (расположенные в различных зонах инструмента) и регулирует скорость вентилятора для поддержания температуры внутри инструмента. Имеется подозрение, что один или оба датчика температуры работают c ошибкой. Чтобы просмотреть взаимодействие между датчиками и контроллером скорости, необходимо подключиться к линиям синхронизации и данных шины I2С и выполнить настройку шины на осциллографе DPO4000. Известно, что адреса датчиков в шине I2С — 18 и 19, поэтому настройка события запуска выполняется по записи в адрес 18 (контроллер скорости вентилятора запрашивает датчик o текущей температуре). На рис. 7 представлена зарегистрированная осциллограмма c запуском. B этом случае канал 1 (желтый) подключен к SCLK, канал 2 (голубой) — к SDA. Фиолетовая осциллограмма соответствует шине I2С, настроенной c помощью ввода на осциллографе нескольких параметров. B верхней части дисплея показана вся зарегистрированная осциллограмма. B этом случае было зафиксировано, что после длительного ожидания в шине возник всплеск активности в середине участка, этот участок был затем увеличен. B нижней большой части экрана представлено окно увеличения. Можно заметить, что осциллограф декодировал содержимое всех сообщений, передаваемых по шине. B осциллографах серии DPO4000 для выделения важных участков сообщения используется выделение цветом или маркеры. Рассматривая зарегистрированные осциллограммы, можно заметить, что осциллограф на самом деле выполнил запуск при записи по адресу 18 (см. левый нижний угол дисплея). Фактически контроллер скорости вентилятора пытается выполнить запись по адресу 18 два раза, но в обоих случаях не получает подтверждение приема. Затем выполнена проверка датчика температуры по адресу 19. Почему первый датчик температуры не отвечает на вызов контроллера вентилятора? Посмотрев на плату, можно обнаружить, что одна из адресных линий плохо припаяна. Датчик температуры не может обмениваться данными по шине, в результате устройство перегревается. Благодаря функциональным возможностям осциллографов серии DPO4000 запуска по событию и декодированию данных в шине I2C, поиск трудно определимой проблемы был выполнен всего за несколько минут.

Рис. 7. Декодирование осциллограммы адресной линии и линии данных I2C. Таблица 1. Условия в шине.

B примере на рис. 7 выполнялся запуск по записи, но функциональные возможности осциллографов серии DPO4000 включают и другие возможности по запуску при тестировании шины I2С. — Старт — запуск, если значение SDA низкое, a значение SCL высокое. — Повторный старт — запуск, если условию запуска не предшествует остановка. Как правило, ведущее устройство отправляет несколько сообщений и только затем освобождает шину. — Остановка — запуск, если значение SDA высокое и значение SCL высокое. — Отсутствие подтверждения — ведомые устройства часто конфигурируются для передачи подтверждения после приема каждого байта адреса или данных. Осциллограф может использовать запуск в случаях, если ведомые устройства не формируют бит подтверждения. — Адрес — запуск по указанному пользователем адресу или по любому предварительно запрограммированному адресу, включая общий вызов, начальный байт, быстродействующий режим, память EEPROM или CBUS. Адресация использует 7 или 10 бит и вводится в двоичном или шестнадцатеричном формате. — Данные — запуск по 12 байтам заданных пользователем значений данных, введенных в двоичном или шестнадцатеричном формате. — Адрес и данные — это позволяет вводить значения адресов и данных, a также чтение или запись для регистрации нужного события.

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

Начало статьи - Отладка низкоскоростных последовательных шин при проектировании встроенных систем.

radiotract.ru

Интерфейс I2C - Микроконтроллеры и Технологии

Дата публикации: 18 июля 2012.

Каждый, кто занимался разработкой радиоэлектронной техники, сталкивался с ситуацией, когда для согласования уровней сигналов, выборки и адресации функционально-законченных узлов, приходится использовать огромное количество промежуточных ИС.Для увеличения эффективности, упрощения схемотехнических решений, Philips разработала простую двунаправленную двухпроводную шину для так называемого "межмикросхемного" (inter-IC) управления. Шина получила название - InterIC, или IIC (I2C) шина.

В настоящее время только Philips производит более 150 наименований I2C-совместимых устройств, функционально предназначенных работы в электронном оборудовании различного назначения. В их числе ИС памяти, видеопроцессоров и модулей обработки аудио- и видео-сигналов, АЦП и ЦАП, драйверы ЖК-индикаторов, процессоры со встроенным аппаратным контроллером I2C шины и многое другое.

I2C шина является одной из модификаций последовательных протоколов обмена данных. В стандартном режиме обеспечивается передача последовательных 8-битных данных со скоростью до 100 кбит/с, и до 400 кбит/с в "быстром" режиме. Для осуществления процесса обмена информацией по I2C шине, используется всего два сигнала линия данных SDA линия синхронизации SCL Для обеспечения реализации двунаправленности шины без применения сложных арбитров шины выходные каскады устройств, подключенных к шине, имеют открытый сток или открытый коллектор для обеспечения функции монтажного "И".

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

Максимальное допустимое количество микросхем, подсоединённых к одной шине, ограничивается максимальной емкостью шины 400 пФ.

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

Все I2C-совместимые устройства имеют интерфейс, который позволяет им связываться друг с другом по шине даже в том случае, если их напряжение питания существенно отличается. На следующем рисунке представлен принцип подключения нескольких ИМС с различными напряжениями питания к одной шине обмена.

Каждое устройство распознается по уникальному адресу и может работать как передатчик или приёмник, в зависимости от назначения устройства.

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

Исходя из спецификации работы шины, в каждый отдельный момент в шине может быть только один ведущий, а именно то устройство, которое обеспечивает формирование сигнала SCL шины. Ведущий может выступать как в роли ведущего-передатчика, так и ведущего-приемника. Тем не менее - шина позволяет иметь несколько ведущих, накладывая определенные особенности их поведения в формировании сигналов управления и контроля состояния шины. Возможность подключения более одного ведущего к шине означает, что более чем один ведущий может попытаться начать пересылку в один и тот же момент времени. Для устранения "столкновений", который может возникнуть в данном случае, разработана процедура арбитража - поведения ведущего при обнаружении "захвата" шины другим ведущим.

Процедура синхронизации двух устройств Эта процедура основана на том, что все I2C-устройства подключаются к шине по правилу монтажного И. В исходном состоянии оба сигнала SDA и SCL находятся в высоком состоянии.

Состояние СТАРТ и СТОП

Процедура обмена начинается с того, что ведущий формирует состояние СТАРТ - ведущий генерирует переход сигнала линии SDA из ВЫСОКОГО состояния в НИЗКОЕ при ВЫСОКОМ уровне на линии SCL. Этот переход воспринимается всеми устройствами, подключенными к шине как признак начала процедуры обмена.

Генерация синхросигнала - это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине.

Процедура обмена завершается тем, что ведущий формирует состояние СТОП - переход состояния линии SDA из низкого состояния в ВЫСОКОЕ при ВЫСОКОМ состоянии линии SCL.

Состояния СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после фиксации состояния СТАРТ. Шина считается освободившейся через некоторое время после фиксации состояния СТОП.

При передаче посылок по шине I2C каждый ведущий генерирует свой синхросигнал на линии SCL.

После формирования состояния СТАРТ, ведущий опускает состояние линии SCL в НИЗКОЕ состояние и выставляет на линию SDA старший бит первого байта сообщения. Количество байт в сообщении не ограничено.

Спецификация шины I2C разрешает изменения на линии SDA только при НИЗКОМ уровне сигнала на линии SCL.

Данные действительны и должны оставаться стабильными только во время ВЫСОКОГО состояния синхроимпульса.

Для подтверждения приема байта от ведущего - передатчика ведомым - приемником в спецификации протокола обмена по шине I2C вводится специальный бит подтверждения, выставляемый на шину SDA после приема 8 бита данных.

Подтверждение

Таким образом передача 8 бит данных от передатчика к приемнику завершаются дополнительным циклом (формированием 9-го тактового импульса линии SCL), при котором приемник выставляет низкий уровень сигнала на линии SDA, как признак успешного приема байта.

Подтверждение при передаче данных обязательно. Соответствующий импульс синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA на время синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильном НИЗКОМ состоянии.

В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных.

Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путем не подтверждения последнего байта. Ведомый-передатчик должен освободить линию данных для того, чтобы позволить ведущему выдать сигнал СТОП или повторить сигнал СТАРТ.

Синхронизация выполняется с использованием подключения к линии SCL по правилу монтажного И.

Это означает, что ведущий не имеет монопольного права на управление переходом линии SCL из НИЗКОГО состояния ВЫСОКОГО. В том случае, когда ведомому необходимо дополнительное время на обработку принятого бита, он имеет возможность удерживать линию SCL в низком состоянии до момента готовности к приему следующего бита. Таким образом, линия SCL будет находиться в НИЗКОМ состоянии на протяжении самого длинного НИЗКОГО периода синхросигналов.

Устройства с более коротким НИЗКИМ периодом будут входить в состояние ожидания на время, пока не кончится длинный период. Когда у всех задействованных устройств кончится НИЗКИЙ период синхросигнала, линия SCL перейдет в ВЫСОКОЕ состояние. Все устройства начнут проходить ВЫСОКИЙ период своих синхросигналов. Первое устройство, у которого кончится этот период, снова установит линию SCL в НИЗКОЕ состояние. Таким образом, НИЗКИЙ период синхролинии SCL определяется наидлиннейшим периодом синхронизации из всех задействованных устройств, а ВЫСОКИЙ период определяется самым коротким периодом синхронизации устройств.

Механизм синхронизации может быть использован приемниками как средство управления пересылкой данных на байтовом и битовом уровнях.

На уровне байта, если устройство может принимать байты данных с большой скоростью, но требует определенное время для сохранения принятого байта или подготовки к приему следующего, то оно может удерживать линию SCL в НИЗКОМ состоянии после приема и подтверждения байта, переводя таким образом передатчик в состояние ожидания.

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

Адресация в шине I2C

Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу.

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

В обычном режиме используется 7-битная адресация.

Процедура адресации на шине I2C заключается в том, что первый байт после сигнала СТАРТ определяет, какой ведомый адресуется ведущим для проведения цикла обмена. Исключение составляет адрес "Общего вызова", который адресует все устройства на шине. Когда используется этот адрес, все устройства в теории должны послать сигнал подтверждения. Однако, устройства могут обрабатывать "общий вызов" на практике встречаются редко.

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

После того, как адрес послан, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от бита направления.

Адрес ведомого может состоять из фиксированной и программируемой части.

Часто случается, что в системе будет несколько однотипных устройств (к примеру ИМС памяти, или драйверов LED-индикаторов), поэтому при помощи программируемой части адреса становится возможным подключить к шине максимально возможное количество таких устройств. Количество программируемых бит в адресе зависит от количества свободных выводов микросхемы. Иногда используется один вывод с аналоговой установкой программируемого диапазона адресов, как это, к примеру, реализовано в ИМС SAA1064. При этом в зависимости от потенциала на этом адресном выводе ИМС, возможно смещение адресного пространства драйвера так, чтобы однотипные ИМС не конфликтовали между собой на общей шине.

Все ИМС, поддерживающие работу в стандарте шины I2C, имеют набор фиксированных адресов, перечень которых указан производителем в описаниях контроллеров.

Комбинация бит 11110ХХ адреса зарезервирована для 10-битной адресации.

В общем виде процесс обмена по шине от момента формирования состояния СТАРТ до состояния СТОП можно проиллюстрировать следующим рисунком :

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

Во время первого байта данных можно передавать адрес в памяти, который записывается во внутренний регистр-защелку. После повторения сигнала СТАРТа и адреса ведомого выдаются данные из памяти. Все решения об авто-инкременте или декременте адреса, к которому произошел предыдущий доступ, принимаются конструктором конкретного устройства. Поэтому, в любом случае лучший способ избежать неконтролируемой ситуации на шине перед использованием новой (или ранее не используемой) ИМС следует тщательно изучить ее описание (datasheet), получив его с сайта производителя. Более того, производители часто размещают рядом более подробные инструкции по применению.

В любом случае, по спецификации шины все разрабатываемые устройства должны сбрасывать логику шины при получении сигнала СТАРТ или повторный СТАРТ и подготавливаться к приему адреса.

Тем не менее основные проблемы с использованием I2C шины возникают именно из-за того, что разработчики, "начинающие" работать с I2C шиной не учитывают того факта, что ведущий (часто - микропроцессор) не имеет монопольного права ни на одну из линий шины.

Расширение I2C

Стандартная шина I2C со скоростью передачи данных 100 кбит/с и 7-битным адресом существует уже на протяжении более 10 лет в неизменном виде. Стандартная шина I2C принята повсеместно как стандарт для сотен типов микросхем, выпускаемых фирмой Philips и другими поставщиками. В настоящее время спецификация шины I2C расширена в двух направлениях : увеличение быстродействия и расширение адресного пространства для расширения номенклатуры вновь разрабатываемых устройств.

Введение спецификации "быстрого" режима, позволяющего в четыре раза увеличить скорость передачи данных до 400кБит\сек. Необходимость в этом "расширении" стандарта потребовалось из-за необходимости пересылки больших объемов информации, и, как следствие, необходимость увеличения пропускной способности канала.

Введение спецификации "10-битной адресации", позволяющая использовать 1024 дополнительных адресов, т.к. большинство из 112 адресов, допустимых при 7-битной адресации, уже были использованы более чем один раз. Для предотвращения проблем с размещением адресов новых устройств, желательно иметь большее количество адресных комбинаций. Примерно десятикратное увеличение количества доступных адресов получено при использовании новой 10-битной адресации.

Все новые устройства с I2C интерфейсом работают в быстром режиме. Предпочтительно, они должны уметь принимать и/или передавать данные на скорости 400 кбит/с. Как минимум они должны быть способны входить в синхронизацию в быстром режиме, с тем чтобы снизить скорость передачи (путем удлинения НИЗКОГО периода SCL) до допустимой величины.

Быстрые устройства как правило совместимы снизу-вверх, что означает их способность работать со стандартными устройствами по медленной шине. Очевидно, что стандартные устройства не способны работать в быстрой шине, потому что они не могут синхронизироваться на высокой скорости и их состояние станет непредсказуемым. Ведомые быстрые устройства могут обладать как 7-битным, так и 10-битным адресом. Однако, 7-битный адрес более предпочтителен, так как его аппаратная реализация более проста и длина посылки меньше. Устройства с 7-битным и 10-битным адресами могут одновременно использоваться на одной шине, независимо от скорости передачи. Как существующие, так и будущие ведущие смогут генерировать и 7-битные, и 10-битные адреса.

В быстром режиме протокол, формат, логические уровни и максимальная емкостная нагрузка линий шины остается неизменными. Алгоритм синхронизации линий SDA и SCL не изменен. Однако, от "быстрых" устройств не требуется совместимости с CBUS-устройствами, так как они не могут работать на высоких скоростях. Входные цепи быстрых устройств должны иметь встроенное подавление выбросов и триггер Шмитта на обоих линиях Выходной буфер быстрых устройств должен иметь каскад с управлением временем заднего фронта линий SDA и SCL. Как правило при пропадании напряжения питания быстрых устройств выводы, подключенные к линиям I2C шины должны переходить в третье состояние . Претерпели изменения схемотехнические решения выходных каскадов для обеспечения времени нарастания переднего фронта (переход из НИЗКОГО состояния в ВЫСОКОЕ). Если для нагрузок шины до 200 пФ эту роль выполняют подтягивающие резисторы, то для нагрузок от 200 пФ до 400 пФ эту функцию выполняет источник тока или схема на переключаемых резисторах, обеспечивающая "форсированное" переключение линий I2C шины.

10-битная адресация также не изменяет формат шины. Для этого используется зарезервированная адресная комбинация 1111ХХХ первых семи бит первого байта. 10-битная адресация не влияет на существующую 7-битную адресацию. Устройства с 7-битной и 10-битной адресацией могут быть подключены к одной шине. Хотя имеются восемь возможных комбинаций последовательности 1111ХХХ, из них используются только четыре - 11110ХХ. Комбинации типа 11111ХХ зарезервированы для дальнейших улучшений шины. Назначение битов первых двух байтов 10-битный адрес формируется из первых двух байтов. Первые семь бит первого байта являются комбинацией вида 11110ХХ, где два младших бита (ХХ) являются двумя старшими (9 и 8) битами 10-битного адреса; восьмой бит первого байта - бит направления."Ноль" в этом бите означает, что ведущий собирается записывать информацию в ведомого, а "единица" - что ведущий будет считывать информацию из ведомого. Если бит направления равен "нулю", то второй байт содержит оставшиеся 8 бит 10-битного адреса. Если бит направления равен "единице", то следующий байт содержит данные, переданные с ведомого ведущему.

В заключение следует отметить, что стандарт I2C шины достаточно просто реализует арбитраж столкновений - решает проблему одновременной инициализации обмена по шине несколькими ведущими, при этом без потери данных.

radioparty.ru

AVR315: Использование TWI модуля в качестве ведущего I2C устройства

- драйвер для ведущего TWI устройства написанный на Си- совместимость с протоколом I2C фирмы Philips- использование аппаратного TWI модуля- передача данных по прерываниям- поддержка стандартного и скоростного режима работы

Двухпроводный последовательный интерфейс (TWI) совместим с I2C протоколом фирмы Philips. Он был разработан, чтобы обеспечить простой, надежный и недорогой способ обмена данными между интегральными микросхемами. Сильными сторонами TWI шины являются возможность адресации до 128 устройств на одной шине, арбитраж и возможность использования нескольких ведущих устройств.

Аппаратный TWI модуль включен в большинство микроконтроллеров AVR.

В этой статье описывается реализация ведущего TWI устройства в виде драйвера и пример его использования. Представленный драйвер может выполнять обмен данными как в стандартном режиме (<100 кбит), так и с скоростном (<400 кбит).

В этом разделе дано короткое описание TWI интерфейса и TWI модуля микроконтроллеров AVR семейства mega. Для более детальной информации обратитесь к спецификации.

Двухпроводный последовательный интерфейс идеально подходит для стандартных микроконтроллерных приложений. Он позволяет разработчику соединять до 128 индивидуально адресуемых устройств, используя всего две двунаправленные линии - одну для тактового сигнала (SCL), другую для данных (SDA). Единственные внешние элементы, необходимые для реализации шины, - это подтягивающие резисторы к каждой TWI линии.

Рис. 1. Подключение устройств на TWI шине

Подключение устройств к I2C шине

К 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).

TWI модуль состоит из нескольких блоков, которые показаны на рисунке 3. 

Рис. 3. Блок схема TWI модуля AVR микроконтроллера

 

Блок схема TWI модуля

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. Расчетные значения для контроллера скорости передачи

скорости передачи TWI модуля

Обе TWI линии (SDA и SCL) являются двунаправленными, поэтому выходы, подключенные к TWI шине, должны быть с открытым стоком или с открытым коллектором. Линии TWI шины имеют высокий уровень, если выводы всех устройств находятся в третьем состоянии и низкий, если хотя бы одно из устройств установило низкий уровень на своих выводах. 

Каждая линия должна быть подключена к источнику питания через подтягивающий резистор. Обратите внимание, качестве этих резисторов могут использоваться встроенные подтягивающие резисторы выводов SDA и SCL.

Выходные драйверы содержат ограничители скорости нарастания сигнала. Входные каскады содержат фильтры для подавления импульсов, которые короче 50 нс. 

На рисунке 4 показано подключение TWI устройств к TWI шине. Значение подтягивающих резисторов Rp зависит от напряжения питания Vcc и емкости шины. Типовое значение подтягивающих резисторов 4.7 кОм. 

Рис.4. Подключение к TWI шине

подключение к 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 интерфейсу с помощью драйвера ведущего устройства. 

функции драйвера TWI

На рисунке 6 показаны блок схемы функций TWI драйвера. 

Более детальное описание функции прерывания TWI модуля представлено на рисунке 7. Обработчик прерывания реализован в виде конечного автомата. С левой стороны расположены различные состояния/события, в которых он может находиться. Вызванная функция передачи данных копирует содержимое сообщения во внутренний буфер TWI драйвера, затем она разрешает прерывание TWI модуля и формирует состояние СТАРТ. Когда состояние СТАРТ будет выдано на шину, вызовется обработчик прерывания и начнется передача данных. При каждом вызове прерывания автомат будет выполнять действия соответствующие статусному коду TWI модуля. По завершении передачи или в случае возникновения ошибки, прерывание TWI модуля будет запрещено и во внутренней переменной драйвера будет установлен соответствующий статусный код. 

обработчик прерывания TWI модуля

avr315-iar.rar - проект для IAR AVR.AVR315: Using the TWI module as I2C master

Перевод ChipEnable.Ru

chipenable.ru