libxr
Embedded C++ framework for bare-metal, RTOS and Linux
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 "flag.hpp"
11#include "hal/i2c_hal.h"
12#include "hal/i2c_types.h"
13#include "i2c.hpp"
14#include "soc/i2c_periph.h"
15#include "soc/soc_caps.h"
16
17namespace LibXR
18{
19
20class ESP32I2C : public I2C
21{
22 public:
23 static constexpr int PIN_NO_CHANGE = -1;
24
25 ESP32I2C(i2c_port_t port_num, int scl_pin, int sda_pin, uint32_t clock_speed = 400000U,
26 bool enable_internal_pullup = true, uint32_t timeout_ms = 100U,
27 uint32_t isr_enable_min_size = 32U);
28
29 ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation& op,
30 bool in_isr = false) override;
31
32 ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation& op,
33 bool in_isr = false) override;
34
35 ErrorCode SetConfig(Configuration config) override;
36
37 ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data,
38 ReadOperation& op,
39 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
40 bool in_isr = false) override;
41
42 ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data,
44 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
45 bool in_isr = false) override;
46
47 i2c_port_t Port() const { return port_num_; }
48
49 private:
50 static constexpr size_t FIFO_LEN = SOC_I2C_FIFO_LEN;
51 static constexpr size_t MAX_WRITE_PAYLOAD = (FIFO_LEN > 4U) ? (FIFO_LEN - 4U) : 0U;
52 static constexpr size_t MAX_WRITE_READ_PREFIX = (FIFO_LEN > 5U) ? (FIFO_LEN - 5U) : 0U;
53 static constexpr size_t MAX_READ_PAYLOAD = (FIFO_LEN > 4U) ? (FIFO_LEN - 4U) : FIFO_LEN;
54
55 bool Acquire();
56 void Release();
57
58 ErrorCode InitHardware();
59 ErrorCode ConfigurePins();
60 ErrorCode ApplyConfig();
61 ErrorCode ResolveClockSource(uint32_t& source_hz);
62 ErrorCode RecoverController();
63 ErrorCode EnsureInitialized(bool in_isr);
64 bool ShouldUseInterruptAsync(size_t total_size) const;
65 static size_t MemAddrBytes(MemAddrLength mem_addr_size);
66 static void EncodeMemAddr(uint16_t mem_addr, size_t mem_len, uint8_t* out);
67 ErrorCode ExecuteTransaction(uint16_t slave_addr, const uint8_t* write_payload,
68 size_t write_size, uint8_t* read_payload, size_t read_size,
69 bool in_isr);
70 ErrorCode StartAsyncTransaction(uint16_t slave_addr,
71 const uint8_t* write_prefix_payload,
72 size_t write_prefix_size, const uint8_t* write_payload,
73 size_t write_size, uint8_t* read_payload,
74 size_t read_size, ReadOperation& op, bool in_isr);
75 ErrorCode KickAsyncTransaction();
76 void FinishAsync(bool in_isr, ErrorCode ec);
77 static bool IsValid7BitAddr(uint16_t addr);
78 ErrorCode InstallInterrupt();
79 static void I2cIsrEntry(void* arg);
80 void HandleInterrupt();
81
82 i2c_port_t port_num_;
83 int scl_pin_;
84 int sda_pin_;
85 bool enable_internal_pullup_;
86 uint32_t timeout_ms_;
87 uint32_t isr_enable_min_size_;
88 bool initialized_ = false;
89 Configuration config_{};
90 i2c_hal_context_t hal_ = {};
91 uint32_t source_clock_hz_ = 0U;
92 Flag::Atomic busy_{};
93 intr_handle_t intr_handle_ = nullptr;
94 bool intr_installed_ = false;
95
96 bool async_running_ = false;
97 ReadOperation async_op_{};
98 uint16_t async_slave_addr_ = 0U;
99 std::array<uint8_t, 2> async_write_prefix_ = {};
100 size_t async_write_prefix_size_ = 0U;
101 size_t async_write_prefix_offset_ = 0U;
102 const uint8_t* async_write_payload_ = nullptr;
103 size_t async_write_size_ = 0U;
104 size_t async_write_offset_ = 0U;
105 uint8_t* async_read_payload_ = nullptr;
106 size_t async_read_size_ = 0U;
107 size_t async_read_offset_ = 0U;
108 size_t async_pending_read_chunk_ = 0U;
109 bool async_write_phase_done_ = true;
110 bool async_write_addr_sent_ = false;
111 bool async_write_stop_sent_ = false;
112 bool async_read_addr_sent_ = false;
113 AsyncBlockWait block_wait_{};
114};
115
116} // namespace LibXR
同步驱动操作的阻塞等待器 / Blocking waiter for synchronous driver operations.
只读原始数据视图 / Immutable raw data view
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
Definition esp_i2c.cpp:1024
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:1178
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:1062
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:1120
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:1273
原子标志位 / Atomic flag
Definition flag.hpp:32
I2C(Inter-Integrated Circuit)接口类。 I2C (Inter-Integrated Circuit) interface class.
Definition i2c.hpp:17
可写原始数据视图 / Mutable raw data view
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.
Definition i2c.hpp:24