Hey, I think that’s a really great idea. One thing I would add is that we definitely should honor timeouts in any of the retries. Also, a way to disable the retries should be a good idea. Probably making it a syscfg which when set to 0 does not do any retries.
I am assuming the errors codes will be HAL_I2C_ERR_XXXX error codes, so all the mcus would have to return the same error codes on errors. Personally, I like calling them retries than tries since if they are set to 0 the operation still happens once, but that’s just me. Regards, Vipul Rahane > On Aug 30, 2018, at 9:48 AM, will sanfilippo <wi...@runtime.io> wrote: > > I think my only comment is tries vs retries. You always want to make at least > one try so you would have to set that to 1 every time right? I like retries > personally but that is just me. Mainly because you would never allow zero for > tries. > > >> On Aug 30, 2018, at 9:21 AM, Christopher Collins <ch...@runtime.io> wrote: >> >> 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 >