libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
ch32_i2c.hpp
1#pragma once
2
3#include "libxr.hpp"
4#include DEF2STR(LIBXR_CH32_CONFIG_FILE)
5
6#ifdef I2C
7#undef I2C
8#endif
9
10#include "ch32_i2c_def.hpp"
11#include "i2c.hpp"
12#include "libxr_def.hpp"
13#include "libxr_rw.hpp"
14#include "timebase.hpp"
15
16namespace LibXR
17{
18
19class CH32I2C : public I2C
20{
21 public:
27 CH32I2C(ch32_i2c_id_t id, RawData dma_buff, GPIO_TypeDef* scl_port, uint16_t scl_pin,
28 GPIO_TypeDef* sda_port, uint16_t sda_pin, uint32_t pin_remap = 0,
29 uint32_t dma_enable_min_size = 3, uint32_t default_clock_hz = 400000,
30 bool ten_bit_addr = false);
31
32 ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation& op,
33 bool in_isr) override;
34
35 ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation& op,
36 bool in_isr) override;
37
38 ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data,
39 ReadOperation& op, MemAddrLength mem_addr_size, bool in_isr) override;
40
41 ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data,
42 WriteOperation& op, MemAddrLength mem_addr_size,
43 bool in_isr) override;
44
45 ErrorCode SetConfig(Configuration config) override;
46
48 void RxDmaIRQHandler();
49 void TxDmaIRQHandler();
50
52 void ErrorIRQHandler();
53
54 static CH32I2C* map_[CH32_I2C_NUMBER];
55
56 private:
58 static constexpr uint32_t K_DEFAULT_TIMEOUT_US = 20000; // 20ms
59
60 inline bool DmaBusy() const
61 {
62 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
63 }
64
65 static inline uint8_t Addr7ToAddr8(uint16_t addr7)
66 {
67 // WCH SPL 在 I2C_Send7bitAddress 中仅更新 bit0(R/W)。
68 // WCH SPL updates only bit0 (R/W) in I2C_Send7bitAddress.
69 ASSERT(addr7 <= 0x7F);
70 return static_cast<uint8_t>(((addr7 & 0x7F) << 1) & 0xFE);
71 }
72
73 static inline uint16_t Addr10Clamp(uint16_t addr10)
74 {
75 ASSERT(addr10 <= 0x3FF);
76 return static_cast<uint16_t>(addr10 & 0x3FF);
77 }
78
79 bool WaitEvent(uint32_t evt, uint32_t timeout_us = K_DEFAULT_TIMEOUT_US);
80 bool WaitFlag(uint32_t flag, FlagStatus st, uint32_t timeout_us = K_DEFAULT_TIMEOUT_US);
81 ErrorCode WaitEventOrRecover(uint32_t evt, uint32_t timeout_us = K_DEFAULT_TIMEOUT_US);
82 ErrorCode WaitFlagOrRecover(uint32_t flag, FlagStatus st,
83 uint32_t timeout_us = K_DEFAULT_TIMEOUT_US);
84
85 void ClearAddrFlag();
86
87 ErrorCode MasterStartAndAddress(uint16_t slave_addr, uint8_t dir);
88
89 // 10 位地址流程:先以写方向发送地址阶段,读流程再发重复起始切到读方向。
90 // 10-bit address flow: use write direction for address phase, then repeated start
91 // with read direction when needed.
92 ErrorCode MasterStartAndAddress10Bit(uint16_t addr10, uint8_t final_dir);
93
94 ErrorCode SendMemAddr(uint16_t mem_addr, MemAddrLength len);
95
96 ErrorCode PollingWriteBytes(const uint8_t* data, uint32_t len);
97 ErrorCode PollingReadBytes(uint8_t* data, uint32_t len);
98
99 void StartTxDma(uint32_t len);
100 void StartRxDma(uint32_t len);
101
102 // Caller has either checked idle state or stopped DMA for recovery.
103 void ApplyConfig(Configuration config);
104
105 void AbortTransfer(ErrorCode ec);
106 void RecoverAfterImmediateFailure();
107
108 public:
109 I2C_TypeDef* instance_;
110 DMA_Channel_TypeDef* dma_rx_channel_;
111 DMA_Channel_TypeDef* dma_tx_channel_;
112 ch32_i2c_id_t id_;
113 uint32_t dma_enable_min_size_;
114
115 RawData dma_buff_;
116
117 ReadOperation read_op_;
118 WriteOperation write_op_;
119 RawData read_buff_;
120 bool read_ = false;
121 bool busy_ = false;
122 bool recovering_ = false;
123
124 GPIO_TypeDef* scl_port_;
125 uint16_t scl_pin_;
126 GPIO_TypeDef* sda_port_;
127 uint16_t sda_pin_;
128
129 Configuration cfg_{400000};
130
131 bool ten_bit_addr_ = false;
132 AsyncBlockWait block_wait_{};
133};
134
135} // namespace LibXR
同步驱动操作的阻塞等待器 / Blocking waiter for synchronous driver operations.
ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data, WriteOperation &op, MemAddrLength mem_addr_size, bool in_isr) override
向 I2C 设备指定寄存器写入数据。 Writes data to a specific register of an I2C device.
Definition ch32_i2c.cpp:714
ErrorCode MemRead(uint16_t slave_addr, uint16_t mem_addr, RawData read_data, ReadOperation &op, MemAddrLength mem_addr_size, bool in_isr) override
从 I2C 设备指定寄存器读取数据。 Reads data from a specific register of an I2C device.
Definition ch32_i2c.cpp:787
void RxDmaIRQHandler()
DMA 回调入口 / DMA callbacks from CH32 DMA driver.
Definition ch32_i2c.cpp:949
void ErrorIRQHandler()
错误中断回调 / I2C error IRQ callback
Definition ch32_i2c.cpp:989
ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation &op, bool in_isr) override
向 I2C 设备写入数据。 Writes data to an I2C device.
Definition ch32_i2c.cpp:592
ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation &op, bool in_isr) override
读取 I2C 设备的数据。 Reads data from an I2C device.
Definition ch32_i2c.cpp:655
CH32I2C(ch32_i2c_id_t id, RawData dma_buff, GPIO_TypeDef *scl_port, uint16_t scl_pin, GPIO_TypeDef *sda_port, uint16_t sda_pin, uint32_t pin_remap=0, uint32_t dma_enable_min_size=3, uint32_t default_clock_hz=400000, bool ten_bit_addr=false)
构造 I2C 驱动对象 / Construct I2C driver object
Definition ch32_i2c.cpp:30
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
Definition ch32_i2c.cpp:140
只读原始数据视图 / Immutable raw data view
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