diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/chibios/spi_master.c | 70 | ||||
| -rw-r--r-- | drivers/chibios/spi_master.h | 19 |
2 files changed, 78 insertions, 11 deletions
diff --git a/drivers/chibios/spi_master.c b/drivers/chibios/spi_master.c index 4852a6eba..28ddcbb2b 100644 --- a/drivers/chibios/spi_master.c +++ b/drivers/chibios/spi_master.c | |||
| @@ -18,8 +18,13 @@ | |||
| 18 | 18 | ||
| 19 | #include "timer.h" | 19 | #include "timer.h" |
| 20 | 20 | ||
| 21 | static pin_t currentSlavePin = NO_PIN; | 21 | static pin_t currentSlavePin = NO_PIN; |
| 22 | static SPIConfig spiConfig = {false, NULL, 0, 0, 0, 0}; | 22 | |
| 23 | #if defined(K20x) || defined(KL2x) | ||
| 24 | static SPIConfig spiConfig = {NULL, 0, 0, 0}; | ||
| 25 | #else | ||
| 26 | static SPIConfig spiConfig = {false, NULL, 0, 0, 0, 0}; | ||
| 27 | #endif | ||
| 23 | 28 | ||
| 24 | __attribute__((weak)) void spi_init(void) { | 29 | __attribute__((weak)) void spi_init(void) { |
| 25 | static bool is_initialised = false; | 30 | static bool is_initialised = false; |
| @@ -27,15 +32,15 @@ __attribute__((weak)) void spi_init(void) { | |||
| 27 | is_initialised = true; | 32 | is_initialised = true; |
| 28 | 33 | ||
| 29 | // Try releasing special pins for a short time | 34 | // Try releasing special pins for a short time |
| 30 | palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_INPUT); | 35 | setPinInput(SPI_SCK_PIN); |
| 31 | palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_INPUT); | 36 | setPinInput(SPI_MOSI_PIN); |
| 32 | palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), PAL_MODE_INPUT); | 37 | setPinInput(SPI_MISO_PIN); |
| 33 | 38 | ||
| 34 | chThdSleepMilliseconds(10); | 39 | chThdSleepMilliseconds(10); |
| 35 | #if defined(USE_GPIOV1) | 40 | #if defined(USE_GPIOV1) |
| 36 | palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL); | 41 | palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), SPI_SCK_PAL_MODE); |
| 37 | palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL); | 42 | palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), SPI_MOSI_PAL_MODE); |
| 38 | palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), PAL_MODE_STM32_ALTERNATE_PUSHPULL); | 43 | palSetPadMode(PAL_PORT(SPI_MISO_PIN), PAL_PAD(SPI_MISO_PIN), SPI_MISO_PAL_MODE); |
| 39 | #else | 44 | #else |
| 40 | palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_ALTERNATE(SPI_SCK_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); | 45 | palSetPadMode(PAL_PORT(SPI_SCK_PIN), PAL_PAD(SPI_SCK_PIN), PAL_MODE_ALTERNATE(SPI_SCK_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); |
| 41 | palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_ALTERNATE(SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); | 46 | palSetPadMode(PAL_PORT(SPI_MOSI_PIN), PAL_PAD(SPI_MOSI_PIN), PAL_MODE_ALTERNATE(SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); |
| @@ -58,6 +63,54 @@ bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor) { | |||
| 58 | return false; | 63 | return false; |
| 59 | } | 64 | } |
| 60 | 65 | ||
| 66 | #if defined(K20x) || defined(KL2x) | ||
| 67 | spiConfig.tar0 = SPIx_CTARn_FMSZ(7) | SPIx_CTARn_ASC(1); | ||
| 68 | |||
| 69 | if (lsbFirst) { | ||
| 70 | spiConfig.tar0 |= SPIx_CTARn_LSBFE; | ||
| 71 | } | ||
| 72 | |||
| 73 | switch (mode) { | ||
| 74 | case 0: | ||
| 75 | break; | ||
| 76 | case 1: | ||
| 77 | spiConfig.tar0 |= SPIx_CTARn_CPHA; | ||
| 78 | break; | ||
| 79 | case 2: | ||
| 80 | spiConfig.tar0 |= SPIx_CTARn_CPOL; | ||
| 81 | break; | ||
| 82 | case 3: | ||
| 83 | spiConfig.tar0 |= SPIx_CTARn_CPHA | SPIx_CTARn_CPOL; | ||
| 84 | break; | ||
| 85 | } | ||
| 86 | |||
| 87 | switch (roundedDivisor) { | ||
| 88 | case 2: | ||
| 89 | spiConfig.tar0 |= SPIx_CTARn_BR(0); | ||
| 90 | break; | ||
| 91 | case 4: | ||
| 92 | spiConfig.tar0 |= SPIx_CTARn_BR(1); | ||
| 93 | break; | ||
| 94 | case 8: | ||
| 95 | spiConfig.tar0 |= SPIx_CTARn_BR(3); | ||
| 96 | break; | ||
| 97 | case 16: | ||
| 98 | spiConfig.tar0 |= SPIx_CTARn_BR(4); | ||
| 99 | break; | ||
| 100 | case 32: | ||
| 101 | spiConfig.tar0 |= SPIx_CTARn_BR(5); | ||
| 102 | break; | ||
| 103 | case 64: | ||
| 104 | spiConfig.tar0 |= SPIx_CTARn_BR(6); | ||
| 105 | break; | ||
| 106 | case 128: | ||
| 107 | spiConfig.tar0 |= SPIx_CTARn_BR(7); | ||
| 108 | break; | ||
| 109 | case 256: | ||
| 110 | spiConfig.tar0 |= SPIx_CTARn_BR(8); | ||
| 111 | break; | ||
| 112 | } | ||
| 113 | #else | ||
| 61 | spiConfig.cr1 = 0; | 114 | spiConfig.cr1 = 0; |
| 62 | 115 | ||
| 63 | if (lsbFirst) { | 116 | if (lsbFirst) { |
| @@ -103,6 +156,7 @@ bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor) { | |||
| 103 | spiConfig.cr1 |= SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0; | 156 | spiConfig.cr1 |= SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0; |
| 104 | break; | 157 | break; |
| 105 | } | 158 | } |
| 159 | #endif | ||
| 106 | 160 | ||
| 107 | currentSlavePin = slavePin; | 161 | currentSlavePin = slavePin; |
| 108 | spiConfig.ssport = PAL_PORT(slavePin); | 162 | spiConfig.ssport = PAL_PORT(slavePin); |
diff --git a/drivers/chibios/spi_master.h b/drivers/chibios/spi_master.h index e93580e31..b5a6ef143 100644 --- a/drivers/chibios/spi_master.h +++ b/drivers/chibios/spi_master.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <stdbool.h> | 21 | #include <stdbool.h> |
| 22 | 22 | ||
| 23 | #include "gpio.h" | 23 | #include "gpio.h" |
| 24 | #include "chibios_config.h" | ||
| 24 | 25 | ||
| 25 | #ifndef SPI_DRIVER | 26 | #ifndef SPI_DRIVER |
| 26 | # define SPI_DRIVER SPID2 | 27 | # define SPI_DRIVER SPID2 |
| @@ -31,7 +32,11 @@ | |||
| 31 | #endif | 32 | #endif |
| 32 | 33 | ||
| 33 | #ifndef SPI_SCK_PAL_MODE | 34 | #ifndef SPI_SCK_PAL_MODE |
| 34 | # define SPI_SCK_PAL_MODE 5 | 35 | # if defined(USE_GPIOV1) |
| 36 | # define SPI_SCK_PAL_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL | ||
| 37 | # else | ||
| 38 | # define SPI_SCK_PAL_MODE 5 | ||
| 39 | # endif | ||
| 35 | #endif | 40 | #endif |
| 36 | 41 | ||
| 37 | #ifndef SPI_MOSI_PIN | 42 | #ifndef SPI_MOSI_PIN |
| @@ -39,7 +44,11 @@ | |||
| 39 | #endif | 44 | #endif |
| 40 | 45 | ||
| 41 | #ifndef SPI_MOSI_PAL_MODE | 46 | #ifndef SPI_MOSI_PAL_MODE |
| 42 | # define SPI_MOSI_PAL_MODE 5 | 47 | # if defined(USE_GPIOV1) |
| 48 | # define SPI_MOSI_PAL_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL | ||
| 49 | # else | ||
| 50 | # define SPI_MOSI_PAL_MODE 5 | ||
| 51 | # endif | ||
| 43 | #endif | 52 | #endif |
| 44 | 53 | ||
| 45 | #ifndef SPI_MISO_PIN | 54 | #ifndef SPI_MISO_PIN |
| @@ -47,7 +56,11 @@ | |||
| 47 | #endif | 56 | #endif |
| 48 | 57 | ||
| 49 | #ifndef SPI_MISO_PAL_MODE | 58 | #ifndef SPI_MISO_PAL_MODE |
| 50 | # define SPI_MISO_PAL_MODE 5 | 59 | # if defined(USE_GPIOV1) |
| 60 | # define SPI_MISO_PAL_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL | ||
| 61 | # else | ||
| 62 | # define SPI_MISO_PAL_MODE 5 | ||
| 63 | # endif | ||
| 51 | #endif | 64 | #endif |
| 52 | 65 | ||
| 53 | typedef int16_t spi_status_t; | 66 | typedef int16_t spi_status_t; |
