Команды I2C позволяют настроить интерфейс I2C на произвольных пинах, просканировать шину на наличие устройств и выполнять операции чтения/записи с выбранными устройствами. Это упрощает работу с новыми I2C-устройствами, проверку их доступности и разработку библиотек: можно отправлять тестовые последовательности в устройство без перекомпиляции всего скетча.
ESP32 имеет два аппаратных интерфейса I2C. Назначение пинов по умолчанию зависит от модели: например, у чипа ESP32-WROOM-32D пины для I2C0 — это 21 (SDA) и 22 (SCL).
Для настройки или доступа к интерфейсу 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
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.