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?