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
7278typedef 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 )
8894SPI_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
91106STATIC 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
109139void 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) {
245338STATIC 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 }
0 commit comments