aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTimofey Titovets <nefelim4ag@gmail.com>2025-05-20 04:10:52 +0200
committerKevinOConnor <kevin@koconnor.net>2025-05-26 18:44:29 -0400
commit14685bf77f9ea4c950e8be8ad870c7221c3d82a4 (patch)
treeb06940ad864c697e55a7aece3578d2065774b22c /src
parentb1011e3fb14df7470d9b74e59042383012b199c6 (diff)
downloadkutter-14685bf77f9ea4c950e8be8ad870c7221c3d82a4.tar.gz
kutter-14685bf77f9ea4c950e8be8ad870c7221c3d82a4.tar.xz
kutter-14685bf77f9ea4c950e8be8ad870c7221c3d82a4.zip
rp2040: add a delay on SCK polarity change
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/rp2040/spi.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/rp2040/spi.c b/src/rp2040/spi.c
index d2c8df95..57231966 100644
--- a/src/rp2040/spi.c
+++ b/src/rp2040/spi.c
@@ -10,6 +10,7 @@
#include "internal.h" // pclock, gpio_peripheral
#include "hardware/structs/spi.h" // spi_hw_t
#include "hardware/regs/resets.h" // RESETS_RESET_SPI*_BITS
+#include "board/misc.h" // timer_is_before
DECL_ENUMERATION("spi_bus", "spi0_gpio0_gpio3_gpio2", 0);
@@ -115,10 +116,16 @@ spi_prepare(struct spi_config config)
spi_hw_t *spi = config.spi;
if (spi->cr0 == config.cr0 && spi->cpsr == config.cpsr)
return;
+ uint32_t diff = spi->cr0 ^ config.cr0;
spi->cr1 = 0;
spi->cr0 = config.cr0;
spi->cpsr = config.cpsr;
spi->cr1 = SPI_SSPCR1_SSE_BITS;
+ // Give time for state to update before caller changes CS pin
+ uint32_t end = timer_read_time() + timer_from_us(1);
+ if (diff & SPI_SSPCR0_SPO_BITS)
+ while (timer_is_before(timer_read_time(), end))
+ ;
}
void