libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_i2c.hpp
1#pragma once
2
3#include "esp_def.hpp"
4
5#include <array>
6#include <cstddef>
7#include <cstdint>
8
9#include "driver/gpio.h"
10#include "esp_intr_alloc.h"
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,
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);
30
31 ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation& op,
32 bool in_isr = false) override;
33
34 ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation& op,
35 bool in_isr = false) override;
36
37 ErrorCode SetConfig(Configuration config) override;
38
39 ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data,
40 ReadOperation& op,
41 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
42 bool in_isr = false) override;
43
44 ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr,
45 ConstRawData write_data, WriteOperation& op,
46 MemAddrLength mem_addr_size = MemAddrLength::BYTE_8,
47 bool in_isr = false) override;
48
49 i2c_port_t Port() const { return port_num_; }
50
51 private:
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;
57
58 bool Acquire();
59 void Release();
60
61 ErrorCode InitHardware();
62 ErrorCode ConfigurePins();
63 ErrorCode ApplyConfig();
64 ErrorCode ResolveClockSource(uint32_t& source_hz);
65 ErrorCode RecoverController();
66 ErrorCode EnsureInitialized(bool in_isr);
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,
72 size_t read_size);
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,
78 ReadOperation& op);
79 ErrorCode KickAsyncTransaction();
80 void FinishAsync(bool in_isr, ErrorCode ec);
81 static bool IsValid7BitAddr(uint16_t addr);
82 ErrorCode InstallInterrupt();
83 static void I2cIsrEntry(void* arg);
84 void HandleInterrupt();
85
86 i2c_port_t port_num_;
87 int scl_pin_;
88 int sda_pin_;
89 bool enable_internal_pullup_;
90 uint32_t timeout_ms_;
91 uint32_t isr_enable_min_size_;
92 bool initialized_ = false;
93 Configuration config_{};
94 i2c_hal_context_t hal_ = {};
95 uint32_t source_clock_hz_ = 0U;
96 Flag::Plain busy_;
97 intr_handle_t intr_handle_ = nullptr;
98 bool intr_installed_ = false;
99
100 bool async_running_ = false;
101 ReadOperation async_op_{};
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;
117 AsyncBlockWait block_wait_{};
118};
119
120} // namespace LibXR
Shared BLOCK waiter handoff for synchronous driver operations.
Definition libxr_rw.hpp:247
常量原始数据封装类。 A class for encapsulating constant raw data.
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
Definition esp_i2c.cpp:934
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:1076
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:961
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:1019
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:1169
普通标志位(非原子)/ Non-atomic flag
Definition flag.hpp:115
I2C(Inter-Integrated Circuit)接口类。 I2C (Inter-Integrated Circuit) interface class.
Definition i2c.hpp:17
原始数据封装类。 A class for encapsulating raw data.
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
Definition libxr_def.hpp:64
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.
Definition i2c.hpp:24