diff options
Diffstat (limited to 'os/hal')
-rw-r--r-- | os/hal/platforms/STM32/I2Cv2/i2c_lld.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/os/hal/platforms/STM32/I2Cv2/i2c_lld.c b/os/hal/platforms/STM32/I2Cv2/i2c_lld.c index 3b7b52e3b..024bd13e9 100644 --- a/os/hal/platforms/STM32/I2Cv2/i2c_lld.c +++ b/os/hal/platforms/STM32/I2Cv2/i2c_lld.c @@ -179,20 +179,23 @@ static void i2c_lld_serve_interrupt(I2CDriver *i2cp, uint32_t isr) { dp->CR2 |= I2C_CR2_STOP;
}
}
- else if (isr & I2C_ISR_STOPF) {
- /* Stops the associated DMA streams.*/
- dmaStreamDisable(i2cp->dmatx);
- dmaStreamDisable(i2cp->dmarx);
+ if (isr & I2C_ISR_NACKF) {
+ /* Starts a STOP sequence immediately.*/
+ dp->CR2 |= I2C_CR2_STOP;
- wakeup_isr(i2cp, RDY_OK);
+ i2cp->errors |= I2CD_ACK_FAILURE;
}
- else if (isr & I2C_ISR_NACKF) {
+ if (isr & I2C_ISR_STOPF) {
/* Stops the associated DMA streams.*/
dmaStreamDisable(i2cp->dmatx);
dmaStreamDisable(i2cp->dmarx);
- i2cp->errors |= I2CD_ACK_FAILURE;
- wakeup_isr(i2cp, RDY_RESET);
+ if (i2cp->errors) {
+ wakeup_isr(i2cp, RDY_RESET);
+ }
+ else {
+ wakeup_isr(i2cp, RDY_OK);
+ }
}
}
|