aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimofey Titovets <nefelim4ag@gmail.com>2025-05-16 20:15:02 +0200
committerKevinOConnor <kevin@koconnor.net>2025-05-19 12:21:33 -0400
commit3a015cd00d0ceaeb001e5777e9588394bff76a48 (patch)
tree5d7ca212b0601958b7fc20b1601895c824ec6ef0
parent841a9ca2f7f9a4c4dda7a3bcd1f703c863a50e75 (diff)
downloadkutter-3a015cd00d0ceaeb001e5777e9588394bff76a48.tar.gz
kutter-3a015cd00d0ceaeb001e5777e9588394bff76a48.tar.xz
kutter-3a015cd00d0ceaeb001e5777e9588394bff76a48.zip
stm32: H7 spi enable use of fifo
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
-rw-r--r--src/stm32/stm32h7_spi.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/stm32/stm32h7_spi.c b/src/stm32/stm32h7_spi.c
index e9bcd5a8..9e5aef5b 100644
--- a/src/stm32/stm32h7_spi.c
+++ b/src/stm32/stm32h7_spi.c
@@ -122,6 +122,8 @@ spi_transfer(struct spi_config config, uint8_t receive_data,
uint8_t len, uint8_t *data)
{
uint8_t rdata = 0;
+ uint8_t* wptr = data;
+ uint8_t* end = data + len;
SPI_TypeDef *spi = config.spi;
spi->CR2 = len << SPI_CR2_TSIZE_Pos;
@@ -129,10 +131,12 @@ spi_transfer(struct spi_config config, uint8_t receive_data,
spi->CR1 = SPI_CR1_SSI | SPI_CR1_SPE;
spi->CR1 = SPI_CR1_SSI | SPI_CR1_CSTART | SPI_CR1_SPE;
- while (len--) {
- writeb((void *)&spi->TXDR, *data);
- while ((spi->SR & (SPI_SR_RXWNE | SPI_SR_RXPLVL)) == 0)
- ;
+ while (data < end) {
+ uint32_t sr = spi->SR & (SPI_SR_TXP | SPI_SR_RXP);
+ if ((sr == SPI_SR_TXP) && wptr < end)
+ writeb((void*)&spi->TXDR, *wptr++);
+ if (!(sr & SPI_SR_RXP))
+ continue;
rdata = readb((void *)&spi->RXDR);
if (receive_data) {