Skip to content

Commit c5d8ffe

Browse files
Tobias Badertscherdpgeorge
authored andcommitted
stmhal: Extend SPI support to fully support all SPI devices on STM32F429.
This includes SPI4, SPI5 and SPI6.
1 parent 130fde8 commit c5d8ffe

4 files changed

Lines changed: 162 additions & 12 deletions

File tree

stmhal/boards/STM32F429DISC/mpconfigboard.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include STM32_HAL_H
2+
13
#define MICROPY_HW_BOARD_NAME "F429I-DISCO"
24
#define MICROPY_HW_MCU_NAME "STM32F429"
35

@@ -29,6 +31,32 @@
2931
#define MICROPY_HW_I2C1_SCL (pin_A8)
3032
#define MICROPY_HW_I2C1_SDA (pin_C9)
3133

34+
// SPI busses
35+
//#define MICROPY_HW_SPI1_NSS (pin_A4)
36+
//#define MICROPY_HW_SPI1_SCK (pin_A5)
37+
//#define MICROPY_HW_SPI1_MISO (pin_A6)
38+
//#define MICROPY_HW_SPI1_MOSI (pin_A7)
39+
#if defined(USE_USB_HS_IN_FS)
40+
// The HS USB uses B14 & B15 for D- and D+
41+
#else
42+
#define MICROPY_HW_SPI2_NSS (pin_B12)
43+
#define MICROPY_HW_SPI2_SCK (pin_B13)
44+
#define MICROPY_HW_SPI2_MISO (pin_B14)
45+
#define MICROPY_HW_SPI2_MOSI (pin_B15)
46+
#endif
47+
//#define MICROPY_HW_SPI4_NSS (pin_E11)
48+
//#define MICROPY_HW_SPI4_SCK (pin_E12)
49+
//#define MICROPY_HW_SPI4_MISO (pin_E13)
50+
//#define MICROPY_HW_SPI4_MOSI (pin_E14)
51+
#define MICROPY_HW_SPI5_NSS (pin_F6)
52+
#define MICROPY_HW_SPI5_SCK (pin_F7)
53+
#define MICROPY_HW_SPI5_MISO (pin_F8)
54+
#define MICROPY_HW_SPI5_MOSI (pin_F9)
55+
//#define MICROPY_HW_SPI6_NSS (pin_G8)
56+
//#define MICROPY_HW_SPI6_SCK (pin_G13)
57+
//#define MICROPY_HW_SPI6_MISO (pin_G12)
58+
//#define MICROPY_HW_SPI6_MOSI (pin_G14)
59+
3260
// USRSW is pulled low. Pressing the button makes the input go high.
3361
#define MICROPY_HW_USRSW_PIN (pin_A0)
3462
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)

stmhal/dma.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,30 @@
7474
#define DMA_STREAM_SPI1_RX DMA2_Stream2
7575
#define DMA_CHANNEL_SPI1_RX DMA_CHANNEL_3
7676

77+
#define DMA_STREAM_SPI5_RX DMA2_Stream3
78+
#define DMA_CHANNEL_SPI5_RX DMA_CHANNEL_2
79+
7780
#define DMA_STREAM_SDIO_RX DMA2_Stream3
7881
#define DMA_CHANNEL_SDIO_RX DMA_CHANNEL_4
7982

83+
#define DMA_STREAM_SPI4_RX DMA2_Stream3
84+
#define DMA_CHANNEL_SPI4_RX DMA_CHANNEL_5
85+
86+
#define DMA_STREAM_SPI5_TX DMA2_Stream4
87+
#define DMA_CHANNEL_SPI5_TX DMA_CHANNEL_2
88+
89+
#define DMA_STREAM_SPI4_TX DMA2_Stream4
90+
#define DMA_CHANNEL_SPI4_TX DMA_CHANNEL_5
91+
92+
#define DMA_STREAM_SPI6_TX DMA2_Stream5
93+
#define DMA_CHANNEL_SPI6_TX DMA_CHANNEL_1
94+
8095
#define DMA_STREAM_SPI1_TX DMA2_Stream5
8196
#define DMA_CHANNEL_SPI1_TX DMA_CHANNEL_3
8297

98+
#define DMA_STREAM_SPI6_RX DMA2_Stream6
99+
#define DMA_CHANNEL_SPI6_RX DMA_CHANNEL_1
100+
83101
#define DMA_STREAM_SDIO_TX DMA2_Stream6
84102
#define DMA_CHANNEL_SDIO_TX DMA_CHANNEL_4
85103

stmhal/spi.c

Lines changed: 113 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@
6868
// SPI2_RX: DMA1_Stream3.CHANNEL_0
6969
// SPI3_TX: DMA1_Stream5.CHANNEL_0 or DMA1_Stream7.CHANNEL_0
7070
// SPI3_RX: DMA1_Stream0.CHANNEL_0 or DMA1_Stream2.CHANNEL_0
71+
// SPI4_TX: DMA2_Stream4.CHANNEL_5 or DMA2_Stream1.CHANNEL_4
72+
// SPI4_RX: DMA2_Stream3.CHANNEL_5 or DMA2_Stream0.CHANNEL_4
73+
// SPI5_TX: DMA2_Stream4.CHANNEL_2 or DMA2_Stream6.CHANNEL_7
74+
// SPI5_RX: DMA2_Stream3.CHANNEL_2 or DMA2_Stream5.CHANNEL_7
75+
// SPI6_TX: DMA2_Stream5.CHANNEL_1
76+
// SPI6_RX: DMA2_Stream6.CHANNEL_1
7177

7278
typedef struct _pyb_spi_obj_t {
7379
mp_obj_base_t base;
@@ -87,6 +93,15 @@ SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL};
8793
#if defined(MICROPY_HW_SPI3_SCK)
8894
SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL};
8995
#endif
96+
#if defined(MICROPY_HW_SPI4_SCK)
97+
SPI_HandleTypeDef SPIHandle4 = {.Instance = NULL};
98+
#endif
99+
#if defined(MICROPY_HW_SPI5_SCK)
100+
SPI_HandleTypeDef SPIHandle5 = {.Instance = NULL};
101+
#endif
102+
#if defined(MICROPY_HW_SPI6_SCK)
103+
SPI_HandleTypeDef SPIHandle6 = {.Instance = NULL};
104+
#endif
90105

91106
STATIC const pyb_spi_obj_t pyb_spi_obj[] = {
92107
#if defined(MICROPY_HW_SPI1_SCK)
@@ -104,6 +119,21 @@ STATIC const pyb_spi_obj_t pyb_spi_obj[] = {
104119
#else
105120
{{&pyb_spi_type}, NULL, NULL, 0, NULL, 0},
106121
#endif
122+
#if defined(MICROPY_HW_SPI4_SCK)
123+
{{&pyb_spi_type}, &SPIHandle4, DMA_STREAM_SPI4_TX, DMA_CHANNEL_SPI4_TX, DMA_STREAM_SPI4_RX, DMA_CHANNEL_SPI4_RX},
124+
#else
125+
{{&pyb_spi_type}, NULL, NULL, 0, NULL, 0},
126+
#endif
127+
#if defined(MICROPY_HW_SPI5_SCK)
128+
{{&pyb_spi_type}, &SPIHandle5, DMA_STREAM_SPI5_TX, DMA_CHANNEL_SPI5_TX, DMA_STREAM_SPI5_RX, DMA_CHANNEL_SPI5_RX},
129+
#else
130+
{{&pyb_spi_type}, NULL, NULL, 0, NULL, 0},
131+
#endif
132+
#if defined(MICROPY_HW_SPI6_SCK)
133+
{{&pyb_spi_type}, &SPIHandle6, DMA_STREAM_SPI6_TX, DMA_CHANNEL_SPI6_TX, DMA_STREAM_SPI6_RX, DMA_CHANNEL_SPI6_RX},
134+
#else
135+
{{&pyb_spi_type}, NULL, NULL, 0, NULL, 0},
136+
#endif
107137
};
108138

109139
void spi_init0(void) {
@@ -120,6 +150,18 @@ void spi_init0(void) {
120150
memset(&SPIHandle3, 0, sizeof(SPI_HandleTypeDef));
121151
SPIHandle3.Instance = SPI3;
122152
#endif
153+
#if defined(MICROPY_HW_SPI4_SCK)
154+
memset(&SPIHandle4, 0, sizeof(SPI_HandleTypeDef));
155+
SPIHandle4.Instance = SPI4;
156+
#endif
157+
#if defined(MICROPY_HW_SPI5_SCK)
158+
memset(&SPIHandle5, 0, sizeof(SPI_HandleTypeDef));
159+
SPIHandle5.Instance = SPI5;
160+
#endif
161+
#if defined(MICROPY_HW_SPI6_SCK)
162+
memset(&SPIHandle6, 0, sizeof(SPI_HandleTypeDef));
163+
SPIHandle6.Instance = SPI6;
164+
#endif
123165
}
124166

125167
// TODO allow to take a list of pins to use
@@ -167,6 +209,39 @@ void spi_init(SPI_HandleTypeDef *spi, bool enable_nss_pin) {
167209
// enable the SPI clock
168210
__SPI3_CLK_ENABLE();
169211
#endif
212+
#if defined(MICROPY_HW_SPI4_SCK)
213+
} else if (spi->Instance == SPI4) {
214+
self = &pyb_spi_obj[3];
215+
pins[0] = &MICROPY_HW_SPI4_NSS;
216+
pins[1] = &MICROPY_HW_SPI4_SCK;
217+
pins[2] = &MICROPY_HW_SPI4_MISO;
218+
pins[3] = &MICROPY_HW_SPI4_MOSI;
219+
GPIO_InitStructure.Alternate = GPIO_AF5_SPI4;
220+
// enable the SPI clock
221+
__SPI4_CLK_ENABLE();
222+
#endif
223+
#if defined(MICROPY_HW_SPI5_SCK)
224+
} else if (spi->Instance == SPI5) {
225+
self = &pyb_spi_obj[4];
226+
pins[0] = &MICROPY_HW_SPI5_NSS;
227+
pins[1] = &MICROPY_HW_SPI5_SCK;
228+
pins[2] = &MICROPY_HW_SPI5_MISO;
229+
pins[3] = &MICROPY_HW_SPI5_MOSI;
230+
GPIO_InitStructure.Alternate = GPIO_AF5_SPI5;
231+
// enable the SPI clock
232+
__SPI5_CLK_ENABLE();
233+
#endif
234+
#if defined(MICROPY_HW_SPI6_SCK)
235+
} else if (spi->Instance == SPI6) {
236+
self = &pyb_spi_obj[5];
237+
pins[0] = &MICROPY_HW_SPI6_NSS;
238+
pins[1] = &MICROPY_HW_SPI6_SCK;
239+
pins[2] = &MICROPY_HW_SPI6_MISO;
240+
pins[3] = &MICROPY_HW_SPI6_MOSI;
241+
GPIO_InitStructure.Alternate = GPIO_AF5_SPI6;
242+
// enable the SPI clock
243+
__SPI6_CLK_ENABLE();
244+
#endif
170245
} else {
171246
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
172247
return;
@@ -215,6 +290,24 @@ void spi_deinit(SPI_HandleTypeDef *spi) {
215290
__SPI3_RELEASE_RESET();
216291
__SPI3_CLK_DISABLE();
217292
#endif
293+
#if defined(MICROPY_HW_SPI4_SCK)
294+
} else if (spi->Instance == SPI4) {
295+
__SPI4_FORCE_RESET();
296+
__SPI4_RELEASE_RESET();
297+
__SPI4_CLK_DISABLE();
298+
#endif
299+
#if defined(MICROPY_HW_SPI5_SCK)
300+
} else if (spi->Instance == SPI5) {
301+
__SPI5_FORCE_RESET();
302+
__SPI5_RELEASE_RESET();
303+
__SPI5_CLK_DISABLE();
304+
#endif
305+
#if defined(MICROPY_HW_SPI6_SCK)
306+
} else if (spi->Instance == SPI6) {
307+
__SPI6_FORCE_RESET();
308+
__SPI6_RELEASE_RESET();
309+
__SPI6_CLK_DISABLE();
310+
#endif
218311
}
219312
}
220313

@@ -245,23 +338,31 @@ SPI_HandleTypeDef *spi_get_handle(mp_obj_t o) {
245338
STATIC void pyb_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
246339
pyb_spi_obj_t *self = self_in;
247340

248-
uint spi_num;
249-
if (self->spi->Instance == SPI1) { spi_num = 1; }
250-
else if (self->spi->Instance == SPI2) { spi_num = 2; }
251-
else { spi_num = 3; }
341+
uint spi_num = 1; // default to SPI1
342+
if (self->spi->Instance == SPI2) { spi_num = 2; }
343+
else if (self->spi->Instance == SPI3) { spi_num = 3; }
344+
#if defined(SPI4)
345+
else if (self->spi->Instance == SPI4) { spi_num = 4; }
346+
#endif
347+
#if defined(SPI5)
348+
else if (self->spi->Instance == SPI5) { spi_num = 5; }
349+
#endif
350+
#if defined(SPI6)
351+
else if (self->spi->Instance == SPI6) { spi_num = 6; }
352+
#endif
252353

253354
if (self->spi->State == HAL_SPI_STATE_RESET) {
254355
mp_printf(print, "SPI(%u)", spi_num);
255356
} else {
256357
if (self->spi->Init.Mode == SPI_MODE_MASTER) {
257358
// compute baudrate
258359
uint spi_clock;
259-
if (self->spi->Instance == SPI1) {
260-
// SPI1 is on APB2
261-
spi_clock = HAL_RCC_GetPCLK2Freq();
262-
} else {
360+
if (self->spi->Instance == SPI2 || self->spi->Instance == SPI3) {
263361
// SPI2 and SPI3 are on APB1
264362
spi_clock = HAL_RCC_GetPCLK1Freq();
363+
} else {
364+
// SPI1, SPI4, SPI5 and SPI6 are on APB2
365+
spi_clock = HAL_RCC_GetPCLK2Freq();
265366
}
266367
uint log_prescaler = (self->spi->Init.BaudRatePrescaler >> 3) + 1;
267368
uint baudrate = spi_clock >> log_prescaler;
@@ -311,12 +412,12 @@ STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, mp_uint_t n_args,
311412
if (br_prescale == 0xffffffff) {
312413
// prescaler not given, so select one that yields at most the requested baudrate
313414
mp_uint_t spi_clock;
314-
if (self->spi->Instance == SPI1) {
315-
// SPI1 is on APB2
316-
spi_clock = HAL_RCC_GetPCLK2Freq();
317-
} else {
415+
if (self->spi->Instance == SPI2 || self->spi->Instance == SPI3) {
318416
// SPI2 and SPI3 are on APB1
319417
spi_clock = HAL_RCC_GetPCLK1Freq();
418+
} else {
419+
// SPI1, SPI4, SPI5 and SPI6 are on APB2
420+
spi_clock = HAL_RCC_GetPCLK2Freq();
320421
}
321422
br_prescale = spi_clock / args[1].u_int;
322423
}

stmhal/spi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
extern SPI_HandleTypeDef SPIHandle1;
2828
extern SPI_HandleTypeDef SPIHandle2;
2929
extern SPI_HandleTypeDef SPIHandle3;
30+
extern SPI_HandleTypeDef SPIHandle4;
31+
extern SPI_HandleTypeDef SPIHandle5;
32+
extern SPI_HandleTypeDef SPIHandle6;
3033
extern const mp_obj_type_t pyb_spi_type;
3134

3235
void spi_init0(void);

0 commit comments

Comments
 (0)