8#include "ch32_gpio.hpp"
12CH32I2C* CH32I2C::map_[CH32_I2C_NUMBER] = {
nullptr};
14static inline void ch32_i2c_enable_clocks(ch32_i2c_id_t
id)
16 RCC_APB1PeriphClockCmd(CH32_I2C_RCC_PERIPH_MAP[
id], ENABLE);
17 RCC_AHBPeriphClockCmd(CH32_I2C_RCC_PERIPH_MAP_DMA[
id], ENABLE);
21 uint16_t scl_pin, GPIO_TypeDef* sda_port, uint16_t sda_pin,
22 uint32_t pin_remap, uint32_t dma_enable_min_size,
23 uint32_t default_clock_hz,
bool ten_bit_addr)
25 instance_(ch32_i2c_get_instance_id(id)),
26 dma_rx_channel_(CH32_I2C_RX_DMA_CHANNEL_MAP[id]),
27 dma_tx_channel_(CH32_I2C_TX_DMA_CHANNEL_MAP[id]),
29 dma_enable_min_size_(dma_enable_min_size),
35 ten_bit_addr_(ten_bit_addr)
37 ASSERT(instance_ !=
nullptr);
38 ASSERT(dma_buff_.
addr_ !=
nullptr && dma_buff_.
size_ > 0);
43 ch32_i2c_enable_clocks(id_);
47 GPIO_InitTypeDef gpio = {};
48 gpio.GPIO_Speed = GPIO_Speed_50MHz;
49 gpio.GPIO_Mode = GPIO_Mode_AF_OD;
51 RCC_APB2PeriphClockCmd(ch32_get_gpio_periph(scl_port_), ENABLE);
52 RCC_APB2PeriphClockCmd(ch32_get_gpio_periph(sda_port_), ENABLE);
54 GPIO_SetBits(scl_port_, scl_pin_);
55 GPIO_SetBits(sda_port_, sda_pin_);
57 gpio.GPIO_Pin = scl_pin_;
58 GPIO_Init(scl_port_, &gpio);
60 gpio.GPIO_Pin = sda_pin_;
61 GPIO_Init(sda_port_, &gpio);
65 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
66 GPIO_PinRemapConfig(pin_remap, ENABLE);
74 ch32_dma_callback_t cb = [](
void* arg)
76 ch32_dma_register_callback(ch32_dma_get_id(dma_rx_channel_), cb,
this);
78 DMA_InitTypeDef di = {};
79 DMA_DeInit(dma_rx_channel_);
80 di.DMA_PeripheralBaseAddr = (uint32_t)&instance_->DATAR;
81 di.DMA_MemoryBaseAddr = (uint32_t)dma_buff_.
addr_;
82 di.DMA_DIR = DMA_DIR_PeripheralSRC;
83 di.DMA_BufferSize = 0;
84 di.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
85 di.DMA_MemoryInc = DMA_MemoryInc_Enable;
86 di.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
87 di.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
88 di.DMA_Mode = DMA_Mode_Normal;
89 di.DMA_Priority = DMA_Priority_High;
90 di.DMA_M2M = DMA_M2M_Disable;
91 DMA_Init(dma_rx_channel_, &di);
92 DMA_ITConfig(dma_rx_channel_, DMA_IT_TC, ENABLE);
93 NVIC_EnableIRQ(CH32_DMA_IRQ_MAP[ch32_dma_get_id(dma_rx_channel_)]);
98 ch32_dma_callback_t cb = [](
void* arg)
99 {
reinterpret_cast<CH32I2C*
>(arg)->TxDmaIRQHandler(); };
100 ch32_dma_register_callback(ch32_dma_get_id(dma_tx_channel_), cb,
this);
102 DMA_InitTypeDef di = {};
103 DMA_DeInit(dma_tx_channel_);
104 di.DMA_PeripheralBaseAddr = (uint32_t)&instance_->DATAR;
105 di.DMA_MemoryBaseAddr = (uint32_t)dma_buff_.
addr_;
106 di.DMA_DIR = DMA_DIR_PeripheralDST;
107 di.DMA_BufferSize = 0;
108 di.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
109 di.DMA_MemoryInc = DMA_MemoryInc_Enable;
110 di.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
111 di.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
112 di.DMA_Mode = DMA_Mode_Normal;
113 di.DMA_Priority = DMA_Priority_VeryHigh;
114 di.DMA_M2M = DMA_M2M_Disable;
115 DMA_Init(dma_tx_channel_, &di);
116 DMA_ITConfig(dma_tx_channel_, DMA_IT_TC, ENABLE);
117 NVIC_EnableIRQ(CH32_DMA_IRQ_MAP[ch32_dma_get_id(dma_tx_channel_)]);
122 I2C_ITConfig(instance_, I2C_IT_ERR, ENABLE);
123 NVIC_EnableIRQ(CH32_I2C_ER_IRQ_MAP[id_]);
134 I2C_Cmd(instance_, DISABLE);
135 I2C_DeInit(instance_);
137 I2C_InitTypeDef init = {};
139 init.I2C_Mode = I2C_Mode_I2C;
140 init.I2C_DutyCycle = I2C_DutyCycle_2;
141 init.I2C_OwnAddress1 = 0;
142 init.I2C_Ack = I2C_Ack_Enable;
143 init.I2C_AcknowledgedAddress =
144 ten_bit_addr_ ? I2C_AcknowledgedAddress_10bit : I2C_AcknowledgedAddress_7bit;
146 I2C_Init(instance_, &init);
147 I2C_Cmd(instance_, ENABLE);
150 I2C_AcknowledgeConfig(instance_, ENABLE);
151 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
153 return ErrorCode::OK;
156bool CH32I2C::WaitEvent(uint32_t evt, uint32_t timeout_us)
161 if (I2C_CheckEvent(instance_, evt) == READY)
169bool CH32I2C::WaitFlag(uint32_t flag, FlagStatus st, uint32_t timeout_us)
174 if (I2C_GetFlagStatus(instance_, flag) == st)
182void CH32I2C::ClearAddrFlag()
184 volatile uint16_t tmp1 = instance_->STAR1;
185 volatile uint16_t tmp2 = instance_->STAR2;
190ErrorCode CH32I2C::MasterStartAndAddress10Bit(uint16_t addr10, uint8_t final_dir)
192 addr10 = Addr10Clamp(addr10);
195 if (!WaitFlag(I2C_FLAG_BUSY, RESET))
197 return ErrorCode::BUSY;
201 I2C_GenerateSTART(instance_, ENABLE);
202 if (!WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))
204 return ErrorCode::BUSY;
209 const uint8_t HEADER =
static_cast<uint8_t
>(0xF0 | ((addr10 >> 7) & 0x06));
210 I2C_Send7bitAddress(instance_, HEADER, I2C_Direction_Transmitter);
213 if (!WaitEvent(I2C_EVENT_MASTER_MODE_ADDRESS10))
215 return ErrorCode::BUSY;
219 I2C_SendData(instance_,
static_cast<uint8_t
>(addr10 & 0xFF));
222 if (!WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
224 return ErrorCode::BUSY;
228 if (final_dir == I2C_Direction_Transmitter)
230 return ErrorCode::OK;
234 I2C_GenerateSTART(instance_, ENABLE);
235 if (!WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))
237 return ErrorCode::BUSY;
240 I2C_Send7bitAddress(instance_, HEADER, I2C_Direction_Receiver);
241 if (!WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
243 return ErrorCode::BUSY;
247 return ErrorCode::OK;
250ErrorCode CH32I2C::MasterStartAndAddress(uint16_t slave_addr, uint8_t dir)
255 const uint8_t ADDR8 = Addr7ToAddr8(slave_addr);
257 if (!WaitFlag(I2C_FLAG_BUSY, RESET))
259 return ErrorCode::BUSY;
262 I2C_GenerateSTART(instance_, ENABLE);
263 if (!WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))
265 return ErrorCode::BUSY;
268 I2C_Send7bitAddress(instance_, ADDR8, dir);
270 if (dir == I2C_Direction_Transmitter)
272 if (!WaitEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
274 return ErrorCode::BUSY;
279 if (!WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
281 return ErrorCode::BUSY;
286 return ErrorCode::OK;
290 return MasterStartAndAddress10Bit(slave_addr, dir);
293ErrorCode CH32I2C::SendMemAddr(uint16_t mem_addr, MemAddrLength len)
295 if (len == MemAddrLength::BYTE_16)
297 if (!WaitFlag(I2C_FLAG_TXE, SET))
299 return ErrorCode::BUSY;
301 I2C_SendData(instance_,
static_cast<uint8_t
>((mem_addr >> 8) & 0xFF));
302 if (!WaitFlag(I2C_FLAG_TXE, SET))
304 return ErrorCode::BUSY;
306 I2C_SendData(instance_,
static_cast<uint8_t
>(mem_addr & 0xFF));
310 if (!WaitFlag(I2C_FLAG_TXE, SET))
312 return ErrorCode::BUSY;
314 I2C_SendData(instance_,
static_cast<uint8_t
>(mem_addr & 0xFF));
317 if (!WaitFlag(I2C_FLAG_BTF, SET))
319 return ErrorCode::BUSY;
321 return ErrorCode::OK;
324ErrorCode CH32I2C::PollingWriteBytes(
const uint8_t* data, uint32_t len)
326 for (uint32_t i = 0; i < len; ++i)
328 if (!WaitFlag(I2C_FLAG_TXE, SET))
330 return ErrorCode::BUSY;
332 I2C_SendData(instance_, data[i]);
334 if (!WaitFlag(I2C_FLAG_BTF, SET))
336 return ErrorCode::BUSY;
338 return ErrorCode::OK;
341ErrorCode CH32I2C::PollingReadBytes(uint8_t* data, uint32_t len)
345 return ErrorCode::OK;
351 I2C_AcknowledgeConfig(instance_, DISABLE);
352 I2C_GenerateSTOP(instance_, ENABLE);
353 if (!WaitFlag(I2C_FLAG_RXNE, SET))
355 return ErrorCode::BUSY;
357 data[0] = I2C_ReceiveData(instance_);
358 I2C_AcknowledgeConfig(instance_, ENABLE);
359 return ErrorCode::OK;
365 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Next);
366 I2C_AcknowledgeConfig(instance_, DISABLE);
368 if (!WaitFlag(I2C_FLAG_BTF, SET))
370 return ErrorCode::BUSY;
372 I2C_GenerateSTOP(instance_, ENABLE);
374 data[0] = I2C_ReceiveData(instance_);
375 data[1] = I2C_ReceiveData(instance_);
377 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
378 I2C_AcknowledgeConfig(instance_, ENABLE);
379 return ErrorCode::OK;
383 I2C_AcknowledgeConfig(instance_, ENABLE);
384 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
389 if (!WaitFlag(I2C_FLAG_RXNE, SET))
391 return ErrorCode::BUSY;
393 data[idx++] = I2C_ReceiveData(instance_);
398 if (!WaitFlag(I2C_FLAG_BTF, SET))
400 return ErrorCode::BUSY;
402 I2C_AcknowledgeConfig(instance_, DISABLE);
403 data[idx++] = I2C_ReceiveData(instance_);
404 I2C_GenerateSTOP(instance_, ENABLE);
405 data[idx++] = I2C_ReceiveData(instance_);
407 if (!WaitFlag(I2C_FLAG_RXNE, SET))
409 return ErrorCode::BUSY;
411 data[idx++] = I2C_ReceiveData(instance_);
413 I2C_AcknowledgeConfig(instance_, ENABLE);
414 return ErrorCode::OK;
417void CH32I2C::StartTxDma(uint32_t len)
419 dma_tx_channel_->MADDR =
reinterpret_cast<uint32_t
>(dma_buff_.
addr_);
420 dma_tx_channel_->CNTR = len;
422 I2C_DMACmd(instance_, ENABLE);
423 DMA_Cmd(dma_tx_channel_, ENABLE);
426void CH32I2C::StartRxDma(uint32_t len)
429 I2C_AcknowledgeConfig(instance_, ENABLE);
430 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
432 dma_rx_channel_->MADDR =
reinterpret_cast<uint32_t
>(dma_buff_.
addr_);
433 dma_rx_channel_->CNTR = len;
435 I2C_DMALastTransferCmd(instance_, ENABLE);
436 I2C_DMACmd(instance_, ENABLE);
437 DMA_Cmd(dma_rx_channel_, ENABLE);
440void CH32I2C::AbortTransfer(ErrorCode ec)
442 I2C_DMACmd(instance_, DISABLE);
443 I2C_DMALastTransferCmd(instance_, DISABLE);
444 DMA_Cmd(dma_tx_channel_, DISABLE);
445 DMA_Cmd(dma_rx_channel_, DISABLE);
448 I2C_AcknowledgeConfig(instance_, ENABLE);
449 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
451 I2C_GenerateSTOP(instance_, ENABLE);
468 if (write_data.
size_ == 0)
471 if (op.
type == WriteOperation::OperationType::BLOCK)
473 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
475 return ErrorCode::OK;
481 return ErrorCode::BUSY;
486 ErrorCode ec = MasterStartAndAddress(slave_addr, I2C_Direction_Transmitter);
487 if (ec != ErrorCode::OK)
493 if (write_data.
size_ <= dma_enable_min_size_)
495 ec = PollingWriteBytes(
reinterpret_cast<const uint8_t*
>(write_data.
addr_),
497 I2C_GenerateSTOP(instance_, ENABLE);
500 if (op.
type == WriteOperation::OperationType::BLOCK)
502 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
513 StartTxDma(write_data.
size_);
516 if (op.
type == WriteOperation::OperationType::BLOCK)
518 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
520 return ErrorCode::OK;
526 if (read_data.
size_ == 0)
529 if (op.
type == ReadOperation::OperationType::BLOCK)
531 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
533 return ErrorCode::OK;
539 return ErrorCode::BUSY;
544 ErrorCode ec = MasterStartAndAddress(slave_addr, I2C_Direction_Receiver);
545 if (ec != ErrorCode::OK)
551 if (read_data.
size_ <= dma_enable_min_size_)
553 ec = PollingReadBytes(
reinterpret_cast<uint8_t*
>(read_data.
addr_), read_data.
size_);
555 if (op.
type == ReadOperation::OperationType::BLOCK)
557 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
564 read_buff_ = read_data;
567 StartRxDma(read_data.
size_);
570 if (op.
type == ReadOperation::OperationType::BLOCK)
572 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
574 return ErrorCode::OK;
579 MemAddrLength mem_addr_size,
bool in_isr)
581 if (write_data.
size_ == 0)
584 if (op.
type == WriteOperation::OperationType::BLOCK)
586 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
588 return ErrorCode::OK;
594 return ErrorCode::BUSY;
599 ErrorCode ec = MasterStartAndAddress(slave_addr, I2C_Direction_Transmitter);
600 if (ec != ErrorCode::OK)
605 ec = SendMemAddr(mem_addr, mem_addr_size);
606 if (ec != ErrorCode::OK)
608 I2C_GenerateSTOP(instance_, ENABLE);
610 if (op.
type == WriteOperation::OperationType::BLOCK)
612 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
617 if (write_data.
size_ <= dma_enable_min_size_)
619 ec = PollingWriteBytes(
reinterpret_cast<const uint8_t*
>(write_data.
addr_),
621 I2C_GenerateSTOP(instance_, ENABLE);
624 if (op.
type == WriteOperation::OperationType::BLOCK)
626 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
636 StartTxDma(write_data.
size_);
639 if (op.
type == WriteOperation::OperationType::BLOCK)
641 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
643 return ErrorCode::OK;
649 if (read_data.
size_ == 0)
652 if (op.
type == ReadOperation::OperationType::BLOCK)
654 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
656 return ErrorCode::OK;
662 return ErrorCode::BUSY;
668 ErrorCode ec = MasterStartAndAddress(slave_addr, I2C_Direction_Transmitter);
669 if (ec != ErrorCode::OK)
674 ec = SendMemAddr(mem_addr, mem_addr_size);
675 if (ec != ErrorCode::OK)
677 I2C_GenerateSTOP(instance_, ENABLE);
679 if (op.
type == ReadOperation::OperationType::BLOCK)
681 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
689 const uint8_t ADDR8 = Addr7ToAddr8(slave_addr);
691 I2C_GenerateSTART(instance_, ENABLE);
692 if (!WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))
694 I2C_GenerateSTOP(instance_, ENABLE);
695 ec = ErrorCode::BUSY;
697 if (op.
type == ReadOperation::OperationType::BLOCK)
699 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
704 I2C_Send7bitAddress(instance_, ADDR8, I2C_Direction_Receiver);
705 if (!WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
707 I2C_GenerateSTOP(instance_, ENABLE);
708 ec = ErrorCode::BUSY;
710 if (op.
type == ReadOperation::OperationType::BLOCK)
712 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
720 const uint16_t ADDR10 = Addr10Clamp(slave_addr);
721 const uint8_t HEADER =
static_cast<uint8_t
>(0xF0 | ((ADDR10 >> 7) & 0x06));
723 I2C_GenerateSTART(instance_, ENABLE);
724 if (!WaitEvent(I2C_EVENT_MASTER_MODE_SELECT))
726 I2C_GenerateSTOP(instance_, ENABLE);
727 ec = ErrorCode::BUSY;
729 if (op.
type == ReadOperation::OperationType::BLOCK)
731 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
736 I2C_Send7bitAddress(instance_, HEADER, I2C_Direction_Receiver);
737 if (!WaitEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
739 I2C_GenerateSTOP(instance_, ENABLE);
740 ec = ErrorCode::BUSY;
742 if (op.
type == ReadOperation::OperationType::BLOCK)
744 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
752 if (read_data.
size_ <= dma_enable_min_size_)
754 ec = PollingReadBytes(
reinterpret_cast<uint8_t*
>(read_data.
addr_), read_data.
size_);
756 if (op.
type == ReadOperation::OperationType::BLOCK)
758 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
765 read_buff_ = read_data;
768 StartRxDma(read_data.
size_);
771 if (op.
type == ReadOperation::OperationType::BLOCK)
773 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
775 return ErrorCode::OK;
778void CH32I2C::TxDmaIRQHandler()
780 if (DMA_GetITStatus(CH32_I2C_TX_DMA_IT_MAP[id_]) == RESET)
784 DMA_ClearITPendingBit(CH32_I2C_TX_DMA_IT_MAP[id_]);
786 DMA_Cmd(dma_tx_channel_, DISABLE);
787 I2C_DMACmd(instance_, DISABLE);
789 (void)WaitFlag(I2C_FLAG_BTF, SET, 20000);
790 I2C_GenerateSTOP(instance_, ENABLE);
798 if (DMA_GetITStatus(CH32_I2C_RX_DMA_IT_MAP[id_]) == RESET)
802 DMA_ClearITPendingBit(CH32_I2C_RX_DMA_IT_MAP[id_]);
804 DMA_Cmd(dma_rx_channel_, DISABLE);
805 I2C_DMACmd(instance_, DISABLE);
806 I2C_DMALastTransferCmd(instance_, DISABLE);
808 I2C_GenerateSTOP(instance_, ENABLE);
810 if (read_buff_.
size_ > 0)
813 read_buff_.
size_ = 0;
817 I2C_AcknowledgeConfig(instance_, ENABLE);
818 I2C_NACKPositionConfig(instance_, I2C_NACKPosition_Current);
826 bool has_err =
false;
828 const uint32_t ITS[] = {I2C_IT_BERR, I2C_IT_ARLO, I2C_IT_AF, I2C_IT_OVR,
829 I2C_IT_TIMEOUT, I2C_IT_PECERR, I2C_IT_SMBALERT};
831 for (uint32_t it : ITS)
833 if (I2C_GetITStatus(instance_, it) == SET)
835 I2C_ClearITPendingBit(instance_, it);
840 if (has_err && busy_)
842 AbortTransfer(ErrorCode::FAILED);
850 void i2_c1_er_irq_handler(
void)
852 auto* p = LibXR::CH32I2C::map_[ch32_i2c_get_id(I2C1)];
855 p->ErrorIRQHandler();
861 void i2_c2_er_irq_handler(
void)
863 auto* p = LibXR::CH32I2C::map_[ch32_i2c_get_id(I2C2)];
866 p->ErrorIRQHandler();
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.
void RxDmaIRQHandler()
DMA 回调入口 / DMA callbacks from CH32 DMA driver.
void ErrorIRQHandler()
错误中断回调 / I2C error IRQ callback
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
ErrorCode SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
常量原始数据封装类。 A class for encapsulating constant raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
const void * addr_
数据存储地址(常量)。 The storage address of the data (constant).
I2C(Inter-Integrated Circuit)接口类。 I2C (Inter-Integrated Circuit) interface class.
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
union LibXR::Operation::@5 data
void UpdateStatus(bool in_isr, Status &&status)
Updates operation status based on type.
void MarkAsRunning()
标记操作为运行状态。 Marks the operation as running.
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
ErrorCode Wait(uint32_t timeout=UINT32_MAX)
等待(减少)信号量 Waits (decrements) the semaphore
static MicrosecondTimestamp GetMicroseconds()
获取当前时间的微秒级时间戳。 Gets the current timestamp in microseconds.
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.
uint32_t clock_speed
I2C 通信时钟速率(单位:Hz)。 The I2C clock speed (in Hz).