Fix timeout handling for u8g_i2c_stop() #458
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
(I realize that u8glib isn't actively developed, but perhaps you would like to merge this bugfix anyway. I'm already in the process of switching U8glib2, but came across this bug when doing a maintanance release which still has u8glib)
To trigger a stop condition, the code sets the TWSTO bit, which is
automaticaly cleared when the stop is copmleted. However, the code would
call u8g_i2c_wait() to wait until the bit was set, not cleared. In
most cases, the stop condition seems slow enough so the bit is not
cleared and u8g_i2c_wait() is satisfied (though without waiting for the
stop to be completed). However, in some cases the bit is already
cleared, so u8g_i2c_wait stalls for the entire timeout and then sets a
timeout error.
In practice, these errors aren't usually checked, so this mostly causes
some unneeded delays and not waiting for stop complete is probably not
problematic either, but it is good to fix it anyway.
This commit changes u8g_i2c_wait to allow waiting for a bit to be
cleared in addition to it being set.