Hello, I am currently working with VEML6035 light sensor and so far i had a hard time working with its 16-bit registers.
The code that i wrote:
uint8_t i2c_handler::write_16bit(uint8_t registerAddress, uint16_t data){
uint8_t buff[3];
buff[0] = registerAddress;
buff[1] = data & 0xFF;
buff[2] = (data >> 8) & 0xFF;
uint8_t ret;
ret = i2c_write_dt(_handler, buff,3);
if (ret != 0) {
printk("Failed to write to 16-bit register of I2C device at Reg. %x (error %d)\n", registerAddress,ret);
return ret;
}
return 0;
}
uint8_t i2c_handler::read_16bit(uint8_t registerAddress, uint16_t* dataDestination){
uint8_t ret;
uint8_t data[2];
ret = i2c_write_read_dt(_handler, ®isterAddress, 1, data, 2);
if (ret != 0) {
printk("Failed to write/read 16-bit register of I2C device at Reg. %x (error %d)\n", registerAddress,ret);
return ret;
}
*dataDestination = (data[1]<<8) | data[0];
printk("Data from read: %x \r\n",*dataDestination);
return 0;
}
overlay file:
&i2c0 {
status = "okay";
clock-frequency = <I2C_BITRATE_STANDARD>;
veml6035: veml6035@29{
compatible = "i2c-device";
reg = <0x29>;
label = "VEML6035 Ambient Light Sensor";
};
};
I can't get that to work. Returns error 251 on write/read. Is that a proper way of setting up writing/reading of 16-bit registers?
