1#include "stm32_i2c.hpp"
3#ifdef HAL_I2C_MODULE_ENABLED
7STM32I2C *STM32I2C::map[STM32_I2C_NUMBER] = {
nullptr};
9stm32_i2c_id_t STM32_I2C_GetID(I2C_TypeDef *hi2c)
13 return stm32_i2c_id_t::STM32_I2C_ID_ERROR;
16 else if (hi2c == I2C1)
18 return stm32_i2c_id_t::STM32_I2C1;
22 else if (hi2c == I2C2)
24 return stm32_i2c_id_t::STM32_I2C2;
28 else if (hi2c == I2C3)
30 return stm32_i2c_id_t::STM32_I2C3;
34 else if (hi2c == I2C4)
36 return stm32_i2c_id_t::STM32_I2C4;
40 else if (hi2c == I2C5)
42 return stm32_i2c_id_t::STM32_I2C5;
46 else if (hi2c == I2C6)
48 return stm32_i2c_id_t::STM32_I2C6;
52 else if (hi2c == I2C7)
54 return stm32_i2c_id_t::STM32_I2C7;
58 else if (hi2c == I2C8)
60 return stm32_i2c_id_t::STM32_I2C8;
63 return stm32_i2c_id_t::STM32_I2C_ID_ERROR;
66STM32I2C::STM32I2C(I2C_HandleTypeDef *hi2c,
RawData dma_buff,
67 uint32_t dma_enable_min_size)
69 id_(STM32_I2C_GetID(hi2c->Instance)),
71 dma_enable_min_size_(dma_enable_min_size),
79 if (i2c_handle_->State != HAL_I2C_STATE_READY)
81 return ErrorCode::BUSY;
86 if (read_data.
size_ > dma_enable_min_size_)
89 HAL_I2C_Master_Receive_DMA(i2c_handle_, slave_addr,
90 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_),
92 read_buff_ = read_data;
94 if (op.
type == ReadOperation::OperationType::BLOCK)
96 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
102 auto ans = HAL_I2C_Master_Receive(i2c_handle_, slave_addr,
103 reinterpret_cast<uint8_t *
>(read_data.
addr_),
104 read_data.
size_, 20) == HAL_OK
108 if (op.
type == ReadOperation::OperationType::BLOCK)
110 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
119 if (i2c_handle_->State != HAL_I2C_STATE_READY)
121 return ErrorCode::BUSY;
128 if (write_data.
size_ > dma_enable_min_size_)
132 SCB_CleanDCache_by_Addr(
reinterpret_cast<uint32_t *
>(dma_buff_.
addr_),
135 HAL_I2C_Master_Transmit_DMA(i2c_handle_, slave_addr,
136 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_),
139 if (op.
type == WriteOperation::OperationType::BLOCK)
141 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
143 return ErrorCode::OK;
147 auto ans = HAL_I2C_Master_Transmit(i2c_handle_, slave_addr,
148 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_),
149 write_data.
size_, 20) == HAL_OK
153 if (op.
type == WriteOperation::OperationType::BLOCK)
155 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
166 if (i2c_handle_->State != HAL_I2C_STATE_READY)
168 return ErrorCode::BUSY;
173 if (read_data.
size_ > dma_enable_min_size_)
176 HAL_I2C_Mem_Read_DMA(i2c_handle_, slave_addr, mem_addr,
177 mem_addr_size == MemAddrLength::BYTE_8 ? I2C_MEMADD_SIZE_8BIT
178 : I2C_MEMADD_SIZE_16BIT,
179 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_), read_data.
size_);
180 read_buff_ = read_data;
182 if (op.
type == ReadOperation::OperationType::BLOCK)
184 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
186 return ErrorCode::OK;
191 HAL_I2C_Mem_Read(i2c_handle_, slave_addr, mem_addr,
192 mem_addr_size == MemAddrLength::BYTE_8 ? I2C_MEMADD_SIZE_8BIT
193 : I2C_MEMADD_SIZE_16BIT,
194 reinterpret_cast<uint8_t *
>(read_data.
addr_), read_data.
size_,
200 if (op.
type == ReadOperation::OperationType::BLOCK)
202 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
210 MemAddrLength mem_addr_size)
214 if (i2c_handle_->State != HAL_I2C_STATE_READY)
216 return ErrorCode::BUSY;
223 if (write_data.
size_ > dma_enable_min_size_)
227 SCB_CleanDCache_by_Addr(
reinterpret_cast<uint32_t *
>(dma_buff_.
addr_),
230 HAL_I2C_Mem_Write_DMA(i2c_handle_, slave_addr, mem_addr,
231 mem_addr_size == MemAddrLength::BYTE_8 ? I2C_MEMADD_SIZE_8BIT
232 : I2C_MEMADD_SIZE_16BIT,
233 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_), write_data.
size_);
235 if (op.
type == WriteOperation::OperationType::BLOCK)
237 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
239 return ErrorCode::OK;
244 HAL_I2C_Mem_Write(i2c_handle_, slave_addr, mem_addr,
245 mem_addr_size == MemAddrLength::BYTE_8 ? I2C_MEMADD_SIZE_8BIT
246 : I2C_MEMADD_SIZE_16BIT,
247 reinterpret_cast<uint8_t *
>(dma_buff_.
addr_), write_data.
size_,
253 if (op.
type == WriteOperation::OperationType::BLOCK)
255 return op.
data.sem_info.sem->
Wait(op.
data.sem_info.timeout);
265 SetClockSpeed<decltype(i2c_handle_)>(i2c_handle_, config);
269 return ErrorCode::NOT_SUPPORT;
272 if (HAL_I2C_Init(i2c_handle_) != HAL_OK)
274 return ErrorCode::INIT_ERR;
276 return ErrorCode::OK;
279extern "C" void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
281 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
285 SCB_InvalidateDCache_by_Addr(i2c->dma_buff_.
addr_, i2c->read_buff_.
size_);
287 memcpy(i2c->read_buff_.
addr_, i2c->dma_buff_.
addr_, i2c->read_buff_.
size_);
292extern "C" void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
294 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
301extern "C" void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
303 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
310extern "C" void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
312 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
316 SCB_InvalidateDCache_by_Addr(i2c->dma_buff_.
addr_, i2c->read_buff_.
size_);
318 memcpy(i2c->read_buff_.
addr_, i2c->dma_buff_.
addr_, i2c->read_buff_.
size_);
323extern "C" void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
325 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
常量原始数据封装类。 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.
void MarkAsRunning()
标记操作为运行状态。 Marks the operation as running.
void UpdateStatus(bool in_isr, Status &&...status)
Updates operation status based on type.
union LibXR::Operation::@4 data
原始数据封装类。 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 SetConfig(Configuration config) override
配置 I2C 设备参数。 Configures the I2C device settings.
ErrorCode Write(uint16_t slave_addr, ConstRawData write_data, WriteOperation &op) override
向 I2C 设备写入数据。 Writes data to an I2C device.
ErrorCode MemWrite(uint16_t slave_addr, uint16_t mem_addr, ConstRawData write_data, WriteOperation &op, MemAddrLength mem_addr_size) 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) override
从 I2C 设备指定寄存器读取数据。 Reads data from a specific register of an I2C device.
ErrorCode Read(uint16_t slave_addr, RawData read_data, ReadOperation &op) override
读取 I2C 设备的数据。 Reads data from an I2C device.
ErrorCode Wait(uint32_t timeout=UINT32_MAX)
等待(减少)信号量 Waits (decrements) the semaphore
I2C 设备的配置信息结构体。 Configuration structure for an I2C device.