Skip to content

Commit c5323c1

Browse files
author
Laurent MEUNIER
committed
[STM32F4] SPI: avoid duplicate information accross layers
Same information was stored in spi_api.c and STM32 HAL layers. Modify code to avoid this duplicate information.
1 parent 478168c commit c5323c1

File tree

2 files changed

+31
-45
lines changed

2 files changed

+31
-45
lines changed

hal/targets/hal/TARGET_STM/TARGET_STM32F4/common_objects.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,6 @@ struct spi_s {
7272
SPI_HandleTypeDef handle;
7373
IRQn_Type spiIRQ;
7474
SPIName spi;
75-
uint32_t bits;
76-
uint32_t cpol;
77-
uint32_t cpha;
78-
uint32_t mode;
79-
uint32_t nss;
80-
uint32_t br_presc;
8175
PinName pin_miso;
8276
PinName pin_mosi;
8377
PinName pin_sclk;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/spi_api.c

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,9 @@ static void init_spi(spi_t *obj)
6767
struct spi_s *spiobj = SPI_S(obj);
6868
SPI_HandleTypeDef *handle = &(spiobj->handle);
6969

70-
handle->Instance = SPI_INST(obj);
7170
__HAL_SPI_DISABLE(handle);
7271

7372
DEBUG_PRINTF("init_spi: instance=0x%8X\r\n", (int)handle->Instance);
74-
75-
handle->Init.Mode = spiobj->mode;
76-
handle->Init.BaudRatePrescaler = spiobj->br_presc;
77-
handle->Init.Direction = SPI_DIRECTION_2LINES;
78-
handle->Init.CLKPhase = spiobj->cpha;
79-
handle->Init.CLKPolarity = spiobj->cpol;
80-
handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
81-
handle->Init.CRCPolynomial = 7;
82-
handle->Init.DataSize = (spiobj->bits == 16) ? SPI_DATASIZE_16BIT : SPI_DATASIZE_8BIT;
83-
handle->Init.FirstBit = SPI_FIRSTBIT_MSB;
84-
handle->Init.NSS = spiobj->nss;
85-
handle->Init.TIMode = SPI_TIMODE_DISABLED;
86-
8773
if (HAL_SPI_Init(handle) != HAL_OK) {
8874
error("Cannot initialize SPI");
8975
}
@@ -94,6 +80,7 @@ static void init_spi(spi_t *obj)
9480
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
9581
{
9682
struct spi_s *spiobj = SPI_S(obj);
83+
SPI_HandleTypeDef *handle = &(spiobj->handle);
9784

9885
// Determine the SPI to use
9986
SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
@@ -150,26 +137,29 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
150137
pinmap_pinout(mosi, PinMap_SPI_MOSI);
151138
pinmap_pinout(miso, PinMap_SPI_MISO);
152139
pinmap_pinout(sclk, PinMap_SPI_SCLK);
153-
154-
// Save default values
155-
spiobj->bits = 8;
156-
spiobj->mode = SPI_MODE_MASTER;
157-
158-
spiobj->cpol = SPI_POLARITY_LOW;
159-
spiobj->cpha = SPI_PHASE_1EDGE;
160-
spiobj->br_presc = SPI_BAUDRATEPRESCALER_256;
161-
162140
spiobj->pin_miso = miso;
163141
spiobj->pin_mosi = mosi;
164142
spiobj->pin_sclk = sclk;
165143
spiobj->pin_ssel = ssel;
166-
167144
if (ssel != NC) {
168145
pinmap_pinout(ssel, PinMap_SPI_SSEL);
169146
} else {
170-
spiobj->nss = SPI_NSS_SOFT;
147+
handle->Init.NSS = SPI_NSS_SOFT;
171148
}
172149

150+
/* Fill default value */
151+
handle->Instance = SPI_INST(obj);
152+
handle->Init.Mode = SPI_MODE_MASTER;
153+
handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
154+
handle->Init.Direction = SPI_DIRECTION_2LINES;
155+
handle->Init.CLKPhase = SPI_PHASE_1EDGE;
156+
handle->Init.CLKPolarity = SPI_POLARITY_LOW;
157+
handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
158+
handle->Init.CRCPolynomial = 7;
159+
handle->Init.DataSize = SPI_DATASIZE_8BIT;
160+
handle->Init.FirstBit = SPI_FIRSTBIT_MSB;
161+
handle->Init.TIMode = SPI_TIMODE_DISABLED;
162+
173163
init_spi(obj);
174164
}
175165

@@ -231,44 +221,45 @@ void spi_free(spi_t *obj)
231221
pin_function(spiobj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
232222
pin_function(spiobj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
233223
pin_function(spiobj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
234-
if (spiobj->nss != SPI_NSS_SOFT) {
224+
if (handle->Init.NSS != SPI_NSS_SOFT) {
235225
pin_function(spiobj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
236226
}
237227
}
238228

239229
void spi_format(spi_t *obj, int bits, int mode, int slave)
240230
{
241231
struct spi_s *spiobj = SPI_S(obj);
232+
SPI_HandleTypeDef *handle = &(spiobj->handle);
242233

243234
DEBUG_PRINTF("spi_format, bits:%d, mode:%d, slave?:%d\r\n", bits, mode, slave);
244235

245236
// Save new values
246-
spiobj->bits = bits;
237+
handle->Init.DataSize = (bits == 16) ? SPI_DATASIZE_16BIT : SPI_DATASIZE_8BIT;
247238

248239
switch (mode) {
249240
case 0:
250-
spiobj->cpol = SPI_POLARITY_LOW;
251-
spiobj->cpha = SPI_PHASE_1EDGE;
241+
handle->Init.CLKPolarity = SPI_POLARITY_LOW;
242+
handle->Init.CLKPhase = SPI_PHASE_1EDGE;
252243
break;
253244
case 1:
254-
spiobj->cpol = SPI_POLARITY_LOW;
255-
spiobj->cpha = SPI_PHASE_2EDGE;
245+
handle->Init.CLKPolarity = SPI_POLARITY_LOW;
246+
handle->Init.CLKPhase = SPI_PHASE_2EDGE;
256247
break;
257248
case 2:
258-
spiobj->cpol = SPI_POLARITY_HIGH;
259-
spiobj->cpha = SPI_PHASE_1EDGE;
249+
handle->Init.CLKPolarity = SPI_POLARITY_HIGH;
250+
handle->Init.CLKPhase = SPI_PHASE_1EDGE;
260251
break;
261252
default:
262-
spiobj->cpol = SPI_POLARITY_HIGH;
263-
spiobj->cpha = SPI_PHASE_2EDGE;
253+
handle->Init.CLKPolarity = SPI_POLARITY_HIGH;
254+
handle->Init.CLKPhase = SPI_PHASE_2EDGE;
264255
break;
265256
}
266257

267-
if (spiobj->nss != SPI_NSS_SOFT) {
268-
spiobj->nss = (slave) ? SPI_NSS_HARD_INPUT : SPI_NSS_HARD_OUTPUT;
258+
if (handle->Init.NSS != SPI_NSS_SOFT) {
259+
handle->Init.NSS = (slave) ? SPI_NSS_HARD_INPUT : SPI_NSS_HARD_OUTPUT;
269260
}
270261

271-
spiobj->mode = (slave) ? SPI_MODE_SLAVE : SPI_MODE_MASTER;
262+
handle->Init.Mode = (slave) ? SPI_MODE_SLAVE : SPI_MODE_MASTER;
272263

273264
init_spi(obj);
274265
}
@@ -285,6 +276,7 @@ static const uint16_t baudrate_prescaler_table[] = {SPI_BAUDRATEPRESCALER_2,
285276
void spi_frequency(spi_t *obj, int hz)
286277
{
287278
struct spi_s *spiobj = SPI_S(obj);
279+
SPI_HandleTypeDef *handle = &(spiobj->handle);
288280
int spi_hz = 0;
289281
uint8_t prescaler_rank = 0;
290282

@@ -323,7 +315,7 @@ void spi_frequency(spi_t *obj, int hz)
323315
}
324316

325317
if (prescaler_rank <= sizeof(baudrate_prescaler_table)/sizeof(baudrate_prescaler_table[0])) {
326-
spiobj->br_presc = baudrate_prescaler_table[prescaler_rank-1];
318+
handle->Init.BaudRatePrescaler = baudrate_prescaler_table[prescaler_rank-1];
327319
} else {
328320
error("Couldn't setup requested SPI frequency");
329321
}

0 commit comments

Comments
 (0)