22 static constexpr int PIN_NO_CHANGE = -1;
24 ESP32I2C(i2c_port_t port_num,
int scl_pin,
int sda_pin, uint32_t clock_speed = 400000U,
25 bool enable_internal_pullup =
true, uint32_t timeout_ms = 100U,
26 uint32_t isr_enable_min_size = 32U);
29 bool in_isr =
false)
override;
32 bool in_isr =
false)
override;
38 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
39 bool in_isr =
false)
override;
43 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
44 bool in_isr =
false)
override;
46 i2c_port_t Port()
const {
return port_num_; }
49 static constexpr size_t FIFO_LEN = SOC_I2C_FIFO_LEN;
50 static constexpr size_t MAX_WRITE_PAYLOAD = (FIFO_LEN > 4U) ? (FIFO_LEN - 4U) : 0U;
51 static constexpr size_t MAX_WRITE_READ_PREFIX = (FIFO_LEN > 5U) ? (FIFO_LEN - 5U) : 0U;
52 static constexpr size_t MAX_READ_PAYLOAD = (FIFO_LEN > 4U) ? (FIFO_LEN - 4U) : FIFO_LEN;
60 ErrorCode ResolveClockSource(uint32_t& source_hz);
63 bool ShouldUseInterruptAsync(
size_t total_size)
const;
64 static size_t MemAddrBytes(MemAddrLength mem_addr_size);
65 static void EncodeMemAddr(uint16_t mem_addr,
size_t mem_len, uint8_t* out);
66 ErrorCode ExecuteTransaction(uint16_t slave_addr,
const uint8_t* write_payload,
67 size_t write_size, uint8_t* read_payload,
69 ErrorCode StartAsyncTransaction(uint16_t slave_addr,
70 const uint8_t* write_prefix_payload,
71 size_t write_prefix_size,
const uint8_t* write_payload,
72 size_t write_size, uint8_t* read_payload,
75 void FinishAsync(
bool in_isr,
ErrorCode ec);
76 static bool IsValid7BitAddr(uint16_t addr);
78 static void I2cIsrEntry(
void* arg);
79 void HandleInterrupt();
84 bool enable_internal_pullup_;
86 uint32_t isr_enable_min_size_;
87 bool initialized_ =
false;
89 i2c_hal_context_t hal_ = {};
90 uint32_t source_clock_hz_ = 0U;
92 intr_handle_t intr_handle_ =
nullptr;
93 bool intr_installed_ =
false;
95 bool async_running_ =
false;
97 uint16_t async_slave_addr_ = 0U;
98 std::array<uint8_t, 2> async_write_prefix_ = {};
99 size_t async_write_prefix_size_ = 0U;
100 size_t async_write_prefix_offset_ = 0U;
101 const uint8_t* async_write_payload_ =
nullptr;
102 size_t async_write_size_ = 0U;
103 size_t async_write_offset_ = 0U;
104 uint8_t* async_read_payload_ =
nullptr;
105 size_t async_read_size_ = 0U;
106 size_t async_read_offset_ = 0U;
107 size_t async_pending_read_chunk_ = 0U;
108 bool async_write_phase_done_ =
true;
109 bool async_write_addr_sent_ =
false;
110 bool async_write_stop_sent_ =
false;
111 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.