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];
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);
82 ErrorCode WaitFlagOrRecover(uint32_t flag, FlagStatus st,
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);
103 void RecoverAfterImmediateFailure();
106 I2C_TypeDef* instance_;
107 DMA_Channel_TypeDef* dma_rx_channel_;
108 DMA_Channel_TypeDef* dma_tx_channel_;
110 uint32_t dma_enable_min_size_;
119 bool recovering_ =
false;
121 GPIO_TypeDef* scl_port_;
123 GPIO_TypeDef* sda_port_;
126 Configuration cfg_{400000};
128 bool ten_bit_addr_ =
false;
129 AsyncBlockWait block_wait_{};
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