From d1e24e796efac7aeb29f5d7b7c679d9f23095b5b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 2 Apr 2013 18:08:00 +0000 Subject: [PATCH] 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 | 27 ++++++++++++++------------ testhal/STM32F37x/I2C/main.c | 1 + 2 files changed, 16 insertions(+), 12 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); - - wakeup_isr(i2cp, RDY_OK); - } - else if (isr & I2C_ISR_NACKF) { - /* 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; i2cp->errors |= I2CD_ACK_FAILURE; - wakeup_isr(i2cp, RDY_RESET); + } + if (isr & I2C_ISR_STOPF) { + /* Stops the associated DMA streams.*/ + dmaStreamDisable(i2cp->dmatx); + dmaStreamDisable(i2cp->dmarx); + + if (i2cp->errors) { + wakeup_isr(i2cp, RDY_RESET); + } + else { + wakeup_isr(i2cp, RDY_OK); + } } } diff --git a/testhal/STM32F37x/I2C/main.c b/testhal/STM32F37x/I2C/main.c index 194f61f89..113515d39 100644 --- a/testhal/STM32F37x/I2C/main.c +++ b/testhal/STM32F37x/I2C/main.c @@ -103,6 +103,7 @@ int main(void) { chSysHalt(); } chThdSleepMilliseconds(500); + palTogglePad(GPIOC, GPIOC_LED2); } return 0; }