Skip to content

Commit

Permalink
stm32/pyb_i2c: Fix pyb.I2C to work with dma=True on F4 MCUs.
Browse files Browse the repository at this point in the history
Prior to this commit, excuting this code:

    i2c = I2C(1, I2C.CONTROLLER, dma=True)
    i2c.send(data, addr=i2c_addr)

the call to i2c.send() does not return and the board needs a reset.  This
code works when dma=False.

According to the specification, I2Cx_EV_IRQHandler should:
- Write DR to address when Start condition generated.
- Clear ADDR by reading SR2 after reading SR2 when address sent.

These processes are included in HAL_I2C_EV_IRQHandler(), however the
firmware size increses about 2KB if HAL_I2C_EV_IRQHandler is called.  This
commit adds above processes to i2c_ev_irq_handler, and increases firmware
by less than 100 bytes.

Fixes issue #2643.
  • Loading branch information
yn386 authored and dpgeorge committed Sep 6, 2022
1 parent 8770cd2 commit da50827
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion ports/stm32/pyb_i2c.c
Expand Up @@ -472,7 +472,17 @@ void i2c_ev_irq_handler(mp_uint_t i2c_id) {

#if defined(STM32F4)

if (hi2c->Instance->SR1 & I2C_FLAG_BTF && hi2c->State == HAL_I2C_STATE_BUSY_TX) {
if (hi2c->Instance->SR1 & I2C_FLAG_SB) {
if (hi2c->State == HAL_I2C_STATE_BUSY_TX) {
hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
} else {
hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
}
} else if (hi2c->Instance->SR1 & I2C_FLAG_ADDR) {
__IO uint32_t tmp_sr2;
tmp_sr2 = hi2c->Instance->SR2;
UNUSED(tmp_sr2);
} else if (hi2c->Instance->SR1 & I2C_FLAG_BTF && hi2c->State == HAL_I2C_STATE_BUSY_TX) {
if (hi2c->XferCount != 0U) {
hi2c->Instance->DR = *hi2c->pBuffPtr++;
hi2c->XferCount--;
Expand Down

0 comments on commit da50827

Please sign in to comment.