SPIv2 support added to L4 and L4+ families. Made GPIOv2 and GPIOv3 definitions more compatible (L4 affected).

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@14955 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2021-10-26 10:42:40 +00:00
parent 205c3ab699
commit b73feac604
14 changed files with 141 additions and 84 deletions

View File

@ -61,10 +61,10 @@
#define PAL_STM32_OTYPE_OPENDRAIN (1U << 2U)
#define PAL_STM32_OSPEED_MASK (3U << 3U)
#define PAL_STM32_OSPEED_LOW (0U << 3U)
#define PAL_STM32_OSPEED_MEDIUM (1U << 3U)
#define PAL_STM32_OSPEED_FAST (2U << 3U)
#define PAL_STM32_OSPEED_HIGH (3U << 3U)
#define PAL_STM32_OSPEED_LOWEST (0U << 3U)
#define PAL_STM32_OSPEED_MID1 (1U << 3U)
#define PAL_STM32_OSPEED_MID2 (2U << 3U)
#define PAL_STM32_OSPEED_HIGHEST (3U << 3U)
#define PAL_STM32_PUPDR_MASK (3U << 5U)
#define PAL_STM32_PUPDR_FLOATING (0U << 5U)

View File

@ -44,6 +44,11 @@
/* Driver constants. */
/*===========================================================================*/
/**
* @brief Requires use of SPIv2 driver model.
*/
#define HAL_LLD_SELECT_SPI_V2 TRUE
/**
* @name Platform identification
* @{

View File

@ -39,7 +39,7 @@ include $(CHIBIOS)/os/hal/ports/STM32/LLD/RCCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv3/driver.mk

View File

@ -39,7 +39,7 @@ include $(CHIBIOS)/os/hal/ports/STM32/LLD/RCCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv3/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv3/driver.mk

View File

@ -44,6 +44,11 @@
/* Driver constants. */
/*===========================================================================*/
/**
* @brief Requires use of SPIv2 driver model.
*/
#define HAL_LLD_SELECT_SPI_V2 TRUE
/**
* @name Platform identification
* @{

View File

@ -40,7 +40,7 @@ include $(CHIBIOS)/os/hal/ports/STM32/LLD/RCCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv2/driver.mk

View File

@ -36,7 +36,7 @@ include $(CHIBIOS)/os/hal/ports/STM32/LLD/RCCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RNGv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv3/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv2/driver.mk

View File

@ -40,7 +40,7 @@ include $(CHIBIOS)/os/hal/ports/STM32/LLD/RTCv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SDMMCv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SPIv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/SYSTICKv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/TIMv1/driver_v2.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USARTv2/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/USBv1/driver.mk
include $(CHIBIOS)/os/hal/ports/STM32/LLD/xWDGv1/driver.mk

View File

@ -35,41 +35,48 @@
/*===========================================================================*/
void spi_circular_cb(SPIDriver *spip);
void spi_error_cb(SPIDriver *spip);
/*
* Circular SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first).
* Circular SPI configuration (20MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig c_spicfg = {
true,
spi_circular_cb,
GPIOB,
12,
0,
0
.circular = true,
.slave = false,
.data_cb = spi_circular_cb,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first).
* Maximum speed SPI configuration (20MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig hs_spicfg = {
false,
NULL,
GPIOB,
12,
0,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first).
* Low speed SPI configuration (625kHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig ls_spicfg = {
false,
NULL,
GPIOB,
12,
SPI_CR1_BR_2 | SPI_CR1_BR_1,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_2 | SPI_CR1_BR_1,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*===========================================================================*/
@ -94,13 +101,13 @@ void portab_setup(void) {
* SPI2 I/O pins setup.
*/
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New SCK. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 SCK. */
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MISO. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MISO. */
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MOSI. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MOSI. */
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL |
PAL_STM32_OSPEED_HIGH); /* New CS. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 CS. */
palSetPad(GPIOB, 12);
}

View File

@ -312,7 +312,7 @@
*/
#define STM32_SPI_USE_SPI1 FALSE
#define STM32_SPI_USE_SPI2 TRUE
#define STM32_SPI_USE_SPI3 FALSE
#define STM32_SPI_USE_SPI3 TRUE
#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY
#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID_ANY
#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID_ANY

View File

@ -35,41 +35,60 @@
/*===========================================================================*/
void spi_circular_cb(SPIDriver *spip);
void spi_error_cb(SPIDriver *spip);
/*
* Circular SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first).
* Circular SPI configuration (30MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig c_spicfg = {
true,
spi_circular_cb,
GPIOB,
12,
0,
0
.circular = true,
.slave = false,
.data_cb = spi_circular_cb,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Maximum speed SPI configuration (21MHz, CPHA=0, CPOL=0, MSb first).
* Maximum speed SPI configuration (30MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig hs_spicfg = {
false,
NULL,
GPIOB,
12,
0,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Low speed SPI configuration (328.125kHz, CPHA=0, CPOL=0, MSb first).
* Low speed SPI configuration (937.5kHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig ls_spicfg = {
false,
NULL,
GPIOB,
12,
SPI_CR1_BR_2 | SPI_CR1_BR_1,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_2 | SPI_CR1_BR_1,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Slave SPI configuration (CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig sl_spicfg = {
.circular = false,
.slave = true,
.data_cb = NULL,
.error_cb = spi_error_cb,
.cr1 = 0U,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*===========================================================================*/
@ -94,14 +113,26 @@ void portab_setup(void) {
* SPI2 I/O pins setup.
*/
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New SCK. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 SCK. */
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MISO. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MISO. */
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MOSI. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MOSI. */
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL |
PAL_STM32_OSPEED_HIGH); /* New CS. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 CS. */
palSetPad(GPIOB, 12);
/*
* SPI3 I/O pins setup.
*/
palSetPadMode(GPIOB, 3, PAL_MODE_ALTERNATE(6) |
PAL_STM32_OSPEED_HIGHEST); /* SPI3 SCK. */
palSetPadMode(GPIOB, 4, PAL_MODE_ALTERNATE(6) |
PAL_STM32_OSPEED_HIGHEST); /* SPI3 MISO. */
palSetPadMode(GPIOB, 5, PAL_MODE_ALTERNATE(6) |
PAL_STM32_OSPEED_HIGHEST); /* SPI3 MOSI. */
palSetPadMode(GPIOA, 4, PAL_MODE_ALTERNATE(6) |
PAL_STM32_OSPEED_HIGHEST); /* SPI3 NSSS. */
}
/** @} */

View File

@ -38,6 +38,7 @@
#define PORTAB_BUTTON_PRESSED PAL_HIGH
#define PORTAB_SPI1 SPID2
#define PORTAB_SPI2 SPID3
/*===========================================================================*/
/* Module pre-compile time settings. */
@ -62,6 +63,7 @@
extern const SPIConfig c_spicfg;
extern const SPIConfig hs_spicfg;
extern const SPIConfig ls_spicfg;
extern const SPIConfig sl_spicfg;
#ifdef __cplusplus
extern "C" {

View File

@ -35,41 +35,48 @@
/*===========================================================================*/
void spi_circular_cb(SPIDriver *spip);
void spi_error_cb(SPIDriver *spip);
/*
* Circular SPI configuration (30MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig c_spicfg = {
true,
spi_circular_cb,
GPIOB,
12,
0,
0
.circular = true,
.slave = false,
.data_cb = spi_circular_cb,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Maximum speed SPI configuration (30MHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig hs_spicfg = {
false,
NULL,
GPIOB,
12,
0,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_0,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*
* Low speed SPI configuration (468.75kHz, CPHA=0, CPOL=0, MSb first).
* Low speed SPI configuration (937.5kHz, CPHA=0, CPOL=0, MSb first).
*/
const SPIConfig ls_spicfg = {
false,
NULL,
GPIOB,
12,
SPI_CR1_BR_2 | SPI_CR1_BR_1,
0
.circular = false,
.slave = false,
.data_cb = NULL,
.error_cb = spi_error_cb,
.ssport = GPIOB,
.sspad = 12U,
.cr1 = SPI_CR1_BR_2 | SPI_CR1_BR_1,
.cr2 = SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0
};
/*===========================================================================*/
@ -94,13 +101,13 @@ void portab_setup(void) {
* SPI2 I/O pins setup.
*/
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New SCK. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 SCK. */
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MISO. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MISO. */
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) |
PAL_STM32_OSPEED_HIGH); /* New MOSI. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 MOSI. */
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL |
PAL_STM32_OSPEED_HIGH); /* New CS. */
PAL_STM32_OSPEED_HIGHEST); /* SPI2 CS. */
palSetPad(GPIOB, 12);
}

View File

@ -167,7 +167,7 @@ int main(void) {
txbuf[i] = (uint8_t)i;
cacheBufferFlush(&txbuf[0], sizeof txbuf);
#if SPI_SUPPORTS_SLAVE_MODE == TRUE
#if (SPI_SUPPORTS_SLAVE_MODE == TRUE) && defined(PORTAB_SPI2)
spiStart(&PORTAB_SPI1, &hs_spicfg); /* Master transfer parameters. */
spiStart(&PORTAB_SPI2, &sl_spicfg); /* Slave transfer parameters. */
do {