Skip to content

Commit 2573187

Browse files
author
Tobias Badertscher
committed
Extend SPI support to fully support all SPI devices on STM32F429.
1 parent 2d11b17 commit 2573187

File tree

4 files changed

+164
-12
lines changed

4 files changed

+164
-12
lines changed

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: 115 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,32 @@ 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;
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) ||
361+
(self->spi->Instance == SPI3) ) {
263362
// SPI2 and SPI3 are on APB1
264363
spi_clock = HAL_RCC_GetPCLK1Freq();
364+
} else {
365+
// SPI1, SPI4, SPI5 and SPI6 are on APB2
366+
spi_clock = HAL_RCC_GetPCLK2Freq();
265367
}
266368
uint log_prescaler = (self->spi->Init.BaudRatePrescaler >> 3) + 1;
267369
uint baudrate = spi_clock >> log_prescaler;
@@ -311,12 +413,13 @@ STATIC mp_obj_t pyb_spi_init_helper(const pyb_spi_obj_t *self, mp_uint_t n_args,
311413
if (br_prescale == 0xffffffff) {
312414
// prescaler not given, so select one that yields at most the requested baudrate
313415
mp_uint_t spi_clock;
314-
if (self->spi->Instance == SPI1) {
315-
// SPI1 is on APB2
316-
spi_clock = HAL_RCC_GetPCLK2Freq();
317-
} else {
416+
if ( (self->spi->Instance == SPI2) ||
417+
(self->spi->Instance == SPI3) ) {
318418
// SPI2 and SPI3 are on APB1
319419
spi_clock = HAL_RCC_GetPCLK1Freq();
420+
} else {
421+
// SPI1, SPI4, SPI5 and SPI6 are on APB2
422+
spi_clock = HAL_RCC_GetPCLK2Freq();
320423
}
321424
br_prescale = spi_clock / args[1].u_int;
322425
}

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy