i need to get a repeated start on I2C write.
on nrf52840 i used twi driver and it worked just fine there was flag you could set to get repeated start.
static inline int i2c_write_dt_repeated(const struct i2c_dt_spec *spec, const uint8_t *buf, uint32_t num_bytes) { return i2c_write_repeated(spec->bus, buf, num_bytes, spec->addr); } /** * @brief Write a set amount of data to an I2C device. * * This routine writes a set amount of data synchronously. * * @param dev Pointer to the device structure for an I2C controller * driver configured in controller mode. * @param buf Memory pool from which the data is transferred. * @param num_bytes Number of bytes to write. * @param addr Address to the target I2C device for writing. * * @retval 0 If successful. * @retval -EIO General input / output error. */ static inline int i2c_write_repeated(const struct device *dev, const uint8_t *buf, uint32_t num_bytes, uint16_t addr) { struct i2c_msg msg; msg.buf = (uint8_t *)buf; msg.len = num_bytes; msg.flags = I2C_MSG_WRITE | I2C_MSG_RESTART; return i2c_transfer(dev, &msg, 1, addr); }
then i called the functions with
/** * @brief Function for setting the active register on battery fuel gauge. */ void LC709203_write_command_byte(uint8_t command_byte) { int err_code; /* Writing to pointer byte. */ m_tx_LC709203_data[0] = command_byte; // command byte which gets sent before every read // "true" means send with repeated start at the end // err_code = nrf_drv_twi_tx(&m_LC709203_twi, LC709203_ADDR, m_tx_LC709203_data,1, true); // send with a repeated start at the end // I noticed that i2c_write_dt calls // i2c_write which calls i2c_transfer which lets me // put the I2C_MSG_RESTART flag on the buffer int err_code = i2c_write_dt_repeated(&lc709_0b_, m_tx_LC709203_data, sizeof(m_tx_LC709203_data)); }
the one thing i am not sure of is the write complete when the I2C transfer function completes or is the code non blocking and i need to check for some kind of "done flag'.
my old nrfx_twi driver had to have a done flag checked.
let me know if you think this will work.
phil