diff --git a/i2c.c b/i2c.c index 9a03f5d..139815d 100644 --- a/i2c.c +++ b/i2c.c @@ -213,6 +213,16 @@ void i2c_write(uint8_t data, uint8_t last_byte) { delay_us(10); } + // Recover from error conditions by draining the buffer. + if ((i2c_state & I2C_ERROR_BUS_FAIL) || + (i2c_state & I2C_ERROR_NO_ANSWER) || + (i2c_state & I2C_ERROR_NACK)) { + while (buf_canread(send)) { + buf_pop(send, TWDR); + } + i2c_state = I2C_MODE_FREE; + } + if (i2c_state & I2C_MODE_FREE) { // No transmission ongoing, start one. i2c_state = I2C_MODE_SAWP; @@ -274,6 +284,8 @@ ISR(TWI_vect) { serial_writechar('1'); #endif i2c_state |= I2C_ERROR_BUS_FAIL; + // Let i2c_write() continue. + i2c_should_end = 0; // Send stop condition. TWCR = (1<