### [ На русском ] ↔ [ English ]

- Шина I2C на ESP32
- Инициализация и завершение работы I2C
- Сканирование устройств
- Отправка и приём данных
- Примеры: доступ к RTC и EEPROM

## ⇮ШИНА I2C

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

ESP32 имеет два аппаратных интерфейса I2C. Назначение пинов по умолчанию зависит от модели: например, у чипа ESP32-WROOM-32D пины для I2C0 — это 21 (SDA) и 22 (SCL).

## ⇮I2C: НАСТРОЙКА, ЧТЕНИЕ, ЗАПИСЬ И СКАНИРОВАНИЕ

Для настройки или доступа к интерфейсу I2C используется команда "iic I2C_NUM", где I2C_NUM — номер интерфейса. После выполнения команды приглашение ESPShell сменится на "esp32-i2c0>", что означает переход в режим конфигурации I2C. Для выхода из этого режима используйте команду "exit" или нажмите `Ctrl+Z`.

В режиме конфигурации I2C доступны 6 команд: (Также можно использовать команды из основного дерева, например, "pin" доступна и внутри "esp32-i2c>")

      esp32#>iic 0
      esp32-i2c>?
      % Enter "? command" to get details about the command.
      % List of available commands:
      %
      % "?"        : Show the list of available commands
      % "up"       : Initialize interface (pins and speed)
      % "clock"    : Set clock speed
      % "read"     : Read data from a device
      % "down"     : Shut down I2C interface
      % "scan"     : Scan I2C bus
      % "write"    : Send bytes to the device
      % "exit"     : Exit
      esp32-i2c>

Все команды (кроме "up") требуют предварительной инициализации интерфейса. Для этого используется команда "up", принимающая три аргумента: пин SDA, пин SCL и частоту тактирования (в Гц).

Например, чтобы инициализировать I2C0 с частотой 100 кГц на пинах 21 (SDA) и 22 (SCL):

      esp32#>iic 0
      esp32-i2c>up 21 22 100000

После инициализации шины можно выполнять команды чтения, записи и сканирования. Рекомендуется приостановить выполнение основного скетча, чтобы избежать конфликтов (см. команды "suspend" и "resume"). Для завершения работы шины используйте команду "down".

Просканируем шину I2C. В этом примере к I2C0 подключены два устройства:

      esp32#>iic 0
      esp32-i2c>up 21 22 100000
      esp32-i2c>scan
      % Scanning I2C bus 0...
      % Device found at address 57
      % Device found at address 68
      % 2 devices found
      esp32-i2c>

Эти два устройства — часы реального времени DS3231 и EEPROM на 64К, размещённые на одной плате и подключённые к пинам 21 и 22.

Теперь пообщаемся с чипом часов и прочитаем текущее время. Мы воспользуемся командами "write" и "read", чтобы запросить и получить данные:

      esp32-i2c>write 0x68 0
      % Sending 1 byte over I2C0
      esp32-i2c>read 0x68 7
      % I2C0 received 7 bytes:
      24 25 22 03 18 09 24                < -- hexadecimal values

Принятые байты представляют текущее время: 22:25:24, третий день недели, 18 сентября 2024. Имея даташит на устройство, можно легко расшифровать и отправлять собственные команды — полезно при разработке библиотеки для нового I2C-устройства.

Для удобства необязательно использовать префикс "0x": вместо "0x98" можно просто ввести "98", ввод трактуется как шестнадцатеричный.

        esp32-i2c>write 0x68 0x11 0x12 0x13

эквивалентно

        esp32-i2c>write 0x68 11 12 13

## ⇮Пример: чтение из EEPROM (адрес 57)

      esp32#>iic 0
      esp32-i2c>up 21 22 100000
      esp32-i2c>scan
      % Scanning I2C bus 0...
      % Device found at address 57
      % Device found at address 68
      % 2 devices found
      esp32-i2c>write 0x57 0 0
      % Sending 2 bytes over I2C0
      esp32-i2c>read 57 56
      % I2C0 received 56 bytes:
            0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F   |0123456789ABCDEF
      ----------------------------------------------------------+----------------
      0000: de ad be ef  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  |...............
      0010: 10 22 33 44  55 66 77 88  99 aa bb cc  1c 1d 1e 1f  |."3DUfw.........
      0020: 20 21 22 23  24 25 26 27  28 29 2a 2b  2c 2d 2e 2f  | !"#$%&'()*+,-./
      0030: 30 31 32 33  34 35 36 37                            |01234567
      esp32-i2c0>

ПРИМЕЧАНИЕ: если размер запрошенных данных превышает 16 байт, вывод форматируется, как показано выше.

Команда "clock" используется для изменения частоты I2C. Например, "clock 150000" установит частоту 150 кГц. Максимально поддерживаемое значение — 1 МГц.

Команда "down" завершает работу интерфейса I2C.

Для выхода из режима конфигурации I2C используйте команду "exit" или `Ctrl+Z`.