From 790e808deba36233daeead2d1ed4ba438de05d8a Mon Sep 17 00:00:00 2001 From: chrysn Date: Thu, 25 Jan 2024 16:37:47 +0100 Subject: [PATCH] cpu/nrf52 i2c: Wait for complete transmission when writing NOSTOP --- cpu/nrf5x_common/periph/i2c_nrf52_nrf9160.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cpu/nrf5x_common/periph/i2c_nrf52_nrf9160.c b/cpu/nrf5x_common/periph/i2c_nrf52_nrf9160.c index 288de2607422..7d7a790bffce 100644 --- a/cpu/nrf5x_common/periph/i2c_nrf52_nrf9160.c +++ b/cpu/nrf5x_common/periph/i2c_nrf52_nrf9160.c @@ -126,6 +126,16 @@ static int finish(i2c_t dev, int inten_success_flag) DEBUG("[i2c] finish: stop event occurred\n"); } + if (inten_success_flag & TWIM_INTEN_LASTTX_Msk) { + /* The interrupt is raised already when the last TX is started, but we + * have to wait until it was actually transmitted lest the transmission + * would be suppressed immediately by the next following write -- + * careful here: enabling DEBUG introduces enough latency that the + * issue doesn't show up any more. */ + while (bus(dev)->TXD.AMOUNT != bus(dev)->TXD.MAXCNT && + !bus(dev)->EVENTS_ERROR) {} + } + if (bus(dev)->EVENTS_ERROR) { bus(dev)->EVENTS_ERROR = 0; if (bus(dev)->ERRORSRC & TWIM_ERRORSRC_ANACK_Msk) {