libxr  1.0
Want to be the best embedded framework
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
82 void ClearAddrFlag();
83
84 ErrorCode MasterStartAndAddress(uint16_t slave_addr, uint8_t dir);
85
86 // 10 位地址流程:先以写方向发送地址阶段,读流程再发重复起始切到读方向。
87 // 10-bit address flow: use write direction for address phase, then repeated start
88 // with read direction when needed.
89 ErrorCode MasterStartAndAddress10Bit(uint16_t addr10, uint8_t final_dir);
90
91 ErrorCode SendMemAddr(uint16_t mem_addr, MemAddrLength len);
92
93 ErrorCode PollingWriteBytes(const uint8_t* data, uint32_t len);
94 ErrorCode PollingReadBytes(uint8_t* data, uint32_t len);
95
96 void StartTxDma(uint32_t len);
97 void StartRxDma(uint32_t len);
98
99 void AbortTransfer(ErrorCode ec);
100
101 public:
102 I2C_TypeDef* instance_;
103 DMA_Channel_TypeDef* dma_rx_channel_;
104 DMA_Channel_TypeDef* dma_tx_channel_;
105 ch32_i2c_id_t id_;
106 uint32_t dma_enable_min_size_;
107
108 RawData dma_buff_;
109
110 ReadOperation read_op_;
111 WriteOperation write_op_;
112 RawData read_buff_;
113 bool read_ = false;
114 bool busy_ = false;
115
116 GPIO_TypeDef* scl_port_;
117 uint16_t scl_pin_;
118 GPIO_TypeDef* sda_port_;
119 uint16_t sda_pin_;
120
121 Configuration cfg_{400000};
122
123 bool ten_bit_addr_ = false;
124};
125
126} // namespace LibXR
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:577
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:646
void RxDmaIRQHandler()
DMA 回调入口 / DMA callbacks from CH32 DMA driver.
Definition ch32_i2c.cpp:796
void ErrorIRQHandler()
错误中断回调 / I2C error IRQ callback
Definition ch32_i2c.cpp:824
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:465
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:523
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:20
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
Definition ch32_i2c.cpp:130
static constexpr uint32_t K_DEFAULT_TIMEOUT_US
默认超时(微秒) / Default timeout in microseconds
Definition ch32_i2c.hpp:58
常量原始数据封装类。 A class for encapsulating constant raw data.
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
Operation< ErrorCode > ReadOperation
Read operation type.
Definition libxr_rw.hpp:237
Operation< ErrorCode > WriteOperation
Write operation type.
Definition libxr_rw.hpp:241
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.
Definition i2c.hpp:24