libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_i2c.hpp
1#pragma once
2
3#include <array>
4#include <cstddef>
5#include <cstdint>
6
7#include "driver/gpio.h"
8#include "esp_def.hpp"
9#include "esp_intr_alloc.h"
10#include "hal/i2c_hal.h"
11#include "hal/i2c_types.h"
12#include "i2c.hpp"
13#include "soc/i2c_periph.h"
14#include "soc/soc_caps.h"
15
16namespace LibXR
17{
18
19class ESP32I2C : public I2C
20{
21 public:
22 static constexpr int PIN_NO_CHANGE = -1;
23
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);
27
28 ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation& op,
29 bool in_isr = false) override;
30
31 ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation& op,
32 bool in_isr = false) override;
33
34 ErrorCode SetConfig(Configuration config) override;
35
36 ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data,
37 ReadOperation& op,
38 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
39 bool in_isr = false) override;
40
41 ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data,
43 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
44 bool in_isr = false) override;
45
46 i2c_port_t Port() const { return port_num_; }
47
48 private:
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;
53
54 bool Acquire();
55 void Release();
56
57 ErrorCode InitHardware();
58 ErrorCode ConfigurePins();
59 ErrorCode ApplyConfig();
60 ErrorCode ResolveClockSource(uint32_t& source_hz);
61 ErrorCode RecoverController();
62 ErrorCode EnsureInitialized(bool in_isr);
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,
68 size_t read_size);
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,
73 size_t read_size, ReadOperation& op);
74 ErrorCode KickAsyncTransaction();
75 void FinishAsync(bool in_isr, ErrorCode ec);
76 static bool IsValid7BitAddr(uint16_t addr);
77 ErrorCode InstallInterrupt();
78 static void I2cIsrEntry(void* arg);
79 void HandleInterrupt();
80
81 i2c_port_t port_num_;
82 int scl_pin_;
83 int sda_pin_;
84 bool enable_internal_pullup_;
85 uint32_t timeout_ms_;
86 uint32_t isr_enable_min_size_;
87 bool initialized_ = false;
88 Configuration config_{};
89 i2c_hal_context_t hal_ = {};
90 uint32_t source_clock_hz_ = 0U;
91 Flag::Plain busy_;
92 intr_handle_t intr_handle_ = nullptr;
93 bool intr_installed_ = false;
94
95 bool async_running_ = false;
96 ReadOperation async_op_{};
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;
112 AsyncBlockWait block_wait_{};
113};
114
115} // namespace LibXR
Shared BLOCK waiter handoff for synchronous driver operations.
只读原始数据视图 / Immutable raw data view
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
Definition esp_i2c.cpp:928
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.
Definition esp_i2c.cpp:1070
ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation &op, bool in_isr=false) override
向 I2C 设备写入数据。 Writes data to an I2C device.
Definition esp_i2c.cpp:955
ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation &op, bool in_isr=false) override
读取 I2C 设备的数据。 Reads data from an I2C device.
Definition esp_i2c.cpp:1013
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.
Definition esp_i2c.cpp:1163
普通标志位(非原子)/ Non-atomic flag
Definition flag.hpp:115
I2C(Inter-Integrated Circuit)接口类。 I2C (Inter-Integrated Circuit) interface class.
Definition i2c.hpp:17
可写原始数据视图 / Mutable raw data view
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.
Definition i2c.hpp:24