Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2754
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

14. I2C

Внастоящее время даже самая простая печатная плата содержит две или более цифровых интегральных схем (ИС) в дополнение к основному микроконтроллеру, предназначенному для конкретных задач. АЦП и ЦАП, память EEPROM, датчики, логические порты ввода/вывода, тактовые сигналы RTC, радиочастотные схемы и предназначенные для ЖК-дисплея контроллеры – это лишь небольшой список возможных ИС, специализирующихся на выполнении только одной задачи. При проектировании современной цифровой электроники самое главное – правильный выбор (и программирование) мощных, под конкретную задачу и, чаще всего, дешевых ИС, объединенных в конечную печатную плату.

Взависимости от характеристик этих микросхем они часто предназначены для обмена сообщениями и данными с программируемым устройством (которое обычно представляет собой микроконтроллер, но не ограничивается им) в соответствии с четко определенным протоколом связи. Двумя наиболее распространенными протоколами для внутриплатного обмена данными являются I2C и SPI, оба разработаны в начале 80-х, но все еще широко распространены в электронной промышленности, особенно когда скорость связи не является строгим требованием и ограничена размерами печатной платы1.

Почти все микроконтроллеры STM32 предоставляют отдельную аппаратную периферию, способную взаимодействовать с использованием протоколов I²C и SPI. Данная глава является первой из двух, посвященных этой теме, и в ней кратко описывается протокол I²C и соответствующие API-интерфейсы CubeHAL для программирования этого периферийного устройства. Если вам интересно узнать больше о протоколе I²C, руководство UM10204 от NXP2 предоставляет полную и самую актуальную спецификацию.

14.1. Введение в спецификацию I²C

Inter-Integrated Circuit (межмикросхемное соединение, оно же I²C – произносится как

Ай-в квадрате-Си или чаще Ай-два-Си) представляет собой аппаратную спецификацию и протокол, разработанный в Philips подразделением полупроводниковых устройств (в

настоящее время NXP Semiconductors3) еще в 1982 году. I²C – многоведомая (multi-slave)4,

1Хотя существуют приложения, в которых протоколы I²C и SPI используются для обмена сообщениями по внешним проводам (обычно длиной около метра), данные спецификации не были предназначены для обеспечения надежной связи через потенциально шумные среды. По этой причине их применение ограничено одиночной платой.

2http://www.nxp.com/documents/user_manual/UM10204.pdf

3NXP приобрела Freescale Semiconductor в 2015 году, и обе компании предоставляют микроконтроллеры на базе Cortex-M. Это означает, что в настоящее время NXP предоставляет два отдельных семейства микроконтроллеров на базе Cortex-M: LPC от NXP и Kinetis от Freescale. Данные два семейства являются прямыми конкурентами ассортименту STM32, и неясно, какое из этих двух семейств выживет после такого важного приобретения (по мнению автора продолжать развиваться обоим не имеет смысла). Хотя характеристики ассортиментов Kinetis и LPC сопоставимы с сериями STM32, последняя, вероятно, более распространена, особенно среди радиолюбителей и студентов.

4I²C также может быть многоведущим (multi-master) протоколом, т.е. это означает, что на одной и той же шине могут существовать два или более ведущих устройств, но только одно ведущее устройство одновременно может взять на себя управление и разрешить доступ к шине. На практике очень редко используется I²C в многоведущем режиме во встроенных системах. Данная книга не охватывает многоведущий режим.

I2C

406

полудуплексная, несимметричная, ориентированная на 8-битные сообщения спецификация последовательной шины, которая использует только два провода для соединения заданного числа ведомых устройств с ведущим устройством. До октября 2006 года разработка устройств на базе I²C подлежала уплате лицензионных отчислений Philips, но это ограничение было снято5.

Рисунок 1: Графическое представление шины I²C

Два провода, образующие шину I²C, представляют собой двунаправленные линии с от-

крытым стоком (open-drain lines), называемые Линия последовательной передачи данных (Serial Data Line, SDA) и Линия синхронизации последовательной шины (Serial Clock Line, SCL) соответственно (см. рисунок 1). Протокол I²C устанавливает, что эти две линии должны быть подтянуты к питанию с помощью резисторов. Номинал данных резисторов напрямую связан с емкостью шины и скоростью передачи. Этот документ от Texas Instruments6 предоставляет необходимые формулы для вычисления номинала резисторов. Однако довольно часто используются резисторы с сопротивлением, близким к

4,7 кОм.

Современные микроконтроллеры, такие как STM32, позволяют конфигуриро-

вать линии GPIO как подтянутые к питанию с открытым стоком (open-drain pull-up), включив внутренние подтягивающие резисторы. В Интернете довольно часто можно прочитать, что вы можете использовать внутренние подтягивающие резисторы, чтобы подтянуть к питанию линии I²C, избегая использования внешних резисторов. Однако во всех устройствах STM32 внутренние подтягивающие резисторы имеют значение, близкое к 20 кОм, чтобы избежать нежелательных утечек электроэнергии. Такое значение увеличивает время, необходимое шине для достижения ВЫСОКОГО логического уровня, снижая скорость передачи данных. Если скорость не важна для вашего приложения, и если (это очень важно) вы не используете длинные проводящие дорожки платы между микроконтроллером и ИС (менее 2 см), то для многих приложений можно использовать внутренние подтягивающие резисторы. Но если на плате достаточно места для размещения пары резисторов, настоятельно рекомендуется использовать внешние подтягивающие резисторы.

5Вам все еще нужно платить лицензионные отчисления компании NXP, если вы хотите получить официальный и лицензированный пул адресов I²C для ваших устройств, но я думаю, что это не относится к читателям данной книги.

6https://www.ti.com/lit/an/slva689/slva689.pdf