roo_display
API Documentation for roo_display
Loading...
Searching...
No Matches
i2c.h
Go to the documentation of this file.
1#pragma once
2
3#if defined(ESP_PLATFORM)
4
5#include "driver/i2c.h"
6#include "driver/i2c_master.h"
7#include "roo_backport.h"
8#include "roo_backport/byte.h"
9
10namespace roo_display {
11
12// I2C master bus reference, capturing the specified i2c_port.
13class Esp32I2cMasterBusHandle {
14 public:
15 // Creates the I2C master bus handle that references the specified esp-idf bus
16 // handle.
17 Esp32I2cMasterBusHandle(i2c_port_num_t i2c_port = 0)
18 : bus_handle_(0), frequency_(0), i2c_port_(i2c_port) {}
19
20 // Should not be called after resolveBusHandle().
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},
29 };
30
31 ESP_ERROR_CHECK(i2c_new_master_bus(&config, &bus_handle_));
32 frequency_ = frequency;
33 }
34
35 private:
36 friend class Esp32I2cSlaveDevice;
37
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_));
41 }
42 return bus_handle_;
43 }
44
45 i2c_port_num_t i2c_port_;
46 i2c_master_bus_handle_t bus_handle_;
47 uint32_t frequency_;
48};
49
50class Esp32I2cSlaveDevice {
51 public:
52 Esp32I2cSlaveDevice(Esp32I2cMasterBusHandle bus_handle, uint8_t slave_address)
53 : bus_handle_(bus_handle), slave_address_(slave_address) {}
54
55 void init() {
56 i2c_device_config_t dev_cfg = {
57 .dev_addr_length = I2C_ADDR_BIT_LEN_7,
58 .device_address = slave_address_,
59 .scl_speed_hz =
60 bus_handle_.frequency_ > 0 ? bus_handle_.frequency_ : 100000,
61 };
62
63 ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle_.resolveBusHandle(),
64 &dev_cfg, &dev_handle_));
65 }
66
67 bool transmit(const roo::byte* data, size_t len) {
68 return i2c_master_transmit(dev_handle_, (const uint8_t*)data, len, -1) ==
69 ESP_OK;
70 }
71
72 size_t receive(roo::byte* data, size_t len) {
73 if (i2c_master_receive(dev_handle_, (uint8_t*)data, len, -1) != ESP_OK) {
74 return 0;
75 }
76 return len;
77 }
78
79 private:
80 Esp32I2cMasterBusHandle bus_handle_;
81 uint8_t slave_address_;
82 i2c_master_dev_handle_t dev_handle_;
83};
84
85} // namespace roo_display
86
87#endif // defined(ESP_PLATFORM)
Defines 140 opaque HTML named colors.