diff options
Diffstat (limited to 'platforms/chibios/drivers/spi_master.c')
-rw-r--r-- | platforms/chibios/drivers/spi_master.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/platforms/chibios/drivers/spi_master.c b/platforms/chibios/drivers/spi_master.c index cbe765e233..6417b7077f 100644 --- a/platforms/chibios/drivers/spi_master.c +++ b/platforms/chibios/drivers/spi_master.c @@ -103,9 +103,15 @@ bool spi_start_extended(spi_start_config_t *start_config) { roundedDivisor <<= 1; } +# if defined(AT32F415) + if (roundedDivisor < 2 || roundedDivisor > 1024) { + return false; + } +# else if (roundedDivisor < 2 || roundedDivisor > 256) { return false; } +# endif #endif #if defined(K20x) || defined(KL2x) @@ -240,6 +246,59 @@ bool spi_start_extended(spi_start_config_t *start_config) { spiConfig.SSPCR0 |= SPI_SSPCR0_SPH; // Clock phase: sample on second edge transition break; } +#elif defined(AT32F415) + spiConfig.ctrl1 = 0; + + if (lsbFirst) { + spiConfig.ctrl1 |= SPI_CTRL1_LTF; + } + + switch (mode) { + case 0: + break; + case 1: + spiConfig.ctrl1 |= SPI_CTRL1_CLKPHA; + break; + case 2: + spiConfig.ctrl1 |= SPI_CTRL1_CLKPOL; + break; + case 3: + spiConfig.ctrl1 |= SPI_CTRL1_CLKPHA | SPI_CTRL1_CLKPOL; + break; + } + + switch (roundedDivisor) { + case 2: + break; + case 4: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_0; + break; + case 8: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_1; + break; + case 16: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_1 | SPI_CTRL1_MDIV_0; + break; + case 32: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_2; + break; + case 64: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_2 | SPI_CTRL1_MDIV_0; + break; + case 128: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_2 | SPI_CTRL1_MDIV_1; + break; + case 256: + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_2 | SPI_CTRL1_MDIV_1 | SPI_CTRL1_MDIV_0; + break; + case 512: + spiConfig.ctrl2 |= SPI_CTRL1_MDIV_3; + break; + case 1024: + spiConfig.ctrl2 |= SPI_CTRL1_MDIV_3; + spiConfig.ctrl1 |= SPI_CTRL1_MDIV_0; + break; + } #else spiConfig.cr1 = 0; |