From 806498f099835492ba18e525b446e31a26d3dce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pertti=20Erkkil=C3=A4?= Date: Thu, 24 Aug 2023 14:15:18 +0300 Subject: [PATCH] nRF52: set SPI TX/RX lengths even data is empty. Fixes #3868 (#3877) machine/hrf: Set SPI TX/RX lengths even data is empty. Fixes #3868 --- src/machine/machine_nrf52xxx.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/machine/machine_nrf52xxx.go b/src/machine/machine_nrf52xxx.go index c4605d5820..e35cb02010 100644 --- a/src/machine/machine_nrf52xxx.go +++ b/src/machine/machine_nrf52xxx.go @@ -288,24 +288,27 @@ func (spi SPI) Tx(w, r []byte) error { // supported. for len(r) != 0 || len(w) != 0 { // Prepare the SPI transfer: set the DMA pointers and lengths. - if len(r) != 0 { - spi.Bus.RXD.PTR.Set(uint32(uintptr(unsafe.Pointer(&r[0])))) - n := uint32(len(r)) - if n > 255 { - n = 255 + // read buffer + nr := uint32(len(r)) + if nr > 0 { + if nr > 255 { + nr = 255 } - spi.Bus.RXD.MAXCNT.Set(n) - r = r[n:] + spi.Bus.RXD.PTR.Set(uint32(uintptr(unsafe.Pointer(&r[0])))) + r = r[nr:] } - if len(w) != 0 { - spi.Bus.TXD.PTR.Set(uint32(uintptr(unsafe.Pointer(&w[0])))) - n := uint32(len(w)) - if n > 255 { - n = 255 + spi.Bus.RXD.MAXCNT.Set(nr) + + // write buffer + nw := uint32(len(w)) + if nw > 0 { + if nw > 255 { + nw = 255 } - spi.Bus.TXD.MAXCNT.Set(n) - w = w[n:] + spi.Bus.TXD.PTR.Set(uint32(uintptr(unsafe.Pointer(&w[0])))) + w = w[nw:] } + spi.Bus.TXD.MAXCNT.Set(nw) // Do the transfer. // Note: this can be improved by not waiting until the transfer is