I2C write/ read to 16-bit register address

I followed this example to enable I2C for my sensor: https://academy.nordicsemi.com/courses/nrf-connect-sdk-fundamentals/lessons/lesson-6-serial-com-i2c/topic/exercise-1-6-2/.

However, my sensor uses 16-bit address instead of 8-bit as in the example. Can you help me to implement read/ write to 16-bit register addresses

Board: nRF53 

IDE: nRF Connect SDK

int i2c_init()
{
    if (!device_is_ready(dev_i2c.bus)) {
		printk("I2C bus %s is not ready!\n\r",dev_i2c.bus->name);
	    return -1;
	}
	printk("I2C bus 0x%x is ready!\n\r",dev_i2c.addr);

	return 0;
}

int write_to_16bit_reg(const struct i2c_dt_spec *spec, uint16_t reg_addr, const uint8_t *data, uint32_t data_length) {
    uint8_t buffer[2 + data_length];

    buffer[0] = (uint8_t)((reg_addr >> 8) & 0xFF);   // MSB of the register address
	LOG_INF("buff[0] = %x", buffer[0]);

    buffer[1] = (uint8_t)(reg_addr & 0xFF); // LSB of the register address
	LOG_INF("buff[1] = %x", buffer[1]);

    // Copy the data to send after the address bytes
    memcpy(&buffer[2], data, data_length);

    // Write the buffer to the I2C device
    return i2c_write_dt(spec, buffer, 2 + data_length);
}

void hm01b0_init(void)
{
    int ret;

    uint16_t reg_address = 0x1234; // Example register address
    uint8_t data_to_write[] = {0x00}; // Example data
    LOG_INF("Before write");
    ret = write_to_16bit_reg(&dev_i2c, reg_address, data_to_write, sizeof(data_to_write));
    LOG_INF("After write");

}

With this code I am getting the below error

I am using nRF53 board. Have configured i2c1 in overlay file. Have used default pins: SCL - P1.3 and SDA - P1.2

Related