Обмен по шине I²C всегда устроен одинаково: условие START, байт адреса с битом направления, байты данных — каждый с подтверждением — и условие STOP. Инструмент собирает такую транзакцию для записи, чтения и чтения регистра, показывает её по тактам SCL и SDA, считает время и даёт код для Arduino и STM32.
Коротко
- Байт адреса: 7 бит адреса и бит R/W: 0 — запись, 1 — чтение; 0x76 даёт 0xEC и 0xED.
- Байт: 8 бит старшим вперёд и девятый такт подтверждения; ACK — SDA в нуле, NACK — в единице.
- Чтение регистра: запись номера регистра, повторный START, адрес с R/W = 1, чтение; последний байт — NACK, затем STOP.
- 10-битный адрес: первый байт 11110XX + R/W, второй — младшие 8 бит.
- Время: 9 тактов SCL на байт плюс времена START и STOP по таблице 11 UM10204.
Как пользоваться
Выберите операцию. «Запись» передаёт байты данных устройству; без данных получится проверка адреса — так работает сканер шины. «Чтение» сразу принимает байты от ведомого. «Чтение регистра» сначала записывает номер регистра, а затем после повторного START читает. Адрес вводится в шестнадцатеричном виде, как в даташитах; если ввести байт адреса вроде 0xEC, инструмент подскажет 7-битный адрес.
Результат — транзакция одной строкой, байты адреса для записи и чтения, число тактов и наименьшее время обмена на выбранной частоте. Ниже — диаграмма SCL и SDA, таблица шагов и код. Переключатель «Нет на шине» показывает, что видит ведущий, когда устройство не отвечает: NACK на байте адреса и STOP. Все параметры хранятся в адресе страницы.
Из чего состоит транзакция
| Элемент | Кто формирует | Как выглядит на линиях |
|---|---|---|
| START (S) | ведущий | SDA падает, пока SCL в единице |
| Байт адреса | ведущий | 7 бит адреса и R/W, старшим битом вперёд |
| ACK | приёмник байта | на девятом такте SDA в нуле |
| Данные | передатчик: ведущий при записи, ведомый при чтении | 8 бит старшим вперёд, SDA меняется только при низком SCL |
| NACK | приёмник байта | на девятом такте SDA остаётся в единице |
| Повторный START (Sr) | ведущий | START без STOP перед ним: шина остаётся занятой |
| STOP (P) | ведущий | SDA поднимается, пока SCL в единице |
Байт адреса для 7-битного адреса и бита направления :
Для 10-битного адреса первый байт — , второй — . Чтение 10-битного устройства начинается с записи обоих байтов: после повторного START передаётся только первый байт с , и ведомое, уже узнавшее свой адрес, отвечает.
Время обмена
Каждый байт занимает 9 тактов SCL. Наименьшее время транзакции из байтов на частоте :
где — число повторных START. Времена условий — минимальные значения из таблицы 11 UM10204:
| Параметр | Standard-mode, до 100 кГц | Fast-mode, до 400 кГц | Fast-mode Plus, до 1000 кГц |
|---|---|---|---|
| tHD;STA — удержание START (и повторного START) до первого такта | 4 мкс | 0,6 мкс | 0,26 мкс |
| tLOW — низкий уровень SCL | 4,7 мкс | 1,3 мкс | 0,5 мкс |
| tHIGH — высокий уровень SCL | 4 мкс | 0,6 мкс | 0,26 мкс |
| tSU;STA — установка повторного START | 4,7 мкс | 0,6 мкс | 0,26 мкс |
| tSU;STO — установка STOP | 4 мкс | 0,6 мкс | 0,26 мкс |
| tBUF — свободная шина между STOP и START | 4,7 мкс | 1,3 мкс | 0,5 мкс |
Чтение регистра BME280 — 4 байта и один повторный START: на 100 кГц это не меньше 360 + 4,0 + 8,7 + 4,0 = 376,7 мкс, на 400 кГц — 90 + 2,4 = 92,4 мкс. Реальный обмен длиннее: ведомое может растягивать такт, а программа — делать паузы между байтами. Между STOP и следующим START шина ещё должна побыть свободной не меньше .
Адреса микросхем и зарезервированные адреса
Инструмент сверяет введённый адрес с таблицей популярных микросхем из статьи об I²C — все адреса в ней 7-битные и проверены по даташитам:
| Микросхема | Назначение | Адрес | Чем задаётся |
|---|---|---|---|
| AT24C02, AT24C256 и другие EEPROM серии 24 | память | 0x50–0x57 | выводы A2–A0; у AT24C неподключённые выводы внутри притянуты к нулю, тогда адрес 0x50. У AT24C16 адресных выводов нет: эти три бита — старшие биты адреса ячейки памяти, и микросхема занимает все восемь адресов |
| DS1307 | часы реального времени | 0x68 | фиксирован; только 100 кГц |
| DS3231 | часы реального времени | 0x68 | фиксирован |
| PCF8574 | расширитель портов, модули LCD 1602 | 0x20–0x27 | выводы A2–A0 |
| PCF8574A | расширитель портов, модули LCD 1602 | 0x38–0x3F | выводы A2–A0 |
| SSD1306 | контроллер OLED-дисплея | 0x3C или 0x3D | вывод SA0 (он же D/C#) |
| BMP280, BME280 | давление, температура, влажность | 0x76 или 0x77 | вывод SDO: земля — 0x76, питание — 0x77; оставлять в воздухе нельзя |
| MPU-6050 | акселерометр и гироскоп | 0x68 или 0x69 | вывод AD0 |
| ADS1115 (ADS1113, ADS1114) | АЦП 16 бит | 0x48–0x4B | вывод ADDR на GND, VDD, SDA или SCL |
| INA219 | монитор тока и мощности | 0x40–0x4F | выводы A1 и A0, каждый на GND, VS+, SDA или SCL — 16 адресов |
| PCA9685 | 16-канальный ШИМ | 0x40–0x7F | выводы A5–A0; 0x70 по умолчанию занят групповым адресом LED All Call |
| BH1750 | датчик освещённости | 0x23 или 0x5C | вывод ADDR: низкий — 0x23, высокий — 0x5C |
| SHT30, SHT31, SHT35 | температура и влажность | 0x44 или 0x45 | вывод ADDR; оставлять в воздухе нельзя |
| TCA9548A | мультиплексор I²C на 8 каналов | 0x70–0x77 | выводы A2–A0 |
Две группы адресов зарезервированы спецификацией (таблица 4 UM10204), обычные устройства их не занимают:
| Адрес (7 бит) | R/W | Назначение |
|---|---|---|
| 0000 000 (0x00) | 0 | общий вызов (general call) |
| 0000 000 (0x00) | 1 | START-байт |
| 0000 001 (0x01) | любой | адрес шины CBUS |
| 0000 010 (0x02) | любой | для шин другого формата |
| 0000 011 (0x03) | любой | резерв на будущее |
| 0000 1XX (0x04–0x07) | любой | код ведущего High-speed mode |
| 1111 1XX (0x7C–0x7F) | 1 | Device ID |
| 1111 0XX (0x78–0x7B) | любой | первый байт 10-битного адреса |
Ограничения
- Режимы High-speed (до 3,4 МГц) и Ultra Fast-mode здесь не считаются: у них свои условия и тайминги.
- Байты, которые выдаёт ведомый, заранее неизвестны: на диаграмме они показаны полосой, в строке транзакции — как «??».
- Растягивание такта, арбитраж нескольких ведущих, общий вызов и START-байт не моделируются.
- Код для Arduino и STM32 — для 7-битных адресов. Библиотека Wire в Arduino на AVR читает за один вызов не больше 32 байт, а HAL_I2C_Mem_Read принимает номер регистра из одного или двух байтов.
Частые вопросы
Чем 7-битный адрес I2C отличается от 8-битного?
Адрес устройства — 7 бит, а первый байт на шине — это адрес, сдвинутый на разряд влево, плюс бит R/W. Для датчика с адресом 0x76 байт записи — 0xEC, байт чтения — 0xED. Библиотека Wire в Arduino принимает 7-битный адрес, HAL для STM32 — уже сдвинутый: 0x76 << 1. Если в документации стоит пара вроде 0x4E/0x4F или число больше 0x7F, это байты, а адрес — их значение, делённое на два.
Почему последний прочитанный байт подтверждается NACK?
Так ведущий-приёмник сообщает ведомому, что больше байтов не нужно: на девятом такте он оставляет SDA в единице, и ведомый освобождает линию. Это пятая из причин NACK в UM10204 (раздел 3.1.6). Сразу после NACK ведущий формирует STOP или повторный START. Если подтвердить последний байт ACK, ведомый начнёт выдавать следующий и может удержать SDA в нуле, помешав STOP.
Зачем повторный START при чтении регистра?
Чтобы прочитать регистр, ведущий сначала записывает его номер, а потом меняет направление обмена на чтение. Повторный START (Sr) делает это, не освобождая шину: никакой другой ведущий не вклинится между записью номера и чтением. В UM10204 это комбинированный формат (рисунок 13). В Arduino его даёт endTransmission(false), в STM32 HAL — функция HAL_I2C_Mem_Read.
Как устроен 10-битный адрес I2C?
Первый байт — 11110, два старших бита адреса и бит R/W; второй — восемь младших бит. Для чтения ведущий передаёт оба байта с R/W = 0, затем повторный START и только первый байт, уже с R/W = 1 (рисунок 15 UM10204). Для адреса 0x2A5 это байты 0xF4 и 0xA5, а после Sr — 0xF5.
Сколько времени занимает обмен по I2C?
Каждый байт занимает 9 тактов SCL: 8 бит и подтверждение. Чтение регистра BME280 — четыре байта, 36 тактов: 360 мкс на 100 кГц и 90 мкс на 400 кГц. К этому добавляются времена условий START, повторного START и STOP — по таблице 11 UM10204 ещё не меньше 16,7 мкс в Standard-mode и 2,4 мкс в Fast-mode. Растягивание такта ведомым и паузы программы увеличивают время.
Какие адреса I2C нельзя занимать?
Таблица 4 UM10204 резервирует две группы по восемь адресов: 0x00–0x07 (общий вызов, START-байт, CBUS, другой формат шины, резерв и коды ведущего High-speed mode) и 0x78–0x7F (первый байт 10-битного адреса и Device ID).
Источники
- NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.4 — START, повторный START и STOP; 3.1.5 — байт из 8 бит старшим вперёд с битом подтверждения; 3.1.6 — ACK и NACK; 3.1.10 и рис. 9–13 — адрес и R/W, запись, чтение, комбинированный формат; 3.1.11 и рис. 14–15 — 10-битная адресация; 3.1.12 и табл. 4 — зарезервированные адреса; табл. 11 — времена SCL и SDA
- sigrok project. sigrok-test: decoder/test/i2c — расшифровки записей шины: часы DS1307 на 200 кГц (rtc_ds1307_200khz) и инициализация контроллера Wii Nunchuk (wii_nunchuk_init); по ним проверены порядок байтов, ACK и NACK
- Даташиты микросхем из таблицы адресов — те же, что в статье об I²C: Microchip AT24C02C, AT24C16C, AT24C256C; Maxim DS1307, DS3231, DS3231M; Solomon Systech SSD1306; Bosch Sensortec BMP280 и BME280; InvenSense MPU-6000/6050; TI ADS1115, INA219, TCA9548A; NXP PCF8574, PCA9685; ROHM BH1750FVI; Sensirion SHT3x-DIS
- Arduino. ArduinoCore-avr, библиотека Wire (Wire.h, Wire.cpp) — endTransmission(false) — повторный START вместо STOP, requestFrom, буфер BUFFER_LENGTH = 32 байта
- STMicroelectronics. STM32F4 HAL, драйвер stm32f4xx_hal_i2c.c — HAL_I2C_Master_Transmit, HAL_I2C_Master_Receive, HAL_I2C_Mem_Read; адрес ведомого передаётся сдвинутым на разряд влево
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/i2c-transaction/" title="Транзакция I²C по байтам" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/i2c-transaction/">Транзакция I²C по байтам</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено . Нашли ошибку в расчёте? Напишите нам.