diff --git a/drivers/adc/ad7091r5/ad7091r5.c b/drivers/adc/ad7091r5/ad7091r5.c index 45503e70225..b02b1c7860c 100644 --- a/drivers/adc/ad7091r5/ad7091r5.c +++ b/drivers/adc/ad7091r5/ad7091r5.c @@ -57,7 +57,7 @@ int32_t ad7091r5_i2c_reg_read(struct ad7091r5_dev *dev, if (!dev || !reg_data) return -EINVAL; - ret = no_os_i2c_write(dev->i2c_desc, ®_addr, 1, 1); + ret = no_os_i2c_write(dev->i2c_desc, ®_addr, 1, 0); if (ret < 0) return ret; @@ -144,6 +144,9 @@ int32_t ad7091r5_i2c_write_mask(struct ad7091r5_dev *dev, reg_data &= ~mask; reg_data |= data; + /* Allow time for register modification to take effect before write */ + no_os_udelay(100); + return ad7091r5_i2c_reg_write(dev, reg_addr, reg_data); } @@ -443,8 +446,8 @@ int32_t ad7091r5_reset(struct ad7091r5_dev *dev, bool is_software) if (ret < 0) return ret; - /* reset pulse width, at least 10 ns*/ - no_os_udelay(1); + /* Reset pulse width extended to ensure proper device reset */ + no_os_udelay(100); return no_os_gpio_set_value(dev->gpio_resetn, NO_OS_GPIO_HIGH); } } @@ -499,6 +502,9 @@ int32_t ad7091r5_read_one(struct ad7091r5_dev *dev, if (ret) return ret; + /* Wait for channel switch and conversion to complete before reading result */ + no_os_udelay(100); + ret = ad7091r5_i2c_reg_read(dev, AD7091R5_REG_RESULT, &val); if (ret) return ret;