/** * @brief DMA TX end IRQ handler. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ static void i2c_lld_serve_tx_end_irq(I2CDriver *i2cp, uint32_t flags) { /* DMA errors handling.*/ #if defined(STM32_I2C_DMA_ERROR_HOOK) if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { STM32_I2C_DMA_ERROR_HOOK(i2cp); } #else (void)flags; #endif dmaStreamDisable(i2cp->dmatx); }
/** * @brief DMA RX end IRQ handler. * * @param[in] i2cp pointer to the @p I2CDriver object * @param[in] flags pre-shifted content of the ISR register * * @notapi */ static void i2c_lld_serve_rx_end_irq(I2CDriver *i2cp, uint32_t flags) { I2C_TypeDef *dp = i2cp->i2c; /* DMA errors handling.*/ #if defined(STM32_I2C_DMA_ERROR_HOOK) if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { STM32_I2C_DMA_ERROR_HOOK(i2cp); } #else (void)flags; #endif dmaStreamDisable(i2cp->dmarx); dp->CR2 |= I2C_CR2_STOP; wakeup_isr(i2cp, RDY_OK); }
/** * @brief DMA TX end IRQ handler. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ static void i2c_lld_serve_tx_end_irq(I2CDriver *i2cp, uint32_t flags) { I2C_TypeDef *dp = i2cp->i2c; /* DMA errors handling.*/ #if defined(STM32_I2C_DMA_ERROR_HOOK) if ((flags & (STM32_DMA_ISR_TEIF | STM32_DMA_ISR_DMEIF)) != 0) { STM32_I2C_DMA_ERROR_HOOK(i2cp); } #else (void)flags; #endif dmaStreamDisable(i2cp->dmatx); /* Enables interrupts to catch BTF event meaning transmission part complete. Interrupt handler will decide to generate STOP or to begin receiving part of R/W transaction itself.*/ dp->CR2 |= I2C_CR2_ITEVTEN; }