aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimofey Titovets <nefelim4ag@gmail.com>2025-01-30 21:24:16 +0100
committerKevinOConnor <kevin@koconnor.net>2025-02-06 12:10:29 -0500
commitfec3e685c92ef263a829a73510c74245d7772c03 (patch)
tree44cdce952c07b91140e242c336677ca68e62bbed
parentb16cb6575d69aa4fd1737e42f19d28aec1fcad89 (diff)
downloadkutter-fec3e685c92ef263a829a73510c74245d7772c03.tar.gz
kutter-fec3e685c92ef263a829a73510c74245d7772c03.tar.xz
kutter-fec3e685c92ef263a829a73510c74245d7772c03.zip
stm32: h7 spi support reload mode & frequency
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
-rw-r--r--src/stm32/gpio.h8
-rw-r--r--src/stm32/stm32h7_spi.c12
2 files changed, 17 insertions, 3 deletions
diff --git a/src/stm32/gpio.h b/src/stm32/gpio.h
index 78f567b8..96105e9b 100644
--- a/src/stm32/gpio.h
+++ b/src/stm32/gpio.h
@@ -38,7 +38,13 @@ void gpio_adc_cancel_sample(struct gpio_adc g);
struct spi_config {
void *spi;
- uint32_t spi_cr1;
+ union {
+ uint32_t spi_cr1;
+ struct {
+ uint8_t div;
+ uint8_t mode;
+ };
+ };
};
struct spi_config spi_setup(uint32_t bus, uint8_t mode, uint32_t rate);
void spi_prepare(struct spi_config config);
diff --git a/src/stm32/stm32h7_spi.c b/src/stm32/stm32h7_spi.c
index ec69f851..35f25e46 100644
--- a/src/stm32/stm32h7_spi.c
+++ b/src/stm32/stm32h7_spi.c
@@ -100,19 +100,27 @@ spi_setup(uint32_t bus, uint8_t mode, uint32_t rate)
while ((pclk >> (div + 1)) > rate && div < 7)
div++;
- uint32_t cr1 = SPI_CR1_SPE;
spi->CFG1 |= (div << SPI_CFG1_MBR_Pos) | (7 << SPI_CFG1_DSIZE_Pos);
CLEAR_BIT(spi->CFG1, SPI_CFG1_CRCSIZE);
spi->CFG2 |= ((mode << SPI_CFG2_CPHA_Pos) | SPI_CFG2_MASTER | SPI_CFG2_SSM
| SPI_CFG2_AFCNTR | SPI_CFG2_SSOE);
spi->CR1 |= SPI_CR1_SSI;
- return (struct spi_config){ .spi = spi, .spi_cr1 = cr1 };
+ return (struct spi_config){ .spi = spi, .div = div, .mode = mode };
}
void
spi_prepare(struct spi_config config)
{
+ uint32_t div = config.div;
+ uint32_t mode = config.mode;
+ SPI_TypeDef *spi = config.spi;
+ // Reload frequency
+ spi->CFG1 = (spi->CFG1 & ~SPI_CFG1_MBR_Msk);
+ spi->CFG1 |= (div << SPI_CFG1_MBR_Pos);
+ // Reload mode
+ spi->CFG2 = (spi->CFG2 & ~SPI_CFG2_CPHA_Msk);
+ spi->CFG2 |= (mode << SPI_CFG2_CPHA_Pos);
}
void