/** * @brief Deactivates the I2C peripheral. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ void i2c_lld_stop(I2CDriver *i2cp) { /* If not in stopped state then disables the I2C clock.*/ if (i2cp->state != I2C_STOP) { /* I2C disable.*/ i2c_lld_abort_operation(i2cp); dmaStreamRelease(i2cp->dmatx); dmaStreamRelease(i2cp->dmarx); #if STM32_I2C_USE_I2C1 if (&I2CD1 == i2cp) { nvicDisableVector(I2C1_EV_IRQn); nvicDisableVector(I2C1_ER_IRQn); rccDisableI2C1(FALSE); } #endif #if STM32_I2C_USE_I2C2 if (&I2CD2 == i2cp) { nvicDisableVector(I2C2_EV_IRQn); nvicDisableVector(I2C2_ER_IRQn); rccDisableI2C2(FALSE); } #endif #if STM32_I2C_USE_I2C3 if (&I2CD3 == i2cp) { nvicDisableVector(I2C3_EV_IRQn); nvicDisableVector(I2C3_ER_IRQn); rccDisableI2C3(FALSE); } #endif } }
/** * @brief Handling of stalled I2C transactions. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ static void i2c_lld_safety_timeout(void *p) { I2CDriver *i2cp = (I2CDriver *)p; if (i2cp->thread) { i2c_lld_abort_operation(i2cp); i2cp->thread->p_u.rdymsg = RDY_TIMEOUT; chSchReadyI(i2cp->thread); } }
/** * @brief Handling of stalled I2C transactions. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ static void i2c_lld_safety_timeout(void *p) { I2CDriver *i2cp = (I2CDriver *)p; chSysLockFromIsr(); if (i2cp->thread) { Thread *tp = i2cp->thread; i2c_lld_abort_operation(i2cp); i2cp->thread = NULL; tp->p_u.rdymsg = RDY_TIMEOUT; chSchReadyI(tp); } chSysUnlockFromIsr(); }
/** * @brief Deactivates the I2C peripheral. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ void i2c_lld_stop(I2CDriver *i2cp) { /* If not in stopped state then disables the I2C clock.*/ if (i2cp->state != I2C_STOP) { /* I2C disable.*/ i2c_lld_abort_operation(i2cp); #if STM32_I2C_USE_DMA == TRUE dmaStreamRelease(i2cp->dmatx); dmaStreamRelease(i2cp->dmarx); #endif #if STM32_I2C_USE_I2C1 if (&I2CD1 == i2cp) { #if defined(STM32_I2C1_GLOBAL_NUMBER) || defined(__DOXYGEN__) nvicDisableVector(STM32_I2C1_GLOBAL_NUMBER); #elif defined(STM32_I2C1_EVENT_NUMBER) && defined(STM32_I2C1_ERROR_NUMBER) nvicDisableVector(STM32_I2C1_EVENT_NUMBER); nvicDisableVector(STM32_I2C1_ERROR_NUMBER); #else #error "I2C1 interrupt numbers not defined" #endif rccDisableI2C1(FALSE); } #endif #if STM32_I2C_USE_I2C2 if (&I2CD2 == i2cp) { #if defined(STM32_I2C2_GLOBAL_NUMBER) || defined(__DOXYGEN__) nvicDisableVector(STM32_I2C2_GLOBAL_NUMBER); #elif defined(STM32_I2C2_EVENT_NUMBER) && defined(STM32_I2C2_ERROR_NUMBER) nvicDisableVector(STM32_I2C2_EVENT_NUMBER); nvicDisableVector(STM32_I2C2_ERROR_NUMBER); #else #error "I2C2 interrupt numbers not defined" #endif rccDisableI2C2(FALSE); } #endif } }