diff options
| author | yn386 <wf.yn386@gmail.com> | 2022-08-31 19:13:00 +0900 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2022-09-06 16:13:47 +1000 |
| commit | da50827657d6bc3024dd6acea76cb315d1cbbae1 (patch) | |
| tree | 775e62e58193b35989349beb22300deaef0296bf | |
| parent | 8770cd2f4d24b1ad14c934b4161e42108fe98f84 (diff) | |
stm32/pyb_i2c: Fix pyb.I2C to work with dma=True on F4 MCUs.
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.
| -rw-r--r-- | ports/stm32/pyb_i2c.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/ports/stm32/pyb_i2c.c b/ports/stm32/pyb_i2c.c index 436b1c9bc..e9877422c 100644 --- a/ports/stm32/pyb_i2c.c +++ b/ports/stm32/pyb_i2c.c @@ -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--; |
