olikraus / u8glib

Arduino Monochrom Graphics Library for LCDs and OLEDs
https://github.com/olikraus/u8glib/wiki
Other
1.24k stars 313 forks source link

Fix timeout handling for u8g_i2c_stop() #458

Closed matthijskooijman closed 7 years ago

matthijskooijman commented 7 years ago

(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.

olikraus commented 7 years ago

ok...