From 78d16672e1bbc2727b879ecaa8ce12be69616c1e Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 29 Jul 2025 00:19:24 +1000 Subject: [PATCH] stm32/i2cslave: Account for slow addr_match callback. Signed-off-by: Damien George --- ports/stm32/i2cslave.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/stm32/i2cslave.c b/ports/stm32/i2cslave.c index f3bb232f7f..0e4fbf4891 100644 --- a/ports/stm32/i2cslave.c +++ b/ports/stm32/i2cslave.c @@ -94,6 +94,9 @@ void i2c_slave_irq_handler(i2c_slave_t *i2c) { i2c->ISR = I2C_ISR_TXE; i2c->ICR = I2C_ICR_ADDRCF; i2c_slave_process_addr_match(i2c, (i2c->ISR >> I2C_ISR_DIR_Pos) & 1); + // Re-read ISR in case i2c_slave_process_addr_match() took some time + // to process and TXIS/RXNE was set in the meantime. + isr = i2c->ISR; } if (isr & I2C_ISR_TXIS) { // This callback must call i2c_slave_write_byte.