3#if defined(ESP_PLATFORM)
6#include "driver/i2c_master.h"
7#include "roo_backport.h"
8#include "roo_backport/byte.h"
13class Esp32I2cMasterBusHandle {
17 Esp32I2cMasterBusHandle(i2c_port_num_t i2c_port = 0)
18 : bus_handle_(0), frequency_(0), i2c_port_(i2c_port) {}
21 void init(
int sda,
int scl, uint32_t frequency = 0) {
22 i2c_master_bus_config_t config = {
23 .i2c_port = i2c_port_,
24 .sda_io_num = (gpio_num_t)sda,
25 .scl_io_num = (gpio_num_t)scl,
26 .clk_source = I2C_CLK_SRC_DEFAULT,
27 .glitch_ignore_cnt = 7,
28 .flags = {.enable_internal_pullup =
true},
31 ESP_ERROR_CHECK(i2c_new_master_bus(&config, &bus_handle_));
32 frequency_ = frequency;
36 friend class Esp32I2cSlaveDevice;
38 i2c_master_bus_handle_t resolveBusHandle() {
39 if (bus_handle_ == 0) {
40 ESP_ERROR_CHECK(i2c_master_get_bus_handle(i2c_port_, &bus_handle_));
45 i2c_port_num_t i2c_port_;
46 i2c_master_bus_handle_t bus_handle_;
50class Esp32I2cSlaveDevice {
52 Esp32I2cSlaveDevice(Esp32I2cMasterBusHandle bus_handle, uint8_t slave_address)
53 : bus_handle_(bus_handle), slave_address_(slave_address) {}
56 i2c_device_config_t dev_cfg = {
57 .dev_addr_length = I2C_ADDR_BIT_LEN_7,
58 .device_address = slave_address_,
60 bus_handle_.frequency_ > 0 ? bus_handle_.frequency_ : 100000,
63 ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle_.resolveBusHandle(),
64 &dev_cfg, &dev_handle_));
67 bool transmit(
const roo::byte* data,
size_t len) {
68 return i2c_master_transmit(dev_handle_, (
const uint8_t*)data, len, -1) ==
72 size_t receive(roo::byte* data,
size_t len) {
73 if (i2c_master_receive(dev_handle_, (uint8_t*)data, len, -1) != ESP_OK) {
80 Esp32I2cMasterBusHandle bus_handle_;
81 uint8_t slave_address_;
82 i2c_master_dev_handle_t dev_handle_;
Defines 140 opaque HTML named colors.