Greg,

the bottom line is that if you look deep into the underlying driver architecture, its not clear why you would need to use read or write, since they are internally the same as transfer:

this is read:
```
 struct i2c_msg_s msgv =
  {
    .addr   = ((struct stm32_i2c_inst_s *)dev)->address,
    .flags  = ((struct stm32_i2c_inst_s *)dev)->flags | I2C_M_READ,
    .buffer = buffer,
    .length = buflen
  };
    
return stm32_i2c_process(dev, &msgv, 1);
```

this is transfer:

```
return stm32_i2c_process(dev, msgs, count);
```

Would you mind testing with transfer again (you can use your read and write commands) and help us work out why this seemed to make a difference for you?