36
36
#include "supervisor/shared/translate.h"
37
37
#include "common-hal/microcontroller/Pin.h"
38
38
39
- STATIC bool reserved_spi [6 ];
40
- STATIC bool never_reset_spi [6 ];
39
+ #define MAX_SPI 6 //TODO; replace this as part of periph cleanup
40
+ #define ALL_CLOCKS 0xFF
41
+ STATIC bool reserved_spi [MAX_SPI ];
42
+ STATIC bool never_reset_spi [MAX_SPI ];
43
+
44
+ STATIC void spi_clock_enable (uint8_t mask );
45
+ STATIC void spi_clock_disable (uint8_t mask );
41
46
42
47
STATIC uint32_t get_busclock (SPI_TypeDef * instance ) {
43
48
//SPI2 and 3 are on PCLK1, if they exist.
@@ -51,42 +56,15 @@ STATIC uint32_t get_busclock(SPI_TypeDef * instance) {
51
56
}
52
57
53
58
void spi_reset (void ) {
54
- #ifdef SPI1
55
- if (!never_reset_spi [0 ]) {
56
- reserved_spi [0 ] = false;
57
- __HAL_RCC_SPI1_CLK_DISABLE ();
58
- }
59
- #endif
60
- #ifdef SPI2
61
- if (!never_reset_spi [1 ]) {
62
- reserved_spi [1 ] = false;
63
- __HAL_RCC_SPI2_CLK_DISABLE ();
64
- }
65
- #endif
66
- #ifdef SPI3
67
- if (!never_reset_spi [2 ]) {
68
- reserved_spi [2 ] = false;
69
- __HAL_RCC_SPI3_CLK_DISABLE ();
70
- }
71
- #endif
72
- #ifdef SPI4
73
- if (!never_reset_spi [3 ]) {
74
- reserved_spi [3 ] = false;
75
- __HAL_RCC_SPI4_CLK_DISABLE ();
76
- }
77
- #endif
78
- #ifdef SPI5
79
- if (!never_reset_spi [4 ]) {
80
- reserved_spi [4 ] = false;
81
- __HAL_RCC_SPI5_CLK_DISABLE ();
82
- }
83
- #endif
84
- #ifdef SPI6
85
- if (!never_reset_spi [5 ]) {
86
- reserved_spi [5 ] = false;
87
- __HAL_RCC_SPI6_CLK_DISABLE ();
59
+ uint16_t never_reset_mask = 0x00 ;
60
+ for (int i = 0 ;i < MAX_SPI ;i ++ ) {
61
+ if (!never_reset_spi [i ]) {
62
+ reserved_spi [i ] = 0x00 ;
63
+ } else {
64
+ never_reset_mask |= 1 <<i ;
65
+ }
88
66
}
89
- #endif
67
+ spi_clock_disable ( ALL_CLOCKS & ~( never_reset_mask ));
90
68
}
91
69
92
70
void common_hal_busio_spi_construct (busio_spi_obj_t * self ,
@@ -163,42 +141,8 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
163
141
GPIO_InitStruct .Alternate = self -> miso -> altfn_index ;
164
142
HAL_GPIO_Init (pin_port (miso -> port ), & GPIO_InitStruct );
165
143
166
- #ifdef SPI1
167
- if (SPIx == SPI1 ) {
168
- reserved_spi [0 ] = true;
169
- __HAL_RCC_SPI1_CLK_ENABLE ();
170
- }
171
- #endif
172
- #ifdef SPI2
173
- if (SPIx == SPI2 ) {
174
- reserved_spi [1 ] = true;
175
- __HAL_RCC_SPI2_CLK_ENABLE ();
176
- }
177
- #endif
178
- #ifdef SPI3
179
- if (SPIx == SPI3 ) {
180
- reserved_spi [2 ] = true;
181
- __HAL_RCC_SPI3_CLK_ENABLE ();
182
- }
183
- #endif
184
- #ifdef SPI4
185
- if (SPIx == SPI4 ) {
186
- reserved_spi [3 ] = true;
187
- __HAL_RCC_SPI4_CLK_ENABLE ();
188
- }
189
- #endif
190
- #ifdef SPI5
191
- if (SPIx == SPI5 ) {
192
- reserved_spi [4 ] = true;
193
- __HAL_RCC_SPI5_CLK_ENABLE ();
194
- }
195
- #endif
196
- #ifdef SPI6
197
- if (SPIx == SPI6 ) {
198
- reserved_spi [5 ] = true;
199
- __HAL_RCC_SPI6_CLK_ENABLE ();
200
- }
201
- #endif
144
+ spi_clock_enable (1 <<(self -> sck -> spi_index - 1 ));
145
+ reserved_spi [self -> sck -> spi_index - 1 ] = true;
202
146
203
147
self -> handle .Instance = SPIx ;
204
148
self -> handle .Init .Mode = SPI_MODE_MASTER ;
@@ -244,42 +188,9 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
244
188
}
245
189
246
190
void common_hal_busio_spi_deinit (busio_spi_obj_t * self ) {
247
- #ifdef SPI1
248
- if (self -> handle .Instance == SPI1 ) {
249
- reserved_spi [0 ] = false;
250
- __HAL_RCC_SPI1_CLK_DISABLE ();
251
- }
252
- #endif
253
- #ifdef SPI2
254
- if (self -> handle .Instance == SPI2 ) {
255
- reserved_spi [1 ] = false;
256
- __HAL_RCC_SPI2_CLK_DISABLE ();
257
- }
258
- #endif
259
- #ifdef SPI3
260
- if (self -> handle .Instance == SPI3 ) {
261
- reserved_spi [2 ] = false;
262
- __HAL_RCC_SPI3_CLK_DISABLE ();
263
- }
264
- #endif
265
- #ifdef SPI4
266
- if (self -> handle .Instance == SPI4 ) {
267
- reserved_spi [3 ] = false;
268
- __HAL_RCC_SPI4_CLK_DISABLE ();
269
- }
270
- #endif
271
- #ifdef SPI5
272
- if (self -> handle .Instance == SPI5 ) {
273
- reserved_spi [4 ] = false;
274
- __HAL_RCC_SPI5_CLK_DISABLE ();
275
- }
276
- #endif
277
- #ifdef SPI6
278
- if (self -> handle .Instance == SPI6 ) {
279
- reserved_spi [5 ] = false;
280
- __HAL_RCC_SPI6_CLK_DISABLE ();
281
- }
282
- #endif
191
+ spi_clock_disable (1 <<(self -> sck -> spi_index - 1 ));
192
+ reserved_spi [self -> sck -> spi_index - 1 ] = true;
193
+
283
194
reset_pin_number (self -> sck -> pin -> port ,self -> sck -> pin -> number );
284
195
reset_pin_number (self -> mosi -> pin -> port ,self -> mosi -> pin -> number );
285
196
reset_pin_number (self -> miso -> pin -> port ,self -> miso -> pin -> number );
@@ -323,26 +234,10 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
323
234
//Deinit SPI
324
235
HAL_SPI_DeInit (& self -> handle );
325
236
326
- if (bits == 8 ) {
327
- self -> handle .Init .DataSize = SPI_DATASIZE_8BIT ;
328
- } else if (bits == 16 ) {
329
- self -> handle .Init .DataSize = SPI_DATASIZE_16BIT ;
330
- } else {
331
- return false;
332
- }
237
+ self -> handle .Init .DataSize = (bits == 16 ) ? SPI_DATASIZE_16BIT : SPI_DATASIZE_8BIT ;
238
+ self -> handle .Init .CLKPolarity = (polarity ) ? SPI_POLARITY_HIGH : SPI_POLARITY_LOW ;
239
+ self -> handle .Init .CLKPhase = (phase ) ? SPI_PHASE_2EDGE : SPI_PHASE_1EDGE ;
333
240
334
- if (polarity ) {
335
- self -> handle .Init .CLKPolarity = SPI_POLARITY_HIGH ;
336
- } else {
337
- self -> handle .Init .CLKPolarity = SPI_POLARITY_LOW ;
338
- }
339
-
340
- if (phase ) {
341
- self -> handle .Init .CLKPhase = SPI_PHASE_2EDGE ;
342
- } else {
343
- self -> handle .Init .CLKPhase = SPI_PHASE_1EDGE ;
344
- }
345
-
346
241
self -> handle .Init .BaudRatePrescaler = stm32_baud_to_spi_div (baudrate , & self -> prescaler ,
347
242
get_busclock (self -> handle .Instance ));
348
243
self -> handle .Init .Mode = SPI_MODE_MASTER ;
@@ -373,10 +268,10 @@ bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) {
373
268
// __disable_irq();
374
269
// __DMB();
375
270
376
- if (!self -> has_lock ) {
377
- grabbed_lock = true;
378
- self -> has_lock = true;
379
- }
271
+ if (!self -> has_lock ) {
272
+ grabbed_lock = true;
273
+ self -> has_lock = true;
274
+ }
380
275
381
276
// __DMB();
382
277
// __set_PRIMASK(store_primask);
@@ -423,4 +318,46 @@ uint8_t common_hal_busio_spi_get_phase(busio_spi_obj_t* self) {
423
318
424
319
uint8_t common_hal_busio_spi_get_polarity (busio_spi_obj_t * self ) {
425
320
return self -> polarity ;
321
+ }
322
+
323
+ STATIC void spi_clock_enable (uint8_t mask ) {
324
+ #ifdef SPI1
325
+ if (mask & 1 <<0 ) __HAL_RCC_SPI1_CLK_ENABLE ();
326
+ #endif
327
+ #ifdef SPI2
328
+ if (mask & 1 <<1 ) __HAL_RCC_SPI2_CLK_ENABLE ();
329
+ #endif
330
+ #ifdef SPI3
331
+ if (mask & 1 <<2 ) __HAL_RCC_SPI3_CLK_ENABLE ();
332
+ #endif
333
+ #ifdef SPI4
334
+ if (mask & 1 <<3 ) __HAL_RCC_SPI4_CLK_ENABLE ();
335
+ #endif
336
+ #ifdef SPI5
337
+ if (mask & 1 <<4 ) __HAL_RCC_SPI5_CLK_ENABLE ();
338
+ #endif
339
+ #ifdef SPI6
340
+ if (mask & 1 <<5 ) __HAL_RCC_SPI6_CLK_ENABLE ();
341
+ #endif
342
+ }
343
+
344
+ STATIC void spi_clock_disable (uint8_t mask ) {
345
+ #ifdef SPI1
346
+ if (mask & 1 <<0 ) __HAL_RCC_SPI1_CLK_DISABLE ();
347
+ #endif
348
+ #ifdef SPI2
349
+ if (mask & 1 <<1 ) __HAL_RCC_SPI2_CLK_DISABLE ();
350
+ #endif
351
+ #ifdef SPI3
352
+ if (mask & 1 <<2 ) __HAL_RCC_SPI3_CLK_DISABLE ();
353
+ #endif
354
+ #ifdef SPI4
355
+ if (mask & 1 <<3 ) __HAL_RCC_SPI4_CLK_DISABLE ();
356
+ #endif
357
+ #ifdef SPI5
358
+ if (mask & 1 <<4 ) __HAL_RCC_SPI5_CLK_DISABLE ();
359
+ #endif
360
+ #ifdef SPI6
361
+ if (mask & 1 <<5 ) __HAL_RCC_SPI6_CLK_DISABLE ();
362
+ #endif
426
363
}
0 commit comments