Что такое протокол I2C и как он работает. Какие преимущества дает использование I2C в электронных устройствах. Как реализуется передача данных по шине I2C. Какие существуют особенности и ограничения интерфейса I2C.
Что представляет собой протокол I2C и для чего он используется
I2C (Inter-Integrated Circuit) — это последовательный протокол связи, разработанный компанией Philips для организации обмена данными между компонентами на одной печатной плате. Основные особенности I2C:
- Использует всего две двунаправленные линии — SDA (данные) и SCL (тактовый сигнал)
- Поддерживает подключение нескольких ведущих и ведомых устройств на одну шину
- Обеспечивает простую и недорогую связь между микросхемами
- Широко применяется для подключения периферийных устройств к микроконтроллерам
Благодаря своей простоте и эффективности, I2C стал одним из самых популярных интерфейсов в микроэлектронике. Он позволяет существенно сократить количество проводников на печатной плате по сравнению с параллельными шинами.
Принцип работы шины I2C
Передача данных по I2C осуществляется по следующим принципам:
- Используются две линии — SDA для передачи данных и SCL для синхронизации
- На шине есть ведущие устройства, инициирующие обмен, и ведомые, отвечающие на запросы
- Каждое устройство имеет уникальный 7-битный адрес
- Передача начинается с сигнала START и заканчивается сигналом STOP
- Данные передаются 8-битными посылками с подтверждением приема
Такая организация обеспечивает надежную передачу данных даже при наличии нескольких устройств на шине. Важную роль играют подтягивающие резисторы, обеспечивающие высокий уровень на линиях в исходном состоянии.
Особенности адресации устройств на шине I2C
Адресация в протоколе I2C имеет следующие особенности:
- Используются 7-битные адреса устройств
- Первый байт после START содержит 7 бит адреса и бит направления передачи
- Доступно до 128 уникальных адресов
- 16 адресов зарезервированы для специальных целей
- Возможно использование 10-битной адресации для расширения адресного пространства
При передаче адреса все устройства на шине сравнивают его со своим адресом. Только устройство с совпавшим адресом отвечает сигналом подтверждения ACK. Это позволяет организовать обмен данными с конкретным выбранным устройством.
Форматы передачи данных по I2C
Протокол I2C определяет несколько форматов передачи данных:
- Запись данных от ведущего к ведомому
- Чтение данных от ведомого ведущим
- Комбинированная передача с повторным стартом
- Передача 10-битного адреса
Рассмотрим подробнее операции записи и чтения как наиболее часто используемые.
Операция записи по I2C
Последовательность действий при записи данных:
- Ведущий формирует сигнал START
- Передается адрес ведомого и бит записи
- Ведомый отвечает битом подтверждения ACK
- Ведущий передает байты данных
- Ведомый подтверждает прием каждого байта
- После передачи всех данных ведущий формирует сигнал STOP
Операция чтения по I2C
При чтении данных выполняются следующие шаги:
- Ведущий формирует сигнал START
- Передается адрес ведомого и бит чтения
- Ведомый отвечает битом подтверждения ACK
- Ведомый передает запрошенные байты данных
- Ведущий подтверждает прием каждого байта, кроме последнего
- Ведущий завершает передачу сигналом STOP
Такие форматы обеспечивают гибкий двунаправленный обмен данными между устройствами на шине I2C.
Тактирование и синхронизация в I2C
Синхронизация передачи данных в I2C осуществляется следующим образом:
- Тактовый сигнал SCL всегда генерируется ведущим устройством
- Данные на линии SDA должны быть стабильны при высоком уровне SCL
- Изменение SDA при высоком SCL интерпретируется как служебные сигналы START/STOP
- Ведомые устройства могут растягивать низкий уровень SCL для замедления передачи
Такой механизм синхронизации позволяет согласовать скорость обмена данными между устройствами с разным быстродействием. При этом ведущее устройство всегда контролирует тактирование шины.
Арбитраж при наличии нескольких ведущих на шине I2C
Протокол I2C поддерживает работу нескольких ведущих устройств на одной шине. Для разрешения конфликтов используется следующий механизм арбитража:
- Ведущие отслеживают состояние линии SDA при передаче
- Если ведущий передает 1, а на шине 0, он теряет приоритет
- Приоритет получает устройство, передающее больше нулей в начале посылки
- Проигравшие арбитраж устройства переходят в режим ведомого
Такой метод арбитража не приводит к потере данных и позволяет организовать работу многих ведущих устройств на одной шине I2C без конфликтов.
Программная реализация протокола I2C
Для работы с интерфейсом I2C в микроконтроллерах обычно реализуются следующие программные компоненты:
- Драйвер инициализации I2C
- Функции формирования START/STOP
- Процедуры записи/чтения байта
- Обработчики прерываний
- Функции адресации устройств
- Процедуры обработки ошибок
Конкретная реализация зависит от архитектуры микроконтроллера и поставленных задач. Многие производители предоставляют готовые библиотеки для работы с I2C, упрощающие разработку.
Сравнение I2C с другими интерфейсами
По сравнению с другими распространенными интерфейсами I2C имеет следующие особенности:
Параметр | I2C | SPI | UART |
---|---|---|---|
Количество линий | 2 | 3-4 | 2-4 |
Макс. скорость | 3,4 Мбит/с | >10 Мбит/с | ~1 Мбит/с |
Адресация устройств | Есть | Нет | Нет |
Количество устройств | До 128 | Не ограничено | 2 |
I2C обеспечивает оптимальный баланс между простотой реализации, скоростью работы и возможностью подключения множества устройств.
Распространенные области применения интерфейса I2C
Благодаря своим преимуществам, I2C широко используется в следующих областях:
- Подключение датчиков (температуры, давления, освещенности и т.д.)
- Работа с EEPROM и другими микросхемами памяти
- Управление ЖК и OLED дисплеями
- Взаимодействие с аудиокодеками
- Связь между микроконтроллерами в распределенных системах
- Подключение часов реального времени
- Управление светодиодными драйверами
Простота реализации и широкая поддержка производителями делают I2C одним из самых популярных интерфейсов для соединения компонентов в электронных устройствах.
Ограничения и недостатки протокола I2C
Несмотря на множество преимуществ, у интерфейса I2C есть ряд ограничений:
- Относительно невысокая скорость передачи данных
- Ограниченная длина линий связи (до нескольких метров)
- Необходимость внешних подтягивающих резисторов
- Сложность работы в условиях сильных электромагнитных помех
- Проблемы при подключении устройств с разным напряжением питания
Эти ограничения следует учитывать при проектировании систем на базе I2C. В ряде случаев могут потребоваться дополнительные схемотехнические решения для преодоления указанных недостатков.
анализ сигналов шины I2C / Хабр
Как я уже неоднократно упоминал в своих публикациях, любительские проекты финансируются из семейного бюджета, и радиолюбитель, обычно, не может себе позволить покупку дорогостоящего измерительного оборудования. Приходится довольствоваться тем, что есть. Или тем, что удаётся взять попользоваться «на время». А иногда от безысходности радиолюбителю приходится «сверлить пилой и пилить буравчиком».
Недавно я испытал потребность выяснить, что на самом деле передаётся в разрабатываемом мной устройстве по шине I2C. Это был тот счастливый момент, когда можно было себе позволить «пилить пилой».
Как происходит обмен данными между устройствами по протоколу I2C можно узнать здесь. Для анализа сигналов на шине I2C можно применить, как цифровой двухканальный осциллограф с памятью, так и логический анализатор.
При работе с радиоэлектронной аппаратурой осциллограф является наиболее универсальным инструментом. Современные цифровые осциллографы обладают рядом полезных свойств, позволяющих производить, в том числе, и анализ сигналов шины I2C.
В данном случае мне достался «на время» цифровой двухканальный осциллограф с памятью Rigol DS1102 (цена на сайте производителя $461). У этого прибора есть два канала измерения с полосой пропускания до 100 MHz и частотой выборки сигнала 1 GSa/s.
К сигналу SCL был подключен Ch2. К сигналу SDA был подключен Ch3. Для обоих каналов был установлен масштаб 1.00 V/дел. Масштаб развёртки – 10 us/дел. Для наглядности луч первого канала смещён в верхнюю половину экрана, а луч второго канала – в нижнюю.
В меню Trigger осциллограф был настроен на однократное измерение с запуском по достижению передним фронтом в канале Ch2 уровня 1.00 V:
После включения тестируемого оборудования была нажата большая красная кнопка Run/Stop. Осциллограф встал в режим ожидания, затем запустился. Через несколько секунд запись была остановлена вручную.
Полученная осциллограмма записывалась на внешний носитель поэкранно:
Произведём разбор записанных сигналов. На первом экране мы видим отображение настроек прибора и осциллограмму сигналов SCL (верхняя часть) и SDA (нижняя часть экрана), на которой читаем слева направо:
- сигнал START: ведущее устройство выставляет низкий уровень сначала на шине SDA, а затем на шине SCL;
- 7-bit адрес: читаем 0x60 (1100000) на шине SDA по передним фронтам SCL;
- признак режима записи: читаем на шине SDA низкий уровень по следующему переднему фронту SCL;
- сигнал ACK: ведущее устройство после передачи байта переключается на приём по шине SDA, на SDA устанавливается высокий уровень, ведомое устройство по заднему фронту SCL выставляет на SDA низкий уровень (собственно, сигнал ACK), который ведущее устройство считывает по переднему фронту SCL;
- сигнал STOP: ведущее устройство выставляет высокий уровень сначала на шине SCL, а затем на шине SDA
Подобным образом, медленно, но верно, можно произвести вручную дешифровку остальных частей записи.
Дешифрацию протокола можно произвести более простым методом, используя логический анализатор и соответствующее программное обеспечение.
Для использования в качестве логического анализатора мне был любезно предоставлен коллегами Saleae Logic 8 (цена на сайте производителя $399). В качестве программного обеспечения использовалась демо-версия Saleae Logic 1.2.18, взятая с официального сайта. Устанавливая данное программное обеспечение, я принял лицензионное соглашение с условием, в том числе, не использовать данное программное обеспечение с оборудованием сторонних производителей.
В программе был включен анализатор протокола I2C. Для сигнала SCL был назначен канал CH0, а для сигнала SDA – канал Ch2. Частота выборки сигнала 24 MSa/s.
Запуск был настроен по «переднему» фронту CH0. Для отображения данных был выбран шестнадцатеричный формат.
После включения тестируемого оборудования была нажата большая зелёная кнопка Start, и через несколько секунд на экран вывелась диаграмма:
Максимум пользы в применении логического анализатора я вижу в том, что программа сама дешифрует полученные данные. Результаты дешифровки заносятся построчно в окно Decoded Protocols. При выборе в окне строки данных, программа показывает расположение этих данных на диаграмме.
Для сравнения вариантов я «склеил» в графическом редакторе четыре снимка экрана осциллографа и фрагмент диаграммы логического анализатора:
Start обозначен зеленым кружочком, Stop – красным кружочком. На диаграмме сначала происходит проверка наличия на шине устройства с адресом 0x60, а затем производится запись в регистр 0xB7 этого устройства значения 0x80.
Если подходить к сравнению вариантов «с пристрастием», то можно заметить, что на диаграмме логического анализатора (частота выборки 24 MSa/s) присутствует «джиттер» сигнала SCL, которого нет, как такового, на осциллограмме с частотой выборки 1 GSa/s. В остальном картина совпадает, а логическим анализатором ещё и производится правильная дешифрация данных в автоматическом режиме.
При выборе «или-или» в «сухом остатке» имеем, в случае осциллографа, дорогое универсальное устройство, не такое удобное для анализа шины, как логический анализатор, но за сопоставимые с ним деньги. В этих условиях лично я, как инженер «старой закалки», приобрёл бы цифровой осциллограф.
Однако, если бы существовало программное обеспечение с лицензионным соглашением, позволяющим использование недорогих клонов популярных логических анализаторов, типа Saleae Logic 8 или DSLogic Plus…
Недорогие клоны популярных логических анализаторов, и не только их, поддерживает программное обеспечение open source проекта sigrok.
Было собрано рабочее место:
После чего начались «танцы с бубном». На Windows 10 запустилась только 32-разрядная версия PulseView. Наличие в системе недорогого китайского клона Saleae Logic (цена на сайте продавца $7) она не определила.
После этого, в Zadig для устройства Logic были установлены драйверы WinUSB, и после повторного сканирования оно определилось в Zadig, как устройство fx2latw:
После этого для устройства fx2latw в Zadig снова были установлены драйверы WinUSB, и только после этого PulseView увидела в списке устройство «Saleae Logic». Устройство было подключено.
После подключения устройства были произведены следующие настройки программы (слева направо по панели инструментов, начиная с надписи «Saleae Logic»):
- выставлено Pre-trigger capture ratio = 2% по нажатию кнопки с ключом и отвёрткой;
- отключены лишние входы по нажатию кнопки с красным щупом;
- выставлен объем записи 100 К выборок;
- выставлена частота выборки 24 MHz;
- включен анализатор протокола I2C по нажатию кнопки с жёлто-зелёным значком.
Далее в панели слева от каналов:
- каналам присвоены соответствующие сигналам текстовые метки;
- условием запуска назначен задний фронт сигнала SDA;
- сигналам I2C назначены соответствующие каналы.
После включения тестируемого оборудования была нажата кнопка Run. Получен уже знакомый результат:
Похоже, «танцы с бубном» того стоили!
UPD: После ручной установки в Диспетчере устройств для устройства USB Logic драйвера libusb-win32 программа PulseView начала стабильно определять наличие в системе «Saleae Logic» без манипуляций с Zadig.
Краткие выводы:
В статье была описана методика проведения анализа сигналов шины I2C с помощью цифрового осциллографа с памятью и логических анализаторов с пакетами прикладного программного обеспечения.
Универсальным методом анализа сигналов, но недешёвым и небыстрым, является применение цифрового осциллографа с памятью.
Быстрым и бюджетным методом анализа сигналов, но с нетривиальной задачей подключения оборудования, является применение недорогого клона логического анализатора в связке с PulseView.
Буду рад, если своей публикацией помог сэкономить читателям время и деньги.
В следующей публикации расскажу, как измерял частоту, на которой запустился кварцевый резонатор в синтезаторе частоты, без частотомера. Но это уже другая история…
Больше информации в моём телеграм-канале «Проект Селенит»
Интерфейсы I2C, SMBus и PMBus
24 января 2022
универсальное применениеAnalog Devicesстатьяинтегральные микросхемыисточники питанияI2Cинтерфейспротокол
Мари Грейс Легаспи, Эрик Пенья (Analog Devices)
I2C (Inter-Integrated Circuit) – широко используемый последовательный протокол связи между микросхемами. Специалисты компании Analog Devices рассматривают его основные функции и описывают протоколы SMBus (System Management Bus) и PMBus (Power Management Bus), основанные на шине I2C, а также приводят различия данных протоколов и раскрывают специфику их использования.
Шина I2C разработана компанией Philips для организации простой связи между компонентами на одной печатной плате. I2C использует всего две двунаправленные линии для передачи и приема информации и является последовательным синхронным интерфейсом, то есть два или более устройств при обмене данными используют общую тактовую линию.
I2C широко применяется для подключения низкоскоростной периферии (светодиодных дисплеев, датчиков и т.д.) к микропроцессорам и микроконтроллерам. В этом интерфейсе есть поддержка подключения нескольких ведомых к одному ведущему и нескольких ведущих к нескольким ведомым. Такая функция полезна для оптимизации работы системы, например, для того, чтобы один микроконтроллер записывал данные на карту памяти и выводил текстовые сообщения на ЖК-дисплей, используя одну и ту же шину.
Кроме популярного стандартного интерфейса I2C, существуют два дополнительных протокола, использующих ту же шину: SMBus и PMBus. Эти протоколы ориентированы на управление системами и устройствами питания и позволяют существенно ускорить процесс разработки.
Описание шины I
2CЗа счет использования последовательной линии данных, линии тактовой частоты и общей земли для всех устройств количество соединений в I2C минимально. Каждое устройство, поддерживающее подключение по I2C, должно иметь два вывода (рисунок 1):
1) SDA – для приема и передачи данных от ведущего к ведомому и наоборот.
2) SCL – для передачи тактового сигнала. Тактовый сигнал всегда генерируется ведущим.
Рис. 1. Подключение микросхем по интерфейсу I2C
Важной частью аппаратной реализации I2C являются подтягивающие резисторы на линиях SDA и SCL (рисунок 2). При отсутствии передачи данных линии шины находятся в высоком состоянии. Устройства с поддержкой I2C подключаются к шине выводами с открытым коллектором и при передаче данных меняют уровни напряжений на шине: с высокого состояния в низкое и наоборот. Биты данных тактируются по спаду тактового импульса.
Рис. 2. Подключение подтягивающих резисторов на шине I2C
Для установки высокого уровня напряжения выводы с открытым коллектором должны быть внешне подтянуты к напряжению питания (VDD). При питании 5 В наиболее часто используются подтягивающие резисторы номиналом 4700 Ом.
I2C является синхронным интерфейсом: передача бит синхронизируется с приемом с помощью тактового сигнала, совместно используемого ведущим и ведомым. Тактовый сигнал всегда исходит от ведущего. Максимальное количество устройств на шине I2C может достигать 27 или 210, однако 16 адресов зарезервированы (таблица 1).
Таблица 1. Зарезервированные адреса I2C
7-битный адрес узла | Значение бита записи/чтения | Назначение |
---|---|---|
0000 000 | 0 | Общий адрес |
0000 000 | 1 | Стартовый байт |
0000 001 | X | Адрес CBUS |
0000 010 | X | Зарезервировано для другого формата передачи |
0000 011 | X | Для будущих задач |
0000 1XX | X | Код ведущего в высокоскоростном режиме |
1111 1XX | X | Для будущих задач |
1111 0XX | X | 10-битный адрес ведомого |
Максимальная длина шины зависит от емкости кабеля и скорости передачи. Например, экранированная витая пара AWG имеет емкость от 100 до 240 пФ/м. При ее использовании максимальная длина шины I2C может составлять до 1 м при скорости 100 кбит/с или 10 м при скорости 10 кбит/с. Неэкранированный кабель обычно имеет гораздо меньшую емкость, но его следует использовать только в экранированном корпусе.
В таблице 2 приведены основные характеристики I2C.
Таблица 2. Основные характеристики I2C
Кол-во линий | Максимальная скорость | Тип интерфейса | Тип передачи | Макс. количество ведущих | Макс. количество ведомых | |||
---|---|---|---|---|---|---|---|---|
2 | Стандартный режим = 100 кбит/с | Скоростной режим = 400 кбит/с | Высоко-скоростной режим = 3,4 Мбит/с | Сверх-скоростной режим = 5 Мбит/с | Синхронный | Последова-тельная | Не ограничено | 1008 |
Данные для передачи по шине I2C разбиваются на кадры и передаются в формате сообщений, показанном на рисунке 3. Сообщение I2C содержит также адресный кадр с двоичным адресом устройства, бит чтения или записи, а также биты подтверждения после каждого кадра.
Рис. 3. Сообщение I2C
Микросхемы с поддержкой I2C должны соответствовать временным характеристикам шины, перечисленным в таблице 3. Для каждой скорости передачи данных определены значения временных параметров, которые должны соблюдаться ведущим и ведомым для корректной передачи данных.
Таблица 3. Временные параметры I2C
Обозначение | Параметр | Единицы измерения |
---|---|---|
fSCL | Тактовая частота | кГц |
tHD(STA) | Время удержания сигналов при начале или повторе передачи | мкс |
tLOW | Период низкого состояния линии SCL | мкс |
tHIGH | Период высокого состояния линии SCL | мкс |
tSU(STA) | Время установки сигналов при повторе передачи | мкс |
tHD(DAT) | Время удержания данных | мкс |
tSU(DAT) | Время установки данных | нс |
tr | Время нарастания сигнала на SDA | нс |
tf | Время спада сигнала на SDA | нс |
tSU(STO) | Время установки сигналов для окончания передачи | мкс |
Протокол передачи I
2CПередача по шине является операцией чтения или записи. Протокол I2C описывает процедуру начала и окончания передачи, повтор сообщения, порядок передачи адреса и данных, а также подтверждение получения.
Передача сообщения всегда инициируется ведущим устройством. Для того, чтобы начать передачу, ведущий переключает линию SDA в низкий уровень до спада тактового импульса на линии SCL (рисунок 4).
Рис. 4. Начало передачи сообщения
После передачи одного сообщения ведущий может снова переключить линию SDA до спада SCL и повторно передать данные. Повтор передачи (рисунок 5) используется для перенаправления данных другому ведомому, для повторной попытки передачи, синхронизации нескольких микросхем или для связи с последовательной памятью.
Рис. 5. Повторная передача
В I2C нет выделенных линий для выбора микросхемы, как в SPI. Для того, чтобы сообщить устройству, что данные отправляются именно ему, используется адресация. Адресный кадр всегда отправляется после процедуры начала передачи в новом сообщении и имеет размер 7 или 10 бит (рисунок 6). Ведущий отправляет адрес всем подключенным к нему устройствам. Каждое устройство сравнивает полученный адрес со своим собственным и при совпадении отправляет ведущему бит подтверждения (ACK) низкого уровня. Если адрес не совпадает, устройство ничего не делает, и линия SDA остается в высоком состоянии.
Рис. 6. Адресный кадр сообщения
В конце адресного кадра отправляется бит, который задает операцию чтения или записи. Если ведущий собирается записать данные в устройство, отправляется нулевой бит, при чтении отправляется единица (рисунок 7).
Рис. 7. Бит чтения/записи
После каждого кадра в сообщении на шине ожидается бит подтверждения ACK. Если адресный кадр или кадр данных был успешно получен, то возвращается бит подтверждения (на рисунках 4…9 этот бит обозначен белым).
После получения бита подтверждения отправляется первый кадр данных. Кадр данных всегда имеет длину 8 бит и отправляется старшим битом вперед. После каждого кадра ожидается бит подтверждения, чтобы удостовериться в успешном получении данных (рисунок 8).
Рис. 8. Кадр данных
После передачи всех кадров данных ведущий проводит процедуру окончания передачи. Для этого ведущий переводит линию SDA с низкого состояния в высокое после установки тактового сигнала в высокий уровень (рисунок 9). Линия SCL остается в высоком состоянии.
Рис. 9. Окончание передачи
Операция записи на I
2CНа рисунке 10 представлена временная диаграмма передачи данных по I2C при записи.
Рис. 10. Передача по I2C при записи
Пошаговая последовательность действий при операции записи следующая:
1) Ведущий инициирует начало передачи для всех подключенных устройств, переключая линию SDA с высокого состояния в низкое перед спадом сигнала на SCL.
2) Ведущий отправляет всем 7- или 10-битный адрес устройства вместе с битом записи. Например, при 7-битном адресе устройства 0x2D ведущий, добавив нулевой бит записи, отправляет на шину 0x5A.
3) Каждое устройство на шине сравнивает адрес, отправленный ведущим, со своим собственным. Если адрес совпадает, устройство возвращает бит подтверждения ACK, переключая линию SDA в низкое состояние на девятом такте SCL. Если адрес не совпадает, устройство оставляет линию SDA в высоком состоянии.
4) Ведущий отправляет кадры данных: указатель адреса для записи (ADDR) и сами данные.
5) После передачи каждого кадра данных ведомое устройство возвращает ведущему нулевой бит подтверждения ACK, обозначая успешное получение кадра либо единичный бит NACK при сбое записи.
6) Для окончания передачи ведущий переключает линию SCL в высокое состояние после нарастания сигнала на линии SDA.
Операция чтения на I
2CНа рисунке 11 показана передача данных при операции чтения по I2C.
Рис. 11. Передача по I2C при чтении
Пошаговая последовательность действий при операции чтения следующая:
1) Ведущий инициирует начало передачи для всех подключенных устройств, переключая линию SDA с высокого состояния в низкое перед спадом сигнала на SCL.
2) Ведущий отправляет всем 7- или 10-битный адрес устройства вместе с битом записи. Например, при 7-битном адресе устройства 0x2D ведущий, добавив нулевой бит записи, отправляет на шину 0x5A.
3) Каждое устройство на шине сравнивает адрес, отправленный ведущим, со своим собственным. Если адрес совпадает, устройство возвращает бит подтверждения ACK, переключая линию SDA в низкое состояние на девятом такте SCL. Если адрес не совпадает, устройство оставляет линию SDA в высоком состоянии.
4) После передачи и подтверждения указателя адреса для чтения (ADDR) ведущий повторно инициирует передачу.
5) Ведущий отправляет всем 7- или 10-битный адрес устройства вместе с битом чтения. Например, при 7-битном адресе устройства 0x2D ведущий, добавив единичный бит чтения, отправляет на шину 0x5B.
6) Каждое устройство на шине сравнивает адрес, отправленный ведущим, со своим собственным. Если адрес совпадает, устройство возвращает бит подтверждения ACK, переключая линию SDA в низкое состояние на девятом такте SCL. Если адрес не совпадает, устройство оставляет линию SDA в высоком состоянии.
7) После подтверждения ведущий считывает кадр данных от ведомого устройства.
8) После получения каждого кадра данных ведущий возвращает нулевой бит подтверждения ACK ведомому, обозначая успешное получение кадра либо единичный бит NACK при сбое считывания.
9) Для окончания передачи ведущий переключает линию SCL в высокое состояние после нарастания сигнала на линии SDA.
Арбитраж на шине I
2CАдресация протокола I2C позволяет управлять несколькими устройствами от одного ведущего. При 7-битном адресе доступно 128 (27) уникальных адресов. Использование 10-битного адреса встречается реже. Для подключения нескольких устройств к шине на линиях SDA и SCL необходимы подтягивающие резисторы 4,7 кОм. Кроме этого, к одному или нескольким устройствам можно подключить несколько ведущих. Чтобы исключить ситуацию, когда несколько ведущих одновременно используют линию SDA, каждый ведущий должен отслеживать состояние линии SDA перед передачей сообщения. Если линия SDA в низком состоянии, то шиной уже управляет другой ведущий, и необходимо дождаться окончания передачи. Для подключения нескольких ведущих используется схема, показанная на рисунке 12.
Рис. 12. Подключение нескольких ведущих к ведомым
Однако есть вероятность, что два ведущих начнут передачу одновременно. Тогда, если ведущий обнаруживает низкое состояние на линии данных в момент передачи высокого уровня, он прекращает передачу, считая, что активен другой ведущий. Такой процесс называется арбитражем. То есть, как только ведущие пытаются установить на линии разные логические уровни, побеждает тот ведущий, который задает сигнал низкого уровня, другие ведущие прекращают передачу. Если логические уровни от ведущих совпадают, ничего не происходит.
Такая процедура арбитража проста и эффективна:
1) Победивший ведущий продолжает передачу без прерывания, потому что нет испорченных данных, нет конфликтов на шине, нет необходимости перезапускать передачу сообщения.
2) Теоретически проигравший может прослушивать адрес ведомого во время арбитража и корректно отвечать.
3) Если ведущие запрашивают данные у одного и того же устройства, процесс арбитража не прерывает передачу, так как несоответствие не будет обнаружено, и ведомый будет передавать данные на шину сразу для нескольких ведущих.
Задержка тактового сигнала
Тактовая частота всегда генерируется ведущим и синхронизирует обмен данными между ведущим и ведомым. Спецификация I2C не регламентирует каких-либо тайм-аутов на тактовый сигнал, то есть любое устройство на шине может удерживать линию SCL в низком состоянии неограниченное время. Такая процедура называется задержкой тактового сигнала и полезна в случаях, когда ведомое устройство не может сразу отправить ответные данные и снижает скорость шины, удерживая линию SCL в низком состоянии. Например, ведомому микроконтроллеру или какому-либо другому обрабатывающему устройству может потребоваться дополнительное время для обработки прерывания, приема данных и для выполнения каких-либо функций. В таком случае ведущий считывает состояние SCL и дожидается, когда ведомый вернет линию в высокое состояние. Для более простых устройств, например, EEPROM, задержка частоты не требуется, так как они не выполняют обработку данных.
Задержка тактового сигнала может значительно снизить общую пропускную способность шины. Необходимо это учитывать, чтобы сохранить надежность передачи и скорость обмена данными, особенно при подключении нескольких устройств на одну шину.
Регистры I
2CТехническое описание и регистры I2C в документации различных микросхем могут отличаться в зависимости от производителя. На рисунке 13 показан пример описания микроконтроллера с поддержкой I2C, а в таблице 4 приведены основные регистры интерфейса. Названия регистров и их описания могут быть другими, однако их назначение и использование – общее для всех устройств.
Рис. 13. Регистры памяти микроконтроллера
Таблица 4. Описание регистров I2C
Название | Описание |
---|---|
I2C_ADDR1 | Первый байт адреса ведущего |
I2C_ADDR2 | Второй байт адреса ведущего |
I2C_BYT | Стартовый байт |
I2C_ID | Адрес ведомого |
I2C_MCTL | Регистр управления ведущим |
I2C_MRX | Данные, полученные ведущим |
I2C_SCTL | Регистр управления ведомым |
I2C_SRX | Данные, полученные ведомым |
I2C_STAT | Статус FIFO ведомого или ведущего |
Программная реализация I2C варьируется в зависимости от задачи. В таблице 5 показан пример основных составляющих API-драйвера I2C.
Таблица 5. Программная реализация I2C
На стороне ведущего | На стороне ведомого |
---|---|
Инициализация | |
Обработчик приема данных (Tx Handler) | Обработчик приема данных (Tx Handler) |
Обработчик передачи данных (Rx Handler) | Обработчик передачи данных (Rx Handler) |
Прерывание по событию | |
Прерывание по ошибке |
Описание протокола SMBus
SMBus как правило используется в компьютерных материнских платах и встроенных системах и имеет расширенную спецификацию для мониторинга температуры, напряжения питания, управления вентиляторами и встроенными микросхемами. Шина SMBus аналогична I2C и имеет две линии: линию тактовой частоты SMBCLK и линию данных SMBDAT (рисунок 14). I2C и SMBus совместимы, однако имеют значительные отличия:
1) Пороги логических уровней SMBus фиксированы и не пропорциональны напряжению питания устройств, что позволяет устройствам с разным питанием работать на одной и той же шине. Например, на одной шине SMBus могут быть устройства с питанием 1,8; 3,3 и 5 В.
2) Обе шины работают со скоростью до 100 кГц, но I2C имеет варианты на 400 кГц и 2 МГц.
3) Для повышения надежности шины SMBus регламентирует минимальную тактовую частоту и ограничивает количество тактов, которое можно задержать при передаче одного сообщения. При нарушении этого ограничения устройства перезапускают шину, сбрасывая свои выводы. Таймаут SMBus составляет 35 мс при минимальной тактовой частоте 10 кГц.
4) В SMBus есть проверка ошибок в пакетах. Байт кода ошибки добавляется в конце каждого сообщения.
5) Также есть ряд различий, включающий типы передачи, линию оповещения, линию приостановки и включение/отключение питания.
Устройства на шине SMBus должны отправлять подтверждение каждый раз в ответ на получение своего адреса независимо от своей занятости. Это гарантирует, что ведущий сможет точно определить, какие устройства активны на шине. Все посылки на шине регламентируются различными спецификациями протокола SMBus. Опционально SMBus может иметь дополнительный сигнал SMBALERT#, который используется ведомыми для уведомления ведущего о появлении новой информации или, например, для быстрого оповещения о неисправности.
Рис. 14. Подключение на шине SMBus
Адреса в протоколе SMBus имеют длину 7 бит и обычно выражаются в бинарном формате, например, 0110 110b. К этим 7 битам добавляется один бит чтения/записи. Ведущий может отправлять искомый адрес на одно или несколько устройств (в случае широковещательной передачи).
На рисунке 15 представлен формат сообщения SMBus. Начало и окончание передачи происходит по фронтам и спадам сигналов на линиях шины, поэтому они обозначены без количества битов.
Рис. 15. Сообщение SMBus
В таблице 6 перечислены отображенные также на рисунке 16 временные параметры шины, которые регламентирует спецификация SMBus.
Таблица 6. Временные параметры SMBus
Обозначение | Параметр | Единицы измерения |
---|---|---|
fSMB | Рабочая частота SMBus | кГц |
tBUF | Время между окончанием передачи и началом новой передачи | мкс |
THD-STA | Время удержания сигналов при начале или повторе передачи | мкс |
TSU-STA | Время установки сигналов при повторе передачи | мкс |
tSU(STO) | Время установки сигналов при окончании передачи | мкс |
tHD(DAT) | Время удержания данных | нс |
tSU(DAT) | Время установки данных | нс |
tTIMEOUT | Таймаут низкого состояния тактовой линии | мс |
tLOW | Полупериод низкого состояния тактовой линии | мкс |
tHIGH | Полупериод высокого состояния тактовой линии | мкс |
Рис. 16. Временная диаграмма передачи данных на шине SMBus
Описание протокола PMBus
В дополнение к SMBus существует протокол PMBus. PMBus – это открытый стандарт управления питанием, который является гибким и универсальным средством для обмена данными между устройствами в цифровом или аналоговом виде. PMBus обеспечивает полную совместимость устройств, упрощая их подключение и сокращая время разработки систем.
PMBus используется для подключения источников питания с функциями управления. В этом протоколе есть поддержка команд и описаны структуры, наиболее часто используемые в задачах управления питанием. Например, протокол PMBus предоставляет команду для установки и считывания значений перенапряжений, что является одной из важнейших задач в управлении питания. Протокол работает поверх шин SMBus и I2C и дополняет их функциональность. То есть, I2C и PMBus совместимы по электрическим параметрам и семантике команд. Однако спецификация I2C описывает только физический уровень, синхронизацию и управление потоком данных на шине. I2C не описывает формат сообщений, в отличие от SMBus, и не описывает содержание сообщений, в отличие от PMBus. Другими словами, PMBus добавляет транспортный уровень сети, регламентируя передачу битов и байтов и их значение.
Реализация PMBus
Для систем с резервированием можно использовать до трех сигналов для установки адреса источника питания. В случае остальных систем для адресации используются два сигнала, а указатель адреса начинается со значения B0h. В таблице 7 представлены возможные коды адресов в PMBus.
Таблица 7. Адресация PMBus
Используемые адреса | Основная адресация, используемая для большинства источников питания с двумя адресными выводами | Дополнительные адреса для источников питания с тремя адресными выводами | ||||||
---|---|---|---|---|---|---|---|---|
Адресация в системе: Адрес2/ Адрес1/ Адрес0 | 0/0/0 | 0/0/1 | 0/1/0 | 0/1/1 | 1/0/0 | 1/0/1 | 1/1/0 | 1/1/1 |
Адрес устройства PMBus | B0h/B1h | B2h/B3h | B4h/B5h | B6h/B7h | B8h/B9h | BAh/BBh | BCh/BDh | BEh/BFh |
Подключенные к шине источники питания должны быть совместимы со спецификацией SMBus 2. 0 для высокого напряжения. Шина должна работать при напряжении питания 3,3 В.
Схему подключения к PMBus необходимо питать от отдельного выхода источника. В случае систем с резервированием питание должно подаваться от одного из нескольких параллельно подключенных источников. Внутри источников на линиях SCL или SDA могут быть подключены подтягивающие резисторы небольших номиналов. Основные подтягивающие резисторы устанавливаются внешне и подтягивают линии к напряжению 3,3 или 5 В.
Источник питания с PMBus должен поддерживать максимальную скорость SMBus 100 кбит/с и по возможности не использовать функцию задержки тактовой частоты, так как это замедляет работу шины.
Заключение
SMBus изначально разработан для облегчения разработки систем управления питанием. Этот протокол использует шину I2C и дополняет ее спецификациями более высокого уровня, которые позволяют заменять устройства на шине без перезагрузки всей системы. PMBus в свою очередь расширяет возможности SMBus, добавляя в протокол набор команд для управления источниками питания и предоставляя пользователю такие атрибуты устройств как напряжение, ток, температура и т. д. В общем случае, устройства поддержкой I2C, SMBus или PMBus могут использовать одну и ту же шину совместно без каких-либо существенных проблем.
Все три протокола широко используются и имеют следующие преимущества:
- Использование только двух проводов для подключения;
- Наличие подтверждения получения сообщений;
- Возможность подключения нескольких ведущих и нескольких ведомых на одну шину;
- Простота аппаратной реализации (проще, чем UART).
Недостатком протоколов является ограничение кадра данных 8 битами. Кроме того, эти протоколы работают при более низкой скорости передачи данных и имеют более сложный физический уровень в сравнении с интерфейсом SPI.
I2C, SMBus и PMBus применяются для работы с различными датчиками, EEPROM, тачскринами, для соединения микроконтроллеров и для отладки, в управлении питанием, а также в бытовой технике.
В таблице 8 представлены общие технические характеристики всех трех протоколов I2C, SMBus и PMBus: используемые сигналы, временные и электрические параметры.
Таблица 8. Сравнительные параметры I2C, SMBus и PMBus.
Параметр | I2C | SMBus | PMBus | |
---|---|---|---|---|
Высокая мощность питания | Низкая мощность питания | |||
Проверка ошибок в пакете (Опционально) | – | – | – | – |
Сигнал SMBALERT (Опционально) | – | – | – | – |
Ограничение на размер блока | – | 32 байта | 32 байта | 255 байта |
Скорость данных: | 100 кбит/с | 100 кбит/с | 100 кбит/с | 100 кбит/с |
• Стандартный режим | 400 кбит/с | – | – | 400 кбит/с |
• Скоростной режим | 1 Мбит/с | – | – | – |
• Высокоскоростной режим | 3,4 Мбит/с | – | – | – |
• Сверхскоростной режим | 0 Гц…3,4 МГц | 10…100 кГц | 10…100 кГц | 10…400 кГц |
Период тактовой частоты | 25…35 мс | 25…35 мс | 25…35 мс | |
Таймаут на шине | – | 50 мкс | 50 мкс | 50 мкс |
Задержка запроса от ведущего на шине (мин. ) | – | – | – | – |
Время удержания SCL (макс.) | – | 2 мс | 2 мс | 2 мс |
Время удержания данных (мин.) | – | 300 нс | 300 нс | 300 нс |
Емкость нагрузки на шине (макс.) | 400 пФ | 400 пФ | – | 400 пФ |
Время нарастания сигналов (макс.) | 1 мкс при 100 кГц, 300 нс при 400 кГц | 1 мкс | 1 мкс | 1 мкс при 100 кГц, 300 нс при 400 кГц |
Подтягивающий ток при 0,4 В (макс.) | 3 мA (standard and fast mode) | 4 мA | 350 мкA | 4 мA |
Ток утечки через устройство (макс.) | ±10 мкA | ±10 мкA | ±5 мкA | ±10 мкA |
Напряжение порога логического нуля входного сигнала (макс.) | 0,3 VDD или 1,5 В | 0,8 В | 0,8 В | 0,8 В |
Напряжение порога логической единицы входного сигнала (мин. ) | 0,7 VCC или 3 В | 2,1 В | 2,1 В | 2,1 В |
Напряжение порога логического нуля выходного сигнала (макс.) | 0,4 В | 2,4 В | 0,4 В | 0,4 В |
Оригинал статьи
Перевела Софья Букреева по заказу АО Компэл
•••
Последовательный периферийный интерфейс (SPI) — SparkFun Learn
- Домашний
- Учебники
- Последовательный периферийный интерфейс (SPI)
≡ Страниц
Авторы: Майк Грузин
Избранное Любимый 91
Введение
Последовательный периферийный интерфейс (SPI) — это интерфейсная шина, обычно используемая для передачи данных между микроконтроллерами и небольшими периферийными устройствами, такими как сдвиговые регистры, датчики и SD-карты. Он использует отдельные линии часов и данных, а также линию выбора для выбора устройства, с которым вы хотите общаться.
Рекомендуемая литература
Вещи, которые было бы полезно знать перед чтением этого руководства:
Последовательная связь
Концепции асинхронной последовательной связи: пакеты, уровни сигнала, скорость передачи данных, UART и многое другое!
Избранное Любимый 101
Двоичный
Двоичный код — это система счисления в электронике и программировании… так что, должно быть, важно учиться. Но что такое двоичный код? Как это переводится в другие системы счисления, такие как десятичная?
Избранное Любимый 52
Сдвиговые регистры
Знакомство со сдвиговыми регистрами и возможными вариантами их использования.
Избранное Любимый 45
Логические уровни
Узнайте разницу между устройствами 3,3 В и 5 В и логическими уровнями.
Избранное Любимый 83
Что не так с последовательными портами?
Общий последовательный порт с линиями TX и RX называется «асинхронным» (не синхронным), потому что нет контроля над отправкой данных или какой-либо гарантии того, что обе стороны работают с одинаковой скоростью. Поскольку компьютеры обычно полагаются на то, что все синхронизируется с одними «часами» (основной кристалл, подключенный к компьютеру, который управляет всем), это может стать проблемой, когда две системы с немного разными часами пытаются взаимодействовать друг с другом.
Чтобы обойти эту проблему, асинхронные последовательные соединения добавляют к каждому байту дополнительные стартовые и стоповые биты, помогающие получателю синхронизировать данные по мере их поступления. Обе стороны также должны заранее согласовать скорость передачи (например, 9600 бит в секунду). Небольшие различия в скорости передачи не являются проблемой, поскольку приемник повторно синхронизируется в начале каждого байта.
(Кстати, если вы заметили, что «11001010» не равно 0x53 на приведенной выше диаграмме, слава вашему вниманию к деталям. Последовательные протоколы часто отправляют младшие биты первыми, поэтому самый младший бит находится в крайнем левом углу. Младший полубайт фактически равен 0011 = 0x3, а старший полубайт равен 0101 = 0x5.)
Асинхронный последовательный порт работает просто отлично, но имеет много накладных расходов как из-за дополнительных стартовых и стоповых битов, отправляемых с каждым байтом, так и из-за сложного оборудования, необходимого для отправки и получения данных. И, как вы, вероятно, заметили в своих собственных проектах, если обе стороны не настроены на одинаковую скорость, полученные данные будут мусором. Это связано с тем, что приемник производит выборку битов в строго определенное время (стрелки на приведенной выше диаграмме). Если приемник смотрит на неправильное время, он увидит неправильные биты.
Синхронное решение
SPI работает несколько иначе. Это «синхронная» шина данных, что означает, что она использует отдельные линии для данных и «часы», которые поддерживают идеальную синхронизацию обеих сторон. Тактовый сигнал представляет собой колебательный сигнал, который сообщает приемнику, когда именно нужно производить выборку битов на линии данных. Это может быть нарастающий (от низкого к высокому) или спадающий (от высокого к низкому) фронт тактового сигнала; таблица данных укажет, какой из них использовать. Когда приемник обнаруживает этот фронт, он немедленно смотрит на строку данных, чтобы прочитать следующий бит (см. стрелки на диаграмме ниже). Поскольку часы отправляются вместе с данными, указание скорости не имеет значения, хотя устройства будут иметь максимальную скорость, на которой они могут работать (мы немного обсудим выбор правильного фронта часов и скорости).
Одной из причин популярности SPI является то, что принимающее оборудование может быть простым сдвиговым регистром. Это гораздо более простая (и дешевая!) аппаратная часть, чем полноценный UART (универсальный асинхронный приемник/передатчик), который требуется для асинхронного последовательного интерфейса.
Получение данных
Вы можете подумать про себя, что это прекрасно для односторонней связи, но как отправить данные обратно в обратном направлении? Здесь все становится немного сложнее.
В SPI только одна сторона генерирует тактовый сигнал (обычно называемый CLK или SCK для Serial ClocK). Сторона, которая генерирует часы, называется «контроллером», а другая сторона называется «периферией». Всегда есть только один контроллер (это почти всегда ваш микроконтроллер), но может быть несколько периферийных устройств (подробнее об этом чуть позже).
Когда данные отправляются с контроллера на периферийное устройство, они отправляются по линии данных, называемой PICO, для «периферийного входа / выхода контроллера». Если периферийному устройству необходимо отправить ответ обратно контроллеру, контроллер продолжит генерировать заранее установленное количество тактовых циклов, а периферийное устройство поместит данные в третью линию данных, называемую POCI, для «периферийного выхода / контроллера».
Обратите внимание, что в приведенном выше описании мы сказали «предварительно подготовленные». Поскольку контроллер всегда генерирует тактовый сигнал, он должен заранее знать, когда периферийное устройство должно вернуть данные и сколько данных будет возвращено. Это сильно отличается от асинхронного последовательного соединения, когда случайные объемы данных могут быть отправлены в любом направлении в любое время. На практике это не проблема, так как SPI обычно используется для связи с датчиками, которые имеют очень специфическую структуру команд. Например, если вы отправляете команду «чтение данных» на устройство, вы знаете, что устройство всегда будет отправлять вам, например, два байта в ответ. (В тех случаях, когда вам может понадобиться вернуть переменный объем данных, вы всегда можете вернуть один или два байта, указав длину данных, а затем получить контроллер полностью.)
Обратите внимание, что SPI является «полным дуплексом» (имеет отдельные линии передачи и приема), и, таким образом, в определенных ситуациях вы можете одновременно передавать и получать данные (например, запрашивая новое показание датчика при получении данные предыдущего). В техническом описании вашего устройства будет указано, возможно ли это.
Выбор чипа (CS)
Есть еще одна строка, о которой вы должны знать, она называется CS для выбора чипа. Это сообщает периферийному устройству, что оно должно проснуться и получать/отправлять данные, а также используется, когда присутствует несколько периферийных устройств, чтобы выбрать тот, с которым вы хотите поговорить.
Линия CS обычно имеет высокий уровень, что отключает периферийное устройство от шины SPI. (Этот тип логики известен как «активный низкий уровень», и вы часто увидите, как он используется для линий включения и сброса.) Непосредственно перед отправкой данных на периферийное устройство линия устанавливается в низкий уровень, что активирует периферийное устройство. Когда вы закончите использовать периферийное устройство, линия снова станет высокой. В сдвиговом регистре это соответствует входу «защелки», который передает полученные данные на выходные линии.
Несколько периферийных устройств
Существует два способа подключения нескольких периферийных устройств к шине SPI:
- Обычно для каждого периферийного устройства требуется отдельная линия CS. Чтобы поговорить с определенным периферийным устройством, вы установите линию CS этого периферийного устройства на низкий уровень, а остальные — на высокий (вы не хотите, чтобы два периферийных устройства были активированы одновременно, иначе они оба могут попытаться поговорить по одной и той же линии POCI, что приведет к в искаженных данных). Для множества периферийных устройств потребуется много линий CS; если у вас мало выходов, есть чипы двоичного декодера, которые могут умножить ваши выходы CS.
- С другой стороны, некоторые части предпочитают соединяться последовательно, когда POCI (выход) одного идет на PICO (вход) следующего. В этом случае одна линия CS идет на всех периферийных устройств. Как только все данные отправлены, линия CS поднимается, что приводит к одновременной активации всех чипов. Это часто используется для сдвиговых регистров с гирляндной цепочкой и адресуемых драйверов светодиодов.
Обратите внимание, что для этой схемы данные передаются от одного периферийного устройства к другому, поэтому для отправки данных на любой одно периферийное устройство , вам потребуется передать достаточно данных, чтобы достичь всех из них. Кроме того, имейте в виду, что первый фрагмент данных, который вы передаете, попадет в последний периферийный модуль.
Этот тип компоновки обычно используется только в ситуациях вывода, например, для управления светодиодами, когда вам не нужно получать какие-либо данные обратно. В этих случаях вы можете оставить линию POCI контроллера отключенной. Однако, если данные необходимо вернуть на контроллер, вы можете сделать это, замкнув гирляндную петлю (синий провод на приведенной выше схеме). Обратите внимание, что если вы сделаете это, возвращаемые данные с периферийного устройства 1 должны будут пройти через 9.0075 все периферийные устройства, прежде чем вернуться к контроллеру, поэтому обязательно отправьте достаточно команд приема, чтобы получить необходимые данные.
Программирование для SPI
Многие микроконтроллеры имеют встроенные периферийные устройства SPI, которые обрабатывают все детали отправки и получения данных и могут делать это на очень высоких скоростях. Протокол SPI также достаточно прост, чтобы вы (да, вы!) могли написать свои собственные процедуры для манипулирования линиями ввода-вывода в надлежащей последовательности для передачи данных. (Хороший пример находится на странице SPI в Википедии.)
Если вы используете Arduino, есть два способа связи с устройствами SPI:
Вы можете использовать команды shiftIn() и shiftOut(). Это программные команды, которые будут работать с любой группой контактов, но будут несколько медленными.
Или вы можете использовать библиотеку SPI, которая использует преимущества аппаратного обеспечения SPI, встроенного в микроконтроллер. Это намного быстрее, чем приведенные выше команды, но будет работать только на определенных выводах.
При настройке интерфейса вам нужно будет выбрать некоторые параметры. Эти параметры должны соответствовать параметрам устройства, с которым вы разговариваете; проверьте техническое описание устройства, чтобы узнать, что для этого требуется.
Интерфейс может отправлять данные, начиная со старшего бита (MSB) или младшего бита (LSB). В библиотеке Arduino SPI это контролируется функцией setBitOrder().
Периферийное устройство будет считывать данные либо по переднему, либо по заднему фронту тактового импульса. Кроме того, часы могут считаться «бездействующими», когда они высокие или низкие. В библиотеке Arduino SPI обе эти опции управляются функцией setDataMode().
SPI может работать на очень высоких скоростях (миллионы байт в секунду), что может быть слишком быстро для некоторых устройств. Для размещения таких устройств можно настроить скорость передачи данных. В библиотеке Arduino SPI скорость устанавливается функцией setClockDivider(), которая делит тактовую частоту контроллера (16 МГц на большинстве плат Arduino) до частоты от 8 МГц (/2) до 125 кГц (/128).
Если вы используете библиотеку SPI, вы должны использовать предоставленные контакты SCK, PICO и POCI, так как аппаратное обеспечение привязано к этим контактам. Существует также выделенный вывод CS, который вы можете использовать (который должен, по крайней мере, быть установлен на выход, чтобы аппаратное обеспечение SPI функционировало), но обратите внимание, что вы можете использовать любые другие доступные выходные выводы для CS для ваши периферийные устройства.
На старых Arduino вам нужно будет самостоятельно управлять контактами CS, установив на одном из них низкий уровень перед передачей данных и высокий уровень после него. Более новые Arduino, такие как Due, могут автоматически управлять каждым выводом CS как часть передачи данных; см. страницу документации Due SPI для получения дополнительной информации.
Хотите узнать больше об основных темах?
Полный список основных тем, связанных с электротехникой, см. на нашей странице Engineering Essentials .
Отведи меня туда!
Ресурсы и дальнейшее развитие
Советы и рекомендации
Из-за высокой скорости сигналов SPI следует использовать только для передачи данных на короткие расстояния (до нескольких футов). Если вам нужно отправить данные дальше, уменьшите тактовую частоту и рассмотрите возможность использования специализированных микросхем драйверов.
Если что-то работает не так, как вы думаете, вам поможет логический анализатор. Интеллектуальные анализаторы, такие как USB Logic Analyzer от Saleae, могут даже декодировать байты данных для отображения или регистрации.
Преимущества SPI:
Это быстрее, чем асинхронный последовательный
Приемное оборудование может быть простым сдвиговым регистром
Поддерживает несколько периферийных устройств
Недостатки SPI:
Требуется больше сигнальных линий (проводов), чем для других методов связи
Связь должна быть четко определена заранее (вы не можете отправлять случайные объемы данных в любое время)
Контроллер должен контролировать все коммуникации (периферийные устройства не могут общаться друг с другом напрямую)
Обычно для каждого периферийного устройства требуются отдельные линии CS, что может быть проблематично, если требуется несколько периферийных устройств.
Дополнительная литература
Посетите страницу Википедии, посвященную SPI, которая содержит много полезной информации о SPI и других синхронных интерфейсах.
На этой странице представлен более правильный способ настройки сети SPI между вашими встраиваемыми устройствами, особенно для использования с микроконтроллером Arduino.
Некоторые продукты SparkFun имеют интерфейсы SPI. Например, комплект Bar Graph Breakout имеет простой в использовании интерфейс SPI, который можно использовать для включения или выключения любого из 30 светодиодов.
Другие варианты связи:
Последовательная связь
Концепции асинхронной последовательной связи: пакеты, уровни сигнала, скорость передачи данных, UART и многое другое!
Избранное Любимый 101
Аналого-цифровое преобразование
Мир аналоговый. Используйте аналого-цифровое преобразование, чтобы помочь цифровым устройствам интерпретировать мир.
Избранное Любимый 58
I2C
Введение в I2C, один из основных встроенных коммуникационных протоколов, используемых сегодня.
Избранное Любимый 130
AST-CAN485 Руководство по подключению
AST CAN485 — это миниатюрная Arduino в компактном форм-факторе ProMini. В дополнение ко всем обычным функциям он имеет встроенные порты CAN и RS485, позволяющие быстро и легко подключаться к множеству промышленных устройств.
Избранное Любимый 10
Теперь, когда вы стали профессионалом в области SPI, вот еще несколько учебных пособий для отработки новых навыков:
Использование последовательного 7-сегментного дисплея
Как быстро и легко настроить последовательный 7-сегментный дисплей и последовательный 7-сегментный экран дисплея.
Избранное Любимый 14
Руководство по подключению SparkFun BME280
Руководство по подключению датчика BME280 к микроконтроллеру и использованию библиотеки SparkFun Arduino.
Избранное Любимый 1
Учебное пособие по SPI и I2C для Raspberry Pi
Узнайте, как использовать последовательные шины I2C и SPI на Raspberry Pi, используя библиотеку ввода-вывода wirePi для C/C++ и spidev/smbus для Python.
Избранное Любимый 24
I2C Primer: что такое I2C? (Часть 1)
к Сал Афзал
Введение:
Шина Inter-Integrated Circuit (I 2 C) представляет собой двухпроводной последовательный интерфейс, первоначально разработанный корпорацией Phillips для использования в потребительских товарах. Это двунаправленная шина, которая легко реализуется в любом процессе ИС (NMOS, CMOS, биполярный) и обеспечивает простую связь между ИС. Соединения сведены к минимуму за счет использования последовательной линии передачи данных (SDA), последовательной линии синхронизации (SCL) и общего заземления для передачи всех сообщений. I 2 C получил широкое признание и даже послужил прототипом шины управления системой (SMBus), которая является подмножеством I 2 С.
Дизайн
I 2 Протокол связи C соответствует иерархии ведущий/ведомый, в которой ведущий определяется как устройство, которое синхронизирует шину, обращается к ведомым устройствам и записывает или считывает данные в регистры ведомых устройств и из них. Ведомые устройства — это устройства, которые отвечают только на запрос ведущего через свой уникальный адрес. Следовательно, крайне важно избегать дублирования адресов среди ведомых устройств. Ведомые устройства никогда не инициируют передачу данных.
Я 2 Шина C использует только две двунаправленные линии: последовательную линию передачи данных (SDA) и последовательную линию синхронизации (SCL). I 2 C-совместимые устройства подключаются к шине с открытым коллектором или штырями с открытым стоком, которые переводят линию в НИЗКИЙ уровень. Когда нет передачи данных, I 2 C линии шины находятся в состоянии HIGH; линии пассивно тянутся высоко.
Передача происходит путем переключения линий путем нажатия на НИЗКИЙ уровень и отпускания ВЫСОКИЙ. Биты тактируются по спаду тактовых импульсов. Стандартная скорость передачи данных составляет 100 кбит/с, а скорость передачи в быстром режиме — 400 кбит/с.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36684.png?la=en&w=435′ alt=’Рисунок 1: Обобщенная схема подключения I2C’>
Рис. 1: Обобщенная схема I 2 C
Шина I 2 C может поддерживать несколько устройств, как ПОДЧИНЕННЫХ, так и ГЛАВНЫХ, и единственным ограничением является емкость шины (400 пФ) и адресное пространство (128 уникальных адресов) по мере добавления новых устройств.
Протокол передачи данных
I 2 C Пакеты данных организованы в виде 8-битных байтов, содержащих адрес подчиненного устройства, номер регистра и данные для передачи. Передача по шине представляет собой операцию чтения или записи. Протоколы чтения и записи основаны на ряде подпротоколов, таких как условия запуска и остановки, повторяющиеся стартовые биты, адресный байт, биты передачи данных и биты подтверждения/неподтверждения.
Условия запуска и остановки
Как следует из названия, условие запуска всегда возникает в начале передачи и инициируется ГЛАВНЫМ устройством. Это делается для пробуждения бездействующих устройств SLAVE на шине. Это один из двух случаев, когда линии SDA разрешено изменять состояние при высоком уровне SCL. Чтобы обозначить условие запуска, линия SDA переходит из состояния HIGH в состояние LOW, а SCL находится в состоянии HIGH.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36685.png?la=en&w=435′ alt=’Рис. 2. Переходы между условиями начала и окончания’>
Рисунок 2. Переходы между условиями запуска и остановки
Подобно начальному условию, остановочное условие возникает в конце передачи данных и также генерируется ГЛАВНЫМ. Это означает конец передачи и является командой, сообщающей ведомым устройствам, что они должны вернуться в состояние ожидания, освободить линию SDA и больше не отправлять данные по шине. Это второй случай, когда линии SDA разрешено изменять состояние, когда SCL находится в состоянии HIGH. Линия SDA переходит из состояния LOW в состояние HIGH, в то время как SCL находится в состоянии HIGH, чтобы обозначить состояние остановки.
Во всех остальных случаях линия SDA изменяет состояние только тогда, когда линия SCL имеет НИЗКИЙ уровень.
Повторный запуск
Условие запуска может повторяться во время передачи без необходимости предварительного завершения условием остановки. Это особый случай, называемый повторным запуском, и он используется для изменения направления передачи данных, повторения попыток передачи, синхронизации нескольких ИС или даже управления последовательной памятью.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36686.png?la=en&w=435′ alt=’Рисунок 3: Повторное начальное условие, по сути, является начальным условием в середине транзакции I2 C без предшествующего StopCondition’>
Рис. 3. Повторяющееся условие запуска — это, по сути, условие запуска в середине транзакции I 2 C без предшествующего условия остановки
Байт адреса
Адрес подчиненного устройства отправляется в 8-битном байтовом формате, старший бит идет первым, но последний бит указывает, будет ли транзакция читать или писать подчиненному устройству. По сути, старшие 7 бит составляют адрес ведомого устройства, а 8-й бит служит битом команды READ/WRITE#. Таким образом, существует адресное пространство из 128 уникальных адресов для адресации до 128 ведомых устройств. Часто раз.
Например, после условия запуска ГЛАВНЫЙ отправляет байт адреса, который соответствует уникальному адресу ВЕДОМОГО устройства на шине. Каждое устройство на шине имеет свои фиксированные или запрограммированные адреса. ПОДЧИНЕННЫЕ устройства на шине I 2 C реагируют на команду запуска, активно прослушивая первые семь битов первого отправленного байта. Если первые семь битов совпадают с адресом ВЕДОМОГО устройства, он продолжает чтение 8-го бита (бит READ/WRITE#) байта адреса. Все остальные ПОДЧИНЕННЫЕ устройства игнорируют оставшуюся часть транзакции. НИЗКИЙ бит в бите READ/WRITE# указывает, что ГЛАВНЫЙ будет записывать данные на адресованное ВЕДОМОЕ устройство, а высокий МАСТЕР будет считывать данные с ВЕДОМОГО устройства. Как только адресный байт будет прочитан соответствующим ПОДЧИНЕННЫМ устройством, он подтвердит эту передачу, отправив бит подтверждения, установив НИЗКИЙ уровень SDA в течение смежного периода ВЫСОКОГО импульса тактового сигнала, а затем примет на себя роль подчиненного передатчика или подчиненного получателя в зависимости от СЧИТЫВАНИЯ. Бит /WRITE# отправлен.
Начиная с этого момента и далее, если не отправлен стоповый бит, ПОДЧИНЕННОЕ устройство предполагает, что, поскольку оно уже адресовано, все коммуникации направляются на него.
Биты подтверждения и не подтверждения (ACK/NACK)
В качестве обратной связи после передачи каждого байта принимающее устройство отправляет бит подтверждения или неподтверждения. Бит подтверждения генерируется приемником, удерживая линию SDA в низком уровне в течение периода HIGH SCL, в то время как бит Not Acknowledge генерируется, когда приемник оставляет линию SDA пассивно поднятой на HIGH и никак не реагирует. Этот факт подразумевает, что в ответ на байт адреса все несопоставленные SLAVE посылают бит Not Acknowledge, не отвечая.
ACK используется для обозначения того, что байт (адрес или данные) был успешно передан и получен и что передача может продолжаться до следующей передачи байта, состояния остановки или повторного запуска (рис. 4). NACK обычно используется приемником, чтобы указать, произошла ли где-то ошибка при передаче данных. Это используется для подачи сигнала передающему устройству немедленно прекратить передачу или сделать еще одну попытку, отправив повторное начало.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part-1-/ 36687.png?w=435 ‘ alt=’Рисунок 4: Начальное условие, за которым следует 7-битный адрес 0x64 и набор команд записи. Подчиненный отвечает подтверждением.’>
Рис. 4. Условие запуска, за которым следует 7-битный адрес 0 × 64 и набор команд записи. Ведомый отвечает подтверждением.
ГЛАВНЫЙ также пошлет NACK после последнего байта передачи, который он хочет прочитать от ВЕДОМОГО, чтобы указать, что ВЕДОМЫЙ должен прекратить передачу.
Биты данных
Биты данных кодируют фактически передаваемые данные и передаются в 8-битном байтовом формате, начиная с MSB, и каждый бит синхронизируется с тактовым сигналом (SCL). Количество байтов в передаче не ограничено, но за каждым байтом должно следовать подтверждение, которое генерируется получателем данных.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36688.png?la=en&w=435′ alt=’Рисунок 5: Битовый переход битов данных’&gt;
Рисунок 5: Битовый переход битов данных
Для передачи битов данные на линии SDA должны оставаться стабильными в течение периода ВЫСОКОГО тактового сигнала. Линия данных может иметь переход HIGH или LOW только тогда, когда тактовый сигнал LOW. Таким образом, приемник считывает бит данных на линии данных, пока SCL имеет ВЫСОКИЙ уровень, а передатчик устанавливает каждый новый бит данных, пока SCL имеет НИЗКИЙ уровень.
Командный байт
При записи или чтении из определенного регистра в SLAVE, мастер должен сначала указать на конкретный регистр, записав адрес регистра после обращения к SLAVE. Хотя адрес регистра можно рассматривать как байт данных, во избежание путаницы его часто классифицируют как командный байт. См., например, рис. 6 и 7.
Запись на устройство
На Рисунке 6 показана адресация передатчика MASTER и запись данных на приемник SLAVE с 7-битным адресом. Первым отправленным битом является бит START, который инициирует обмен данными. Байт адреса следует за последующими тактовыми импульсами. В этот момент времени все ПОДЧИНЕННЫЕ устройства на шине прослушивают адрес своего устройства, который составляет первые семь бит байта адреса. ПОДЧИНЕННОЕ устройство, обнаружившее совпадение адресов, продолжает прослушивать последний бит (бит READ/WRITE#), чтобы понять, хочет ли ведущий читать с подчиненного устройства или записывать на него. Все остальные ПОДЧИНЕННЫЕ устройства игнорируют дальнейшую связь, отправляя NACK, который по определению ничего не делает.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part-1-/ 36689.png?w=435 ‘ alt=’Рисунок 6: Успешная передача байта записи I2C’>
Рисунок 6: Успешная передача байта записи I2C
В ответ на распознавание своего адреса и команду записи адресованное устройство отвечает отправкой бита подтверждения (ACK) в качестве обратной связи ВЕДУЩЕМУ устройству о том, что на шине присутствует ПОДЧИНЕННОЕ устройство с правильным адресом и ожидает дальнейшей связи. Затем MASTER продолжает передачу данных, отправляя данные в байтовом формате. Если ГЛАВНЫЙ записывает в определенный регистр в ВЕДОМОМ устройстве, то он записывает соответствующий командный байт перед отправкой данных. После каждой передачи байта SLAVE отвечает отправкой ACK. Как только ГЛАВНЫЙ заканчивает передачу всех данных, он завершает передачу, отправляя условие СТОП.
Чтение с устройства
На рис. 7 показано, как ГЛАВНОЕ обращается к ВЕДОМОМУ и пытается прочитать данные из него. Передача снова инициируется МАСТЕРОМ с условием СТАРТ, после чего адрес передается в последующих тактовых импульсах. Адресованное устройство продолжает прослушивать передачу, читая бит READ/WRITE, и отвечает битом подтверждения. Как только SLAVE отправляет подтверждение, он берет на себя управление SDA и отправляет данные MASTER. В ответ на каждый переданный байт МАСТЕР отправляет бит подтверждения. Когда MASTER больше не хочет получать данные, он отвечает NACK после последнего байта, который он хочет получить, а затем возобновляет управление шиной и отправляет условие STOP для завершения передачи.
Обратите внимание, что в то время как управление линией SDA передается от ГЛАВНОГО к ПОДЧИНЕННОМУ и обратно, линия SCL ВСЕГДА контролируется ГЛАВНЫМ, т. е. данные постоянно поступают и выводятся ГЛАВНЫМ.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36690.png?la=en&w=435′ alt=’Рисунок 7: Успешная передача чтения I2C’&gt;
Рисунок 7: Успешный I 2 C Чтение передачи
Объединение протоколов передачи
Можно комбинировать протоколы чтения и записи в различных вариациях для выполнения некоторых сложных I 2 C транзакций. ГЛАВНЫЙ может записывать, а затем считывать с того же ведомого или давать новый адрес для связи с другим ПОДЧИНЕННЫМ устройством в рамках одной транзакции I 2 C, данные могут изменить направление таким образом, что устройство, на которое выполнялась запись, теперь считывание данных. Все это достигается с помощью бита Repeated Start.
Например, LTC2946, который является монитором энергопотребления, может получить команду на вывод данных из определенного регистра. Для этого требуется транзакция I 2 C, которая сначала обращается к LTC2946, отправляет байт команды (байт данных, содержащий определенный адрес регистра для чтения), выполняет повторный запуск, снова отправляет адрес устройства с установленным битом READ, а затем считывает данные. В этой транзакции мастер сначала писал в LTC2946, сообщая ему, из какого регистра он хочет прочитать данные, а затем направление потока данных менялось, когда ГЛАВНЫЙ выполнял повторный запуск с битом ЧТЕНИЕ, установленным в байте адреса ВЕДОМОГО. Рисунок 8 взят из LTC29.46 и показывает этот общий протокол.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36691.png?la=en&w=435′ alt=’Рисунок 8: Протокол чтения байтов SDA последовательной шины LTC2946’&gt;
Рис. 8. Протокол чтения байтов SDA последовательной шины LTC2946
Где
- S = стартовый бит
- P = Стоповый бит
- Ч = Чтение бита
- W\ = бит записи
- А = Подтвердить
- A\ = Не подтверждать
На рис. 9 показан пример записи в регистр в LTC2946. После условия запуска отправляется адрес устройства, а затем байт команды записывается в ведомое устройство (обратите внимание на бит READ/WRITE#). Как только ведомое устройство подтверждает, данные записываются в SLAVE.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36692.png?la=en&w=435′ alt=’Рисунок 9: Последовательная запись главного устройства в два разных подчиненных устройства’&gt;
Рис. 9. Ведущее устройство последовательно записывает данные в два разных подчиненных устройства
Аналогично.