diff --git a/include/libopencm3/stm32/f3/i2c.h b/include/libopencm3/stm32/f3/i2c.h index cec673df..09cc9677 100644 --- a/include/libopencm3/stm32/f3/i2c.h +++ b/include/libopencm3/stm32/f3/i2c.h @@ -435,6 +435,8 @@ void i2c_enable_rxdma(uint32_t i2c); void i2c_disable_rxdma(uint32_t i2c); void i2c_enable_txdma(uint32_t i2c); void i2c_disable_txdma(uint32_t i2c); +void write_i2c(uint32_t i2c, uint8_t i2c_addr, uint8_t reg, uint8_t size, uint8_t *data); +void read_i2c(uint32_t i2c, uint8_t i2c_addr, uint8_t reg, uint8_t size, uint8_t *data); END_DECLS diff --git a/lib/stm32/f3/i2c.c b/lib/stm32/f3/i2c.c index d0c4db1c..c202f8fa 100644 --- a/lib/stm32/f3/i2c.c +++ b/lib/stm32/f3/i2c.c @@ -398,5 +398,78 @@ void i2c_disable_txdma(uint32_t i2c) I2C_CR1(i2c) &= ~I2C_CR1_TXDMAEN; } +void write_i2c(uint32_t i2c, uint8_t i2c_addr, uint8_t reg, uint8_t size, uint8_t *data) { + int wait; + int i; + while (i2c_busy(i2c) == 1) {} + while (i2c_is_start(i2c) == 1) {} + /*Setting transfer properties*/ + i2c_set_bytes_to_transfer(i2c, size+1); + i2c_set_7bit_address(i2c, (i2c_addr & 0x7F)); + i2c_set_write_transfer_dir(i2c); + i2c_enable_autoend(i2c); + /*start transfer*/ + i2c_send_start(i2c); + + wait=true; + while (wait) { + if (i2c_transmit_int_status(i2c)) { + wait=false; + } + while (i2c_nack(i2c)){} + } + i2c_send_data(i2c, reg); + for (i=0; i