From d1e24e796efac7aeb29f5d7b7c679d9f23095b5b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 2 Apr 2013 18:08:00 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5538 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/STM32/I2Cv2/i2c_lld.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'os/hal/platforms') 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); + } } } -- cgit v1.2.3