diff --git a/drivers/i2c_master.h b/drivers/i2c_master.h index dbe1cd42fa..b36b5ef0df 100644 --- a/drivers/i2c_master.h +++ b/drivers/i2c_master.h @@ -42,6 +42,8 @@ void i2c_init(void); */ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout); +i2c_status_t i2c_transmit_and_receive(uint8_t address, const uint8_t* tx_data, uint16_t tx_length, uint8_t* rx_data, uint8_t rx_length, uint16_t timeout); + #if defined(__AVR__) || defined(__DOXYGEN__) /** * \brief Send multiple bytes from PROGMEM to the selected I2C device. diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c index 20850859b5..9f9f6f321e 100644 --- a/platforms/chibios/drivers/i2c_master.c +++ b/platforms/chibios/drivers/i2c_master.c @@ -154,6 +154,12 @@ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, return i2c_epilogue(status); } +i2c_status_t i2c_transmit_and_receive(uint8_t address, const uint8_t* tx_data, uint16_t tx_length, uint8_t* rx_data, uint8_t rx_length, uint16_t timeout) { + i2cStart(&I2C_DRIVER, &i2cconfig); + msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (address >> 1), tx_data, tx_length, rx_data, rx_length, TIME_MS2I(timeout)); + return i2c_epilogue(status); +} + i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) { i2cStart(&I2C_DRIVER, &i2cconfig); msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (address >> 1), data, length, TIME_MS2I(timeout));