summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryn386 <wf.yn386@gmail.com>2022-08-31 19:13:00 +0900
committerDamien George <damien@micropython.org>2022-09-06 16:13:47 +1000
commitda50827657d6bc3024dd6acea76cb315d1cbbae1 (patch)
tree775e62e58193b35989349beb22300deaef0296bf
parent8770cd2f4d24b1ad14c934b4161e42108fe98f84 (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.c12
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--;