23 static constexpr int PIN_NO_CHANGE = -1;
25 ESP32I2C(i2c_port_t port_num,
int scl_pin,
int sda_pin,
26 uint32_t clock_speed = 400000U,
27 bool enable_internal_pullup =
true,
28 uint32_t timeout_ms = 100U,
29 uint32_t isr_enable_min_size = 32U);
32 bool in_isr =
false)
override;
35 bool in_isr =
false)
override;
41 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
42 bool in_isr =
false)
override;
46 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
47 bool in_isr =
false)
override;
49 i2c_port_t Port()
const {
return port_num_; }
52 static constexpr size_t kFifoLen = SOC_I2C_FIFO_LEN;
53 static constexpr size_t kMaxWritePayload = (kFifoLen > 4U) ? (kFifoLen - 4U) : 0U;
54 static constexpr size_t kMaxWriteReadPrefix =
55 (kFifoLen > 5U) ? (kFifoLen - 5U) : 0U;
56 static constexpr size_t kMaxReadPayload = (kFifoLen > 4U) ? (kFifoLen - 4U) : kFifoLen;
64 ErrorCode ResolveClockSource(uint32_t& source_hz);
67 bool ShouldUseInterruptAsync(
size_t total_size)
const;
68 static size_t MemAddrBytes(MemAddrLength mem_addr_size);
69 static void EncodeMemAddr(uint16_t mem_addr,
size_t mem_len, uint8_t* out);
70 ErrorCode ExecuteTransaction(uint16_t slave_addr,
const uint8_t* write_payload,
71 size_t write_size, uint8_t* read_payload,
73 ErrorCode StartAsyncTransaction(uint16_t slave_addr,
74 const uint8_t* write_prefix_payload,
75 size_t write_prefix_size,
76 const uint8_t* write_payload,
size_t write_size,
77 uint8_t* read_payload,
size_t read_size,
80 void FinishAsync(
bool in_isr,
ErrorCode ec);
81 static bool IsValid7BitAddr(uint16_t addr);
83 static void I2cIsrEntry(
void* arg);
84 void HandleInterrupt();
89 bool enable_internal_pullup_;
91 uint32_t isr_enable_min_size_;
92 bool initialized_ =
false;
94 i2c_hal_context_t hal_ = {};
95 uint32_t source_clock_hz_ = 0U;
97 intr_handle_t intr_handle_ =
nullptr;
98 bool intr_installed_ =
false;
100 bool async_running_ =
false;
102 uint16_t async_slave_addr_ = 0U;
103 std::array<uint8_t, 2> async_write_prefix_ = {};
104 size_t async_write_prefix_size_ = 0U;
105 size_t async_write_prefix_offset_ = 0U;
106 const uint8_t* async_write_payload_ =
nullptr;
107 size_t async_write_size_ = 0U;
108 size_t async_write_offset_ = 0U;
109 uint8_t* async_read_payload_ =
nullptr;
110 size_t async_read_size_ = 0U;
111 size_t async_read_offset_ = 0U;
112 size_t async_pending_read_chunk_ = 0U;
113 bool async_write_phase_done_ =
true;
114 bool async_write_addr_sent_ =
false;
115 bool async_write_stop_sent_ =
false;
116 bool async_read_addr_sent_ =
false;
ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data, WriteOperation &op, MemAddrLength mem_addr_size=MemAddrLength::BYTE_8, bool in_isr=false) override
向 I2C 设备指定寄存器写入数据。 Writes data to a specific register of an I2C device.
ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation &op, bool in_isr=false) override
向 I2C 设备写入数据。 Writes data to an I2C device.
ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation &op, bool in_isr=false) override
读取 I2C 设备的数据。 Reads data from an I2C device.
ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data, ReadOperation &op, MemAddrLength mem_addr_size=MemAddrLength::BYTE_8, bool in_isr=false) override
从 I2C 设备指定寄存器读取数据。 Reads data from a specific register of an I2C device.