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);
33 bool in_isr)
override;
36 bool in_isr)
override;
39 ReadOperation& op, MemAddrLength mem_addr_size,
bool in_isr)
override;
43 bool in_isr)
override;
49 void TxDmaIRQHandler();
54 static CH32I2C* map_[CH32_I2C_NUMBER];
58 static constexpr uint32_t K_DEFAULT_TIMEOUT_US = 20000;
60 inline bool DmaBusy()
const
62 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
65 static inline uint8_t Addr7ToAddr8(uint16_t addr7)
69 ASSERT(addr7 <= 0x7F);
70 return static_cast<uint8_t
>(((addr7 & 0x7F) << 1) & 0xFE);
73 static inline uint16_t Addr10Clamp(uint16_t addr10)
75 ASSERT(addr10 <= 0x3FF);
76 return static_cast<uint16_t
>(addr10 & 0x3FF);
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);
87 ErrorCode MasterStartAndAddress(uint16_t slave_addr, uint8_t dir);
92 ErrorCode MasterStartAndAddress10Bit(uint16_t addr10, uint8_t final_dir);
94 ErrorCode SendMemAddr(uint16_t mem_addr, MemAddrLength len);
96 ErrorCode PollingWriteBytes(
const uint8_t* data, uint32_t len);
97 ErrorCode PollingReadBytes(uint8_t* data, uint32_t len);
99 void StartTxDma(uint32_t len);
100 void StartRxDma(uint32_t len);
106 void RecoverAfterImmediateFailure();
109 I2C_TypeDef* instance_;
110 DMA_Channel_TypeDef* dma_rx_channel_;
111 DMA_Channel_TypeDef* dma_tx_channel_;
113 uint32_t dma_enable_min_size_;
122 bool recovering_ =
false;
124 GPIO_TypeDef* scl_port_;
126 GPIO_TypeDef* sda_port_;
131 bool ten_bit_addr_ =
false;
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.
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.
ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation &op, bool in_isr) override
向 I2C 设备写入数据。 Writes data to an I2C device.
ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation &op, bool in_isr) override
读取 I2C 设备的数据。 Reads data from an I2C device.
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