Skip to content

i2c_write_raw_blocking needs nostop parameterΒ #812

@sigmafx

Description

@sigmafx

Whilst writing to an I2C EEPROM it's necessary to write eeprom memory address followed by the data to write without a STOP between the address and the data. A typical write function would accept a memory address and data as separate parameters. This is best written to the EEPROM in 2 API calls:
1st: Sends device address and eeprom memory address
2nd: Sends data, followed by a STOP

The only achievable way is using the following APIs:

        // nostop is true so STOP isn't sent allowing data bytes to follow immediately
        i2c_write_blocking(m_instance, m_devAddr, &address, 1, true);
        i2c_write_raw_blocking(m_instance, &data, sizeof(data));

However, i2c_write_raw_blocking does not write a STOP.

It would be helpful to include the nostop paramter to i2c_write_raw_blocking function:

static inline void i2c_write_raw_blocking(i2c_inst_t *i2c, const uint8_t *src, size_t len, bool nostop) {
    for (size_t i = 0; i < len; ++i) {
        bool last = i == len - 1;

        // TODO NACK or STOP on end?
        while (!i2c_get_write_available(i2c))
            tight_loop_contents();
        i2c_get_hw(i2c)->data_cmd =
            bool_to_bit(last && !nostop) << I2C_IC_DATA_CMD_STOP_LSB |
            *src++;
    }
}

There's already a comment in there about this.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions