Опубликовано

Шина I2C

Исходный код и прочие электронные ресурсы:

Исходный код, видеоуроки и прочие электронные ресурсы для этой главы можно загрузить с веб-страницы https://www.exploringarduino.com/content2/ch10.

Исходный код для проектов этой главы можно также загрузить на вкладке Downloads веб-страницы издательства Wiley для этой книги: https://www.wiley.com/go/exploringarduino2e.


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

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


Примечание

На веб-странице электронных ресурсов книги для этой главы (https://www.exploringarduino.com/content2/ch10) можно просмотреть учебный видеофильм о шине I2C.

История создания протокола I2C

Работу коммуникационного протокола намного легче понять, если знать, как он эволюционировал с течением времени. Протокол I2C был разработан компанией Philips Semiconductors в начале 80-х годов прошлого столетия для обеспечения сравнительно низкоскоростной связи между разными микросхемами. К 90-м годам прошлого столетия протокол был стандартизирован, и другие компании начали использовать его, выпуская совместимые с ним микросхемы. Этот протокол часто называют двухпроводным протоколом, поскольку для обмена данными в нем предусмотрено всего лишь два провода: для данных и для сигнала тактирования. Хотя не все устройства законно используют для связи двухпроводный протокол (поскольку их производители не уплатили за это), обычно их все равно называют I2C-устройствами. Можно провести аналогию с копировальными аппаратами, которые называются ксероксами, хотя они не выпускаются компаний Xerox, которая была первой, создавшей копировальный аппарат электрографического типа с порошковым красящим элементом под этим торговым названием. Поэтому, если для устройства указывается, что оно использует двухпроводный протокол связи, то можно быть в большой степени уверенным, что этот протокол работает, как описано в этой главе.

Вам, возможно, также встретятся устройства, применяющие другой двухпроводный протокол, называющийся SMBus (System Management Bus — системная управляющая шина). Этот протокол разработан компаниями Intel и Duracell на основе протокола I2C и очень похож на него. Но в нем заданы немного другие пределы электрических сигналов, определен алгоритм обнаружения ошибок, а также реализована явная поддержка необязательной сигнальной линии для прерываний, позволяющая ведомым устройствам уведомлять ведущее об определенных событиях. Обычно, устройства SMBus и I2C можно без проблем одновременно подключать к одной шине, если четко соблюдать требования, изложенные в справочных листках.

Схема подключения устройств I2C

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

image1

Рис. 10.1. Стандартная схема организации связи через шину I2C (Рисунок создан в программе EAGLE)

Взаимодействие и идентификация устройств

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

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

Поэтому, например, датчики температуры выпускаются с разными заранее запрограммированными адресами шины I2C, поскольку обычно к одной шине необходимо подключить несколько таких датчиков. Для экспериментов этой главы мы будем применять датчик температуры линейки TC74. Из справочного листка на этот датчик можно увидеть, что он предлагается с несколькими разными адресами. (рис. 10.2.) Для описанных далее экспериментов мы возьмем датчик температуры TC74A0-5.0VAT с адресом 1001000. Данный датчик является версией этой микросхемы с питанием 5 В и корпусом типа TO-220.

image2

Рис. 10.2. Возможные адреса для датчика температуры TC74 (Источник: © Microchip Technology Incorporated. Репродукция с разрешения)

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

Другие микросхемы I2C, например AD7414 and AD7415 (другой I2C цифровой датчик температуры, выпускаемый компанией Analog Devices), оснащаются контактами выбора адреса (AS — address select), посредством которых им можно присвоить определенный I2C-адрес. На рис. 10.3 приводится фрагмент справочного листка для микросхемы датчика AD7414, на котором показана ее цоколевка, а также таблица присвоения ей адреса I2C.

image3

Рис. 10.3. Настройка адреса I2C для микросхемы датчика температуры AD7414 (Источник: Авторские права принадлежат компании Analog Devices, Inc. с 2019 г. Все права сохраняются)

Как можно видеть на рис. 10.3, предлагается четыре варианта микросхемы AD7414: два с контактом выбора адреса AS и два без такого контакта. Для микросхем с контактом выбора адреса AS можно задать один из трех адресов, подключив этот контакт к шине питания, шине земли или оставив его неподключенным.

РЕКОМЕНДАЦИИ ПО ВЫБОРУ КОМПОНЕНТОВ ДЛЯ РАЗРАБОТЧИКА УСТРОЙСТВ

Предположим, что вы разрабатываете устройство, в котором требуется несколько датчиков температуры. Например, печатную плату с тремя микросхемами драйвера шагового двигателя для мониторинга температуры радиаторов, на которые вам нужно установить три микросхемы датчика температуры. Что целесообразнее в данном случае, использовать микросхемы с разными предварительно запрограммированными адресами (например, версию датчика TC74), или же микросхемы (например, AD7414), адреса которых можно программировать с помощью контакта выбора адреса AS? Ответ на этот вопрос зависит от ограничений вашей разработки.

Если вы планируете изготовить большое количество этих печатных плат, тогда большую роль в выборе компонентов может сыграть такой фактор, как экономия затрат. Стоимость микросхемы AD7414 при покупке одного экземпляра составляет $2,59, но при покупке партии в 3000 шт. уменьшается до $1,16 за экземпляр. Если вы планируете изготовить несколько тысяч таких плат, то можете сэкономить большую сумму денег, установив на каждую плату три экземпляра одного устройства, а не три разных устройства[1].

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

Аппаратные требования и повышающие резисторы

Возможно, вы заметили в схеме на рис. 10.1, что для обеих линий шины I2C стандартной конфигурации требуются повышающие резисторы. Номинал этих резисторов зависит от типа подключенных к шине ведомых устройств и их количества. В этой главе мы будем использовать повышающие резисторы номиналом 4,7 кОм для обеих линий шины; это стандартное значение, которое указывается во многих справочных листках.

Добавить комментарий