@@ -67,23 +67,9 @@ static void init_spi(spi_t *obj)
67
67
struct spi_s * spiobj = SPI_S (obj );
68
68
SPI_HandleTypeDef * handle = & (spiobj -> handle );
69
69
70
- handle -> Instance = SPI_INST (obj );
71
70
__HAL_SPI_DISABLE (handle );
72
71
73
72
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
-
87
73
if (HAL_SPI_Init (handle ) != HAL_OK ) {
88
74
error ("Cannot initialize SPI" );
89
75
}
@@ -94,6 +80,7 @@ static void init_spi(spi_t *obj)
94
80
void spi_init (spi_t * obj , PinName mosi , PinName miso , PinName sclk , PinName ssel )
95
81
{
96
82
struct spi_s * spiobj = SPI_S (obj );
83
+ SPI_HandleTypeDef * handle = & (spiobj -> handle );
97
84
98
85
// Determine the SPI to use
99
86
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
150
137
pinmap_pinout (mosi , PinMap_SPI_MOSI );
151
138
pinmap_pinout (miso , PinMap_SPI_MISO );
152
139
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
-
162
140
spiobj -> pin_miso = miso ;
163
141
spiobj -> pin_mosi = mosi ;
164
142
spiobj -> pin_sclk = sclk ;
165
143
spiobj -> pin_ssel = ssel ;
166
-
167
144
if (ssel != NC ) {
168
145
pinmap_pinout (ssel , PinMap_SPI_SSEL );
169
146
} else {
170
- spiobj -> nss = SPI_NSS_SOFT ;
147
+ handle -> Init . NSS = SPI_NSS_SOFT ;
171
148
}
172
149
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
+
173
163
init_spi (obj );
174
164
}
175
165
@@ -231,44 +221,45 @@ void spi_free(spi_t *obj)
231
221
pin_function (spiobj -> pin_miso , STM_PIN_DATA (STM_MODE_INPUT , GPIO_NOPULL , 0 ));
232
222
pin_function (spiobj -> pin_mosi , STM_PIN_DATA (STM_MODE_INPUT , GPIO_NOPULL , 0 ));
233
223
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 ) {
235
225
pin_function (spiobj -> pin_ssel , STM_PIN_DATA (STM_MODE_INPUT , GPIO_NOPULL , 0 ));
236
226
}
237
227
}
238
228
239
229
void spi_format (spi_t * obj , int bits , int mode , int slave )
240
230
{
241
231
struct spi_s * spiobj = SPI_S (obj );
232
+ SPI_HandleTypeDef * handle = & (spiobj -> handle );
242
233
243
234
DEBUG_PRINTF ("spi_format, bits:%d, mode:%d, slave?:%d\r\n" , bits , mode , slave );
244
235
245
236
// Save new values
246
- spiobj -> bits = bits ;
237
+ handle -> Init . DataSize = ( bits == 16 ) ? SPI_DATASIZE_16BIT : SPI_DATASIZE_8BIT ;
247
238
248
239
switch (mode ) {
249
240
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 ;
252
243
break ;
253
244
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 ;
256
247
break ;
257
248
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 ;
260
251
break ;
261
252
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 ;
264
255
break ;
265
256
}
266
257
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 ;
269
260
}
270
261
271
- spiobj -> mode = (slave ) ? SPI_MODE_SLAVE : SPI_MODE_MASTER ;
262
+ handle -> Init . Mode = (slave ) ? SPI_MODE_SLAVE : SPI_MODE_MASTER ;
272
263
273
264
init_spi (obj );
274
265
}
@@ -285,6 +276,7 @@ static const uint16_t baudrate_prescaler_table[] = {SPI_BAUDRATEPRESCALER_2,
285
276
void spi_frequency (spi_t * obj , int hz )
286
277
{
287
278
struct spi_s * spiobj = SPI_S (obj );
279
+ SPI_HandleTypeDef * handle = & (spiobj -> handle );
288
280
int spi_hz = 0 ;
289
281
uint8_t prescaler_rank = 0 ;
290
282
@@ -323,7 +315,7 @@ void spi_frequency(spi_t *obj, int hz)
323
315
}
324
316
325
317
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 ];
327
319
} else {
328
320
error ("Couldn't setup requested SPI frequency" );
329
321
}
0 commit comments