Skip to content

Commit bd9893a

Browse files
committed
clean up SPI module readability
1 parent 0b558e8 commit bd9893a

File tree

1 file changed

+69
-132
lines changed
  • ports/stm32f4/common-hal/busio

1 file changed

+69
-132
lines changed

ports/stm32f4/common-hal/busio/SPI.c

Lines changed: 69 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@
3636
#include "supervisor/shared/translate.h"
3737
#include "common-hal/microcontroller/Pin.h"
3838

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);
4146

4247
STATIC uint32_t get_busclock(SPI_TypeDef * instance) {
4348
//SPI2 and 3 are on PCLK1, if they exist.
@@ -51,42 +56,15 @@ STATIC uint32_t get_busclock(SPI_TypeDef * instance) {
5156
}
5257

5358
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+
}
8866
}
89-
#endif
67+
spi_clock_disable(ALL_CLOCKS & ~(never_reset_mask));
9068
}
9169

9270
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,
163141
GPIO_InitStruct.Alternate = self->miso->altfn_index;
164142
HAL_GPIO_Init(pin_port(miso->port), &GPIO_InitStruct);
165143

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;
202146

203147
self->handle.Instance = SPIx;
204148
self->handle.Init.Mode = SPI_MODE_MASTER;
@@ -244,42 +188,9 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
244188
}
245189

246190
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+
283194
reset_pin_number(self->sck->pin->port,self->sck->pin->number);
284195
reset_pin_number(self->mosi->pin->port,self->mosi->pin->number);
285196
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,
323234
//Deinit SPI
324235
HAL_SPI_DeInit(&self->handle);
325236

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;
333240

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-
346241
self->handle.Init.BaudRatePrescaler = stm32_baud_to_spi_div(baudrate, &self->prescaler,
347242
get_busclock(self->handle.Instance));
348243
self->handle.Init.Mode = SPI_MODE_MASTER;
@@ -373,10 +268,10 @@ bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) {
373268
// __disable_irq();
374269
// __DMB();
375270

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+
}
380275

381276
// __DMB();
382277
// __set_PRIMASK(store_primask);
@@ -423,4 +318,46 @@ uint8_t common_hal_busio_spi_get_phase(busio_spi_obj_t* self) {
423318

424319
uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t* self) {
425320
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
426363
}

0 commit comments

Comments
 (0)