Skip to content

Commit

Permalink
drivers/pinmux: stm32: (FIX) Force very_high speed to SPIx_SCK gpio
Browse files Browse the repository at this point in the history
Fix issue zephyrproject-rtos#9028: last bit of SPI/I2S transaction may be corrupted.
Impacted STM32 SOC series: F0/F1/F2/F3/F4/L0.

Notes:
- F2/F4/L0: set gpio to very_high speed ('11')
- F0/F3: set gpio to high speed ('11').
- F1: set gpio to 50MHz.

Signed-off-by: Armando Visconti <armando.visconti@st.com>
  • Loading branch information
avisconti committed Feb 6, 2019
1 parent 2d9bbdf commit 818a0cf
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 17 deletions.
19 changes: 15 additions & 4 deletions drivers/pinmux/stm32/pinmux_stm32f0.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32F0 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to HIGH ('11') to avoid last data bit
* corruption which is a known issue of STM32F0 SPI peripheral (see errata
* sheets).
*/

#define STM32F0_PINMUX_FUNC_PB6_USART1_TX \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_PULLUP)
#define STM32F0_PINMUX_FUNC_PB7_USART1_RX \
Expand Down Expand Up @@ -54,7 +61,8 @@
#define STM32F0_PINMUX_FUNC_PA4_SPI1_NSS \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PA5_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F0_PINMUX_FUNC_PA6_SPI1_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PA7_SPI1_MOSI \
Expand All @@ -63,7 +71,8 @@
#define STM32F0_PINMUX_FUNC_PA15_SPI1_NSS \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PB3_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F0_PINMUX_FUNC_PB4_SPI1_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PB5_SPI1_MOSI \
Expand All @@ -72,7 +81,8 @@
#define STM32F0_PINMUX_FUNC_PB12_SPI2_NSS \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PB13_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F0_PINMUX_FUNC_PB14_SPI2_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PB15_SPI2_MOSI \
Expand All @@ -82,7 +92,8 @@
#define STM32F0_PINMUX_FUNC_PB9_SPI2_NSS \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PB10_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F0_PINMUX_FUNC_PC2_SPI2_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32F0_PINMUX_FUNC_PC3_SPI2_MOSI \
Expand Down
19 changes: 15 additions & 4 deletions drivers/pinmux/stm32/pinmux_stm32f1.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32F1 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to 50MHz ('11') to avoid last data bit
* corruption which is a known issue of STM32F1 SPI peripheral (see errata
* sheets).
*/

#define STM32F1_PINMUX_FUNC_PA9_USART1_TX STM32_PIN_USART_TX
#define STM32F1_PINMUX_FUNC_PA10_USART1_RX STM32_PIN_USART_RX

Expand All @@ -20,8 +27,10 @@
#define STM32F1_PINMUX_FUNC_PA4_SPI1_MASTER_NSS STM32_PIN_SPI_MASTER_NSS
#define STM32F1_PINMUX_FUNC_PA4_SPI1_MASTER_NSS_OE STM32_PIN_SPI_MASTER_NSS_OE
#define STM32F1_PINMUX_FUNC_PA4_SPI1_SLAVE_NSS STM32_PIN_SPI_SLAVE_NSS
#define STM32F1_PINMUX_FUNC_PA5_SPI1_MASTER_SCK STM32_PIN_SPI_MASTER_SCK
#define STM32F1_PINMUX_FUNC_PA5_SPI1_SLAVE_SCK STM32_PIN_SPI_SLAVE_SCK
#define STM32F1_PINMUX_FUNC_PA5_SPI1_MASTER_SCK STM32_PIN_SPI_MASTER_SCK | \
STM32_MODE_OUTPUT_MAX_50
#define STM32F1_PINMUX_FUNC_PA5_SPI1_SLAVE_SCK STM32_PIN_SPI_SLAVE_SCK | \
STM32_MODE_OUTPUT_MAX_50
#define STM32F1_PINMUX_FUNC_PA6_SPI1_MASTER_MISO STM32_PIN_SPI_MASTER_MISO
#define STM32F1_PINMUX_FUNC_PA6_SPI1_SLAVE_MISO STM32_PIN_SPI_SLAVE_MISO
#define STM32F1_PINMUX_FUNC_PA7_SPI1_MASTER_MOSI STM32_PIN_SPI_MASTER_MOSI
Expand Down Expand Up @@ -50,8 +59,10 @@
#define STM32F1_PINMUX_FUNC_PB12_SPI2_MASTER_NSS STM32_PIN_SPI_MASTER_NSS
#define STM32F1_PINMUX_FUNC_PB12_SPI2_MASTER_NSS_OE STM32_PIN_SPI_MASTER_NSS_OE
#define STM32F1_PINMUX_FUNC_PB12_SPI2_SLAVE_NSS STM32_PIN_SPI_SLAVE_NSS
#define STM32F1_PINMUX_FUNC_PB13_SPI2_MASTER_SCK STM32_PIN_SPI_MASTER_SCK
#define STM32F1_PINMUX_FUNC_PB13_SPI2_SLAVE_SCK STM32_PIN_SPI_SLAVE_SCK
#define STM32F1_PINMUX_FUNC_PB13_SPI2_MASTER_SCK STM32_PIN_SPI_MASTER_SCK | \
STM32_MODE_OUTPUT_MAX_50
#define STM32F1_PINMUX_FUNC_PB13_SPI2_SLAVE_SCK STM32_PIN_SPI_SLAVE_SCK | \
STM32_MODE_OUTPUT_MAX_50
#define STM32F1_PINMUX_FUNC_PB14_SPI2_MASTER_MISO STM32_PIN_SPI_MASTER_MISO
#define STM32F1_PINMUX_FUNC_PB14_SPI2_SLAVE_MISO STM32_PIN_SPI_SLAVE_MISO
#define STM32F1_PINMUX_FUNC_PB15_SPI2_MASTER_MOSI STM32_PIN_SPI_MASTER_MOSI
Expand Down
7 changes: 7 additions & 0 deletions drivers/pinmux/stm32/pinmux_stm32f2.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32F2 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to VERY_HIGH to avoid last data bit
* corruption which is a known issue of STM32F2 SPI peripheral (see errata
* sheets).
*/

/* Port A */
#define STM32F2_PINMUX_FUNC_PA0_UART4_TX \
(STM32_PINMUX_ALT_FUNC_8 | STM32_PUSHPULL_PULLUP)
Expand Down
13 changes: 11 additions & 2 deletions drivers/pinmux/stm32/pinmux_stm32f3.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32F3 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to HIGH ('11') to avoid last data bit
* corruption which is a known issue of STM32F3 SPI peripheral (see errata
* sheets).
*/

#define STM32F3_PINMUX_FUNC_PA9_USART1_TX \
(STM32_PINMUX_ALT_FUNC_7 | STM32_PUSHPULL_PULLUP)
#define STM32F3_PINMUX_FUNC_PA10_USART1_RX \
Expand Down Expand Up @@ -80,7 +87,8 @@
#define STM32F3_PINMUX_FUNC_PA4_SPI1_NSS \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32F3_PINMUX_FUNC_PA5_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F3_PINMUX_FUNC_PA6_SPI1_MISO \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32F3_PINMUX_FUNC_PA7_SPI1_MOSI \
Expand All @@ -100,7 +108,8 @@
#define STM32F3_PINMUX_FUNC_PB12_SPI2_NSS \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32F3_PINMUX_FUNC_PB13_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F3_PINMUX_FUNC_PB14_SPI2_MISO \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32F3_PINMUX_FUNC_PB15_SPI2_MOSI \
Expand Down
16 changes: 13 additions & 3 deletions drivers/pinmux/stm32/pinmux_stm32f4.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32F4 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to VERY_HIGH to avoid last data bit
* corruption which is a known issue of STM32F4 SPI peripheral (see errata
* sheets).
*/

/* Port A */
#define STM32F4_PINMUX_FUNC_PA0_PWM2_CH1 \
(STM32_PINMUX_ALT_FUNC_1 | STM32_PUSHPULL_PULLUP)
Expand Down Expand Up @@ -48,7 +55,8 @@
(STM32_PINMUX_ALT_FUNC_6 | STM32_PUSHPULL_NOPULL)

#define STM32F4_PINMUX_FUNC_PA5_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F4_PINMUX_FUNC_PA5_I2S1_CK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)

Expand Down Expand Up @@ -198,7 +206,8 @@
STM32_OSPEEDR_VERY_HIGH_SPEED)

#define STM32F4_PINMUX_FUNC_PB13_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32F4_PINMUX_FUNC_PB13_I2S2_CK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32F4_PINMUX_FUNC_PB13_I2S4_CK \
Expand Down Expand Up @@ -292,7 +301,8 @@
(STM32_PINMUX_ALT_FUNC_8 | STM32_PUSHPULL_NOPULL)

#define STM32F4_PINMUX_FUNC_PD3_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_VERY_HIGH_SPEED)

#define STM32F4_PINMUX_FUNC_PD5_USART2_TX \
(STM32_PINMUX_ALT_FUNC_7 | STM32_PUSHPULL_PULLUP)
Expand Down
15 changes: 11 additions & 4 deletions drivers/pinmux/stm32/pinmux_stm32l0.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
* @file Header for STM32L0 pin multiplexing helper
*/

/*
* Note:
* The SPIx_SCK pin speed must be set to VERY_HIGH to avoid last data bit
* corruption which is a known issue of STM32L0 SPI peripheral (see errata
* sheets).
*/

#define STM32L0_PINMUX_FUNC_PB6_USART1_TX \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_PULLUP)
#define STM32L0_PINMUX_FUNC_PB7_USART1_RX \
Expand Down Expand Up @@ -65,7 +72,7 @@
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PA5_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_HIGH_SPEED)
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32L0_PINMUX_FUNC_PA6_SPI1_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PA7_SPI1_MOSI \
Expand All @@ -75,7 +82,7 @@
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PB3_SPI1_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_HIGH_SPEED)
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32L0_PINMUX_FUNC_PB4_SPI1_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PB5_SPI1_MOSI \
Expand All @@ -85,7 +92,7 @@
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PB13_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_HIGH_SPEED)
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32L0_PINMUX_FUNC_PB14_SPI2_MISO \
(STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PB15_SPI2_MOSI \
Expand All @@ -95,7 +102,7 @@
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PB10_SPI2_SCK \
(STM32_PINMUX_ALT_FUNC_5 | STM32_PUSHPULL_NOPULL | \
STM32_OSPEEDR_HIGH_SPEED)
STM32_OSPEEDR_VERY_HIGH_SPEED)
#define STM32L0_PINMUX_FUNC_PC2_SPI2_MISO \
(STM32_PINMUX_ALT_FUNC_2 | STM32_PUSHPULL_NOPULL)
#define STM32L0_PINMUX_FUNC_PC3_SPI2_MOSI \
Expand Down

0 comments on commit 818a0cf

Please sign in to comment.