ESPShell для Arduino :: I2C

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

ШИНА 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.