diff --git a/include/sta/devices/stm32/bus/i2c.hpp b/include/sta/devices/stm32/bus/i2c.hpp index 9f3ba83..626a0a8 100644 --- a/include/sta/devices/stm32/bus/i2c.hpp +++ b/include/sta/devices/stm32/bus/i2c.hpp @@ -24,7 +24,9 @@ namespace sta bool transfer(uint8_t value, uint32_t timeout = STA_MAX_TIMEOUT) override; bool transfer16(uint16_t value, uint32_t timeout = STA_MAX_TIMEOUT) override; bool transfer(const uint8_t * buffer, size_t size, uint32_t timeout = STA_MAX_TIMEOUT) override; + bool writeMemory(uint8_t regAddr, const uint8_t * buffer, size_t size, uint32_t timeout = STA_MAX_TIMEOUT) override; bool receive(uint8_t * buffer, size_t size, uint32_t timeout = STA_MAX_TIMEOUT) override; + bool readMemory(uint8_t regAddr, uint8_t * buffer, size_t size, uint32_t timeout = STA_MAX_TIMEOUT) override; bool fill(uint8_t value, size_t count, uint32_t timeout = STA_MAX_TIMEOUT) override; private: I2C_HandleTypeDef * handle_; diff --git a/src/devices/stm32/bus/i2c.cpp b/src/devices/stm32/bus/i2c.cpp index 5789329..6469bd6 100644 --- a/src/devices/stm32/bus/i2c.cpp +++ b/src/devices/stm32/bus/i2c.cpp @@ -75,9 +75,17 @@ namespace sta return res == HAL_OK; } + bool STM32I2C::writeMemory(uint8_t regAddr, const uint8_t * buffer, size_t size, uint32_t timeout /* = STA_MAX_TIMEOUT */) + { + if (blocking_) { + return HAL_I2C_Mem_Write(handle_, address_, regAddr, 1, buffer, size, timeout) == HAL_OK; + } else { + return HAL_I2C_Mem_Write_IT(handle_, address_, regAddr, 1, buffer, size) == HAL_OK; + } + } + bool STM32I2C::receive(uint8_t * buffer, size_t size, uint32_t timeout /* = STA_MAX_TIMEOUT */) { - if (blocking_) { if (master_) { return HAL_I2C_Master_Receive(handle_, address_, buffer, size, timeout) == HAL_OK; @@ -93,6 +101,15 @@ namespace sta } } + bool STM32I2C::readMemory(uint8_t regAddr, uint8_t * buffer, size_t size, uint32_t timeout /* = STA_MAX_TIMEOUT */) + { + if (blocking_) { + return HAL_I2C_Mem_Read(handle_, address_, regAddr, 1, buffer, size, timeout) == HAL_OK; + } else { + return HAL_I2C_Mem_Read_IT(handle_, address_, regAddr, 1, buffer, size) == HAL_OK; + } + } + bool STM32I2C::fill(uint8_t value, size_t count, uint32_t timeout /* = STA_MAX_TIMEOUT */) { // Initialize a buffer of size count and fill it with the value.