diff options
author | Timofey Titovets <nefelim4ag@gmail.com> | 2025-05-20 04:10:52 +0200 |
---|---|---|
committer | KevinOConnor <kevin@koconnor.net> | 2025-05-26 18:44:29 -0400 |
commit | 14685bf77f9ea4c950e8be8ad870c7221c3d82a4 (patch) | |
tree | b06940ad864c697e55a7aece3578d2065774b22c /src | |
parent | b1011e3fb14df7470d9b74e59042383012b199c6 (diff) | |
download | kutter-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.c | 7 |
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 |