68
68
// SPI2_RX: DMA1_Stream3.CHANNEL_0
69
69
// SPI3_TX: DMA1_Stream5.CHANNEL_0 or DMA1_Stream7.CHANNEL_0
70
70
// 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
71
77
72
78
typedef struct _pyb_spi_obj_t {
73
79
mp_obj_base_t base ;
@@ -87,6 +93,15 @@ SPI_HandleTypeDef SPIHandle2 = {.Instance = NULL};
87
93
#if defined(MICROPY_HW_SPI3_SCK )
88
94
SPI_HandleTypeDef SPIHandle3 = {.Instance = NULL };
89
95
#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
90
105
91
106
STATIC const pyb_spi_obj_t pyb_spi_obj [] = {
92
107
#if defined(MICROPY_HW_SPI1_SCK )
@@ -104,6 +119,21 @@ STATIC const pyb_spi_obj_t pyb_spi_obj[] = {
104
119
#else
105
120
{{& pyb_spi_type }, NULL , NULL , 0 , NULL , 0 },
106
121
#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
107
137
};
108
138
109
139
void spi_init0 (void ) {
@@ -120,6 +150,18 @@ void spi_init0(void) {
120
150
memset (& SPIHandle3 , 0 , sizeof (SPI_HandleTypeDef ));
121
151
SPIHandle3 .Instance = SPI3 ;
122
152
#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
123
165
}
124
166
125
167
// TODO allow to take a list of pins to use
@@ -167,6 +209,39 @@ void spi_init(SPI_HandleTypeDef *spi, bool enable_nss_pin) {
167
209
// enable the SPI clock
168
210
__SPI3_CLK_ENABLE ();
169
211
#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
170
245
} else {
171
246
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
172
247
return ;
@@ -215,6 +290,24 @@ void spi_deinit(SPI_HandleTypeDef *spi) {
215
290
__SPI3_RELEASE_RESET ();
216
291
__SPI3_CLK_DISABLE ();
217
292
#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
218
311
}
219
312
}
220
313
@@ -245,23 +338,32 @@ SPI_HandleTypeDef *spi_get_handle(mp_obj_t o) {
245
338
STATIC void pyb_spi_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
246
339
pyb_spi_obj_t * self = self_in ;
247
340
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
252
353
253
354
if (self -> spi -> State == HAL_SPI_STATE_RESET ) {
254
355
mp_printf (print , "SPI(%u)" , spi_num );
255
356
} else {
256
357
if (self -> spi -> Init .Mode == SPI_MODE_MASTER ) {
257
358
// compute baudrate
258
359
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 ) ) {
263
362
// SPI2 and SPI3 are on APB1
264
363
spi_clock = HAL_RCC_GetPCLK1Freq ();
364
+ } else {
365
+ // SPI1, SPI4, SPI5 and SPI6 are on APB2
366
+ spi_clock = HAL_RCC_GetPCLK2Freq ();
265
367
}
266
368
uint log_prescaler = (self -> spi -> Init .BaudRatePrescaler >> 3 ) + 1 ;
267
369
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,
311
413
if (br_prescale == 0xffffffff ) {
312
414
// prescaler not given, so select one that yields at most the requested baudrate
313
415
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 ) ) {
318
418
// SPI2 and SPI3 are on APB1
319
419
spi_clock = HAL_RCC_GetPCLK1Freq ();
420
+ } else {
421
+ // SPI1, SPI4, SPI5 and SPI6 are on APB2
422
+ spi_clock = HAL_RCC_GetPCLK2Freq ();
320
423
}
321
424
br_prescale = spi_clock / args [1 ].u_int ;
322
425
}
0 commit comments