On Wed, Aug 29, 2018 at 10:06:37PM -0500, Greg Stein wrote:
> On Wed, Aug 29, 2018 at 8:59 PM Christopher Collins <ch...@runtime.io>
> wrote:
> 
> > Hello all,
> >
> > I noticed the HAL master I2C API does not include any retry logic.  As
> > you probably know, in I2C, the default state of the SCL line is NACK.
> >
> 
> Euh... ACK/NACK is on SDA while the master cycles SCL.

Yes, you are right.  Thanks for the correction.

[...]

> Or that something monkeyed the bus, so the peripheral decided to stop
> receiving/processing. ... Your basic point holds: a peripheral might just
> go away for any number of reasons. I wouldn't even bother with the on_dnack
> flag. Seems better to consider retry at the whole-packet level. It all gets
> sent, or it did not and should be retried.

Thank you for the insight.  I am starting to think you are right -
retries should be done by the low-level HAL implementation.  So, my
current thinking is that we should make the following changes:

1. Define a common set of error code for the I2C HAL [1].
2. Add a single member to the `hal_i2c_master_data` struct: `tries` [2]
3. Modify the HAL I2C implementations so that they retry up to (tries-1)
times when an unexpected NACK is recieved.

[1] We should do the same for the other HAL APIs (i.e., non-I2C), but
that can come later.

[2] I prefer specifying number of tries rather than number of retries.
I think it helps avoid some ambiguity.

All comments welcome.

Thanks,
Chris

Reply via email to