From 169d5f17b879a05145ce47ea4fb4af898b23b9d8 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Mon, 8 Jun 2020 16:25:31 +0200 Subject: [PATCH] nrf: fix bug in SPI.Tx There was what appears to be a race condition in the Tx function. While it would work fine in many cases, when there were interrupts (such as when using BLE), the function would just hang waiting for `EVENTS_READY` to arrive. I think what was happening was that the `spi.Bus.RXD.Get()` would start the next transfer, which would complete (and generate an event) before `EVENTS_READY` was reset to 0. The fix is easy: clear `EVENTS_READY` before doing something that can trigger an event. I believe I've seen this bug before on the PineTime but I couldn't find the issue back then. --- src/machine/machine_nrf.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_nrf.go b/src/machine/machine_nrf.go index 382dd05c..3d65ad57 100644 --- a/src/machine/machine_nrf.go +++ b/src/machine/machine_nrf.go @@ -443,13 +443,13 @@ func (spi SPI) Tx(w, r []byte) error { spi.Bus.TXD.Set(uint32(b)) for spi.Bus.EVENTS_READY.Get() == 0 { } - _ = spi.Bus.RXD.Get() spi.Bus.EVENTS_READY.Set(0) + _ = spi.Bus.RXD.Get() } for spi.Bus.EVENTS_READY.Get() == 0 { } - _ = spi.Bus.RXD.Get() spi.Bus.EVENTS_READY.Set(0) + _ = spi.Bus.RXD.Get() default: // write/read