diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/driver/soft_i2c.cc | 20 | 
1 files changed, 18 insertions, 2 deletions
| diff --git a/src/driver/soft_i2c.cc b/src/driver/soft_i2c.cc index 89f038b..285caef 100644 --- a/src/driver/soft_i2c.cc +++ b/src/driver/soft_i2c.cc @@ -127,7 +127,15 @@ bool SoftI2C::tx(unsigned char byte)  		i2c_wait();  		SCL_HIGH;  		i2c_wait(); -		while (!gpio.read(scl)) ; + +		// Avoid hanging indefinitely if the bus / device is stuck +		for (unsigned char i = 0; i < 200 && !gpio.read(scl); i++) { +			i2c_wait(); +		} +		if (!gpio.read(scl)) { +			return false; +		} +  		if (i == 8) {  			if (!gpio.read(sda)) {  				got_ack = 1; @@ -146,7 +154,15 @@ unsigned char SoftI2C::rx(bool send_ack)  		i2c_wait();  		SCL_HIGH;  		i2c_wait(); -		while (!gpio.read(scl)) ; + +		// Avoid hanging indefinitely if the bus / device is stuck +		for (unsigned char i = 0; i < 200 && !gpio.read(scl); i++) { +			i2c_wait(); +		} +		if (!gpio.read(scl)) { +			return false; +		} +  		if ((i < 8) && gpio.read(sda)) {  			byte |= 1 << (7 - i);  		} | 
