86
86
* @{
87
87
*/
88
88
89
- static PinName g_pin_mosi = NC ;
90
- static PinName g_pin_miso = NC ;
91
- static PinName g_pin_sclk = NC ;
92
- static PinName g_pin_ssel = NC ;
93
-
94
89
/**
95
90
* @}
96
91
*/
@@ -106,6 +101,71 @@ static PinName g_pin_ssel = NC;
106
101
/** @addtogroup STM32F4xx_System_Private_Functions
107
102
* @{
108
103
*/
104
+ /**
105
+ * @brief return clock freq of an SPI instance
106
+ * @param spi_inst : SPI instance
107
+ * @retval clock freq of the instance else SystemCoreClock
108
+ */
109
+ uint32_t spi_getClkFreqInst (SPI_TypeDef * spi_inst )
110
+ {
111
+ uint32_t spi_freq = SystemCoreClock ;
112
+
113
+ #ifdef STM32F0xx
114
+ /* SPIx source CLK is PCKL1 */
115
+ spi_freq = HAL_RCC_GetPCLK1Freq ();
116
+ #else
117
+ if (spi_inst != (SPI_TypeDef * )NC ) {
118
+ /* Get source clock depending on SPI instance */
119
+ switch ((uint32_t )spi_inst ) {
120
+ case (uint32_t )SPI1 :
121
+ #if defined SPI4_BASE
122
+ case (uint32_t )SPI4 :
123
+ #endif
124
+ #if defined SPI5_BASE
125
+ case (uint32_t )SPI5 :
126
+ #endif
127
+ #if defined SPI6_BASE
128
+ case (uint32_t )SPI6 :
129
+ #endif
130
+ /* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
131
+ spi_freq = HAL_RCC_GetPCLK2Freq ();
132
+ break ;
133
+ case (uint32_t )SPI2 :
134
+ #if defined SPI3_BASE
135
+ case (uint32_t )SPI3 :
136
+ #endif
137
+ /* SPI_2 and SPI_3. Source CLK is PCKL1 */
138
+ spi_freq = HAL_RCC_GetPCLK1Freq ();
139
+ break ;
140
+ default :
141
+ printf ("CLK: SPI instance not set" );
142
+ break ;
143
+ }
144
+ }
145
+ #endif
146
+ return spi_freq ;
147
+ }
148
+
149
+ /**
150
+ * @brief return clock freq of an SPI instance
151
+ * @param obj : pointer to spi_t structure
152
+ * @retval clock freq of the instance else SystemCoreClock
153
+ */
154
+ uint32_t spi_getClkFreq (spi_t * obj )
155
+ {
156
+ uint32_t spi_inst = NC ;
157
+ uint32_t spi_freq = SystemCoreClock ;
158
+
159
+ if (obj != NULL ) {
160
+ spi_inst = pinmap_peripheral (obj -> pin_sclk , PinMap_SPI_SCLK );
161
+
162
+ if (spi_inst != NC ) {
163
+ spi_freq = spi_getClkFreqInst (spi_inst );
164
+ }
165
+ }
166
+ return spi_freq ;
167
+ }
168
+
109
169
/**
110
170
* @brief SPI initialization function
111
171
* @param obj : pointer to spi_t structure
@@ -120,13 +180,21 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
120
180
return ;
121
181
122
182
SPI_HandleTypeDef * handle = & (obj -> handle );
183
+ GPIO_InitTypeDef GPIO_InitStruct ;
184
+ GPIO_TypeDef * port ;
185
+ uint32_t spi_freq = 0 ;
123
186
124
187
// Determine the SPI to use
125
188
uint32_t spi_mosi = pinmap_peripheral (obj -> pin_mosi , PinMap_SPI_MOSI );
126
189
uint32_t spi_miso = pinmap_peripheral (obj -> pin_miso , PinMap_SPI_MISO );
127
190
uint32_t spi_sclk = pinmap_peripheral (obj -> pin_sclk , PinMap_SPI_SCLK );
128
191
uint32_t spi_ssel = pinmap_peripheral (obj -> pin_ssel , PinMap_SPI_SSEL );
129
192
193
+ /* Pins MOSI/MISO/SCLK must not be NC. ssel can be NC. */
194
+ if (spi_mosi == NC || spi_miso == NC || spi_sclk == NC ) {
195
+ return ;
196
+ }
197
+
130
198
uint32_t spi_data = pinmap_merge (spi_mosi , spi_miso );
131
199
uint32_t spi_cntl = pinmap_merge (spi_sclk , spi_ssel );
132
200
@@ -139,35 +207,32 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
139
207
}
140
208
141
209
// Configure the SPI pins
142
- g_pin_mosi = obj -> pin_mosi ;
143
- g_pin_miso = obj -> pin_miso ;
144
- g_pin_sclk = obj -> pin_sclk ;
145
210
if (obj -> pin_ssel != NC ) {
146
- g_pin_ssel = obj -> pin_ssel ;
211
+ handle -> Init . NSS = SPI_NSS_HARD_OUTPUT ;
147
212
} else {
148
- g_pin_ssel = NC ;
149
213
handle -> Init .NSS = SPI_NSS_SOFT ;
150
214
}
151
215
152
216
/* Fill default value */
153
217
handle -> Instance = obj -> spi ;
154
218
handle -> Init .Mode = SPI_MODE_MASTER ;
155
219
156
- if (speed >= SPI_SPEED_CLOCK_DIV2_MHZ ) {
220
+ spi_freq = spi_getClkFreqInst (obj -> spi );
221
+ if (speed >= (spi_freq /SPI_SPEED_CLOCK_DIV2_MHZ )) {
157
222
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2 ;
158
- } else if (speed >= SPI_SPEED_CLOCK_DIV4_MHZ ) {
223
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV4_MHZ ) ) {
159
224
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4 ;
160
- } else if (speed >= SPI_SPEED_CLOCK_DIV8_MHZ ) {
225
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV8_MHZ ) ) {
161
226
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8 ;
162
- } else if (speed >= SPI_SPEED_CLOCK_DIV16_MHZ ) {
227
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV16_MHZ ) ) {
163
228
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16 ;
164
- } else if (speed >= SPI_SPEED_CLOCK_DIV32_MHZ ) {
229
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV32_MHZ ) ) {
165
230
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32 ;
166
- } else if (speed >= SPI_SPEED_CLOCK_DIV64_MHZ ) {
231
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV64_MHZ ) ) {
167
232
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64 ;
168
- } else if (speed >= SPI_SPEED_CLOCK_DIV128_MHZ ) {
233
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV128_MHZ ) ) {
169
234
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128 ;
170
- } else if (speed >= SPI_SPEED_CLOCK_DIV256_MHZ ) {
235
+ } else if (speed >= ( spi_freq / SPI_SPEED_CLOCK_DIV256_MHZ ) ) {
171
236
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256 ;
172
237
} else {
173
238
handle -> Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16 ;
@@ -199,96 +264,84 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
199
264
200
265
handle -> Init .TIMode = SPI_TIMODE_DISABLED ;
201
266
202
- HAL_SPI_Init (handle );
203
- }
204
-
205
- /**
206
- * @brief Initialize the SPI MSP.
207
- * @param hspi: pointer to a SPI_HandleTypeDef structure that contains
208
- * the configuration information for SPI module.
209
- * @retval None
210
- */
211
- void HAL_SPI_MspInit (SPI_HandleTypeDef * hspi )
212
- {
213
- GPIO_InitTypeDef GPIO_InitStruct ;
214
- GPIO_TypeDef * port ;
215
-
216
- if (g_pin_mosi != NC ) {
217
- port = set_GPIO_Port_Clock (STM_PORT (g_pin_mosi ));
218
- GPIO_InitStruct .Pin = STM_GPIO_PIN (g_pin_mosi );
219
- GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (g_pin_mosi ,PinMap_SPI_MOSI ));
220
- GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (g_pin_mosi ,PinMap_SPI_MOSI ));
267
+ if (obj -> pin_mosi != NC ) {
268
+ port = set_GPIO_Port_Clock (STM_PORT (obj -> pin_mosi ));
269
+ GPIO_InitStruct .Pin = STM_GPIO_PIN (obj -> pin_mosi );
270
+ GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> pin_mosi ,PinMap_SPI_MOSI ));
271
+ GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> pin_mosi ,PinMap_SPI_MOSI ));
221
272
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
222
- GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (g_pin_mosi ,PinMap_SPI_MOSI ));
273
+ GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> pin_mosi ,PinMap_SPI_MOSI ));
223
274
HAL_GPIO_Init (port , & GPIO_InitStruct );
224
275
}
225
276
226
- if (g_pin_miso != NC ) {
227
- port = set_GPIO_Port_Clock (STM_PORT (g_pin_miso ));
228
- GPIO_InitStruct .Pin = STM_GPIO_PIN (g_pin_miso );
229
- GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (g_pin_miso ,PinMap_SPI_MISO ));
230
- GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (g_pin_miso ,PinMap_SPI_MISO ));
277
+ if (obj -> pin_miso != NC ) {
278
+ port = set_GPIO_Port_Clock (STM_PORT (obj -> pin_miso ));
279
+ GPIO_InitStruct .Pin = STM_GPIO_PIN (obj -> pin_miso );
280
+ GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> pin_miso ,PinMap_SPI_MISO ));
281
+ GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> pin_miso ,PinMap_SPI_MISO ));
231
282
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
232
- GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (g_pin_miso ,PinMap_SPI_MISO ));
283
+ GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> pin_miso ,PinMap_SPI_MISO ));
233
284
HAL_GPIO_Init (port , & GPIO_InitStruct );
234
285
}
235
286
236
- if (g_pin_sclk != NC ) {
237
- port = set_GPIO_Port_Clock (STM_PORT (g_pin_sclk ));
238
- GPIO_InitStruct .Pin = STM_GPIO_PIN (g_pin_sclk );
239
- GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (g_pin_sclk ,PinMap_SPI_SCLK ));
240
- GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (g_pin_sclk ,PinMap_SPI_SCLK ));
287
+ if (obj -> pin_sclk != NC ) {
288
+ port = set_GPIO_Port_Clock (STM_PORT (obj -> pin_sclk ));
289
+ GPIO_InitStruct .Pin = STM_GPIO_PIN (obj -> pin_sclk );
290
+ GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> pin_sclk ,PinMap_SPI_SCLK ));
291
+ GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> pin_sclk ,PinMap_SPI_SCLK ));
241
292
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
242
- GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (g_pin_sclk ,PinMap_SPI_SCLK ));
293
+ GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> pin_sclk ,PinMap_SPI_SCLK ));
243
294
HAL_GPIO_Init (port , & GPIO_InitStruct );
244
295
}
245
296
246
- if (g_pin_ssel != NC ) {
247
- port = set_GPIO_Port_Clock (STM_PORT (g_pin_ssel ));
248
- GPIO_InitStruct .Pin = STM_GPIO_PIN (g_pin_ssel );
249
- GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (g_pin_ssel ,PinMap_SPI_SSEL ));
250
- GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (g_pin_ssel ,PinMap_SPI_SSEL ));
297
+ if (obj -> pin_ssel != NC ) {
298
+ port = set_GPIO_Port_Clock (STM_PORT (obj -> pin_ssel ));
299
+ GPIO_InitStruct .Pin = STM_GPIO_PIN (obj -> pin_ssel );
300
+ GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> pin_ssel ,PinMap_SPI_SSEL ));
301
+ GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> pin_ssel ,PinMap_SPI_SSEL ));
251
302
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
252
- GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (g_pin_ssel ,PinMap_SPI_SSEL ));
303
+ GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> pin_ssel ,PinMap_SPI_SSEL ));
253
304
HAL_GPIO_Init (port , & GPIO_InitStruct );
254
305
}
255
306
256
307
#if defined SPI1_BASE
257
308
// Enable SPI clock
258
- if (hspi -> Instance == SPI1 ) {
309
+ if (handle -> Instance == SPI1 ) {
259
310
__HAL_RCC_SPI1_CLK_ENABLE ();
260
311
}
261
312
#endif
262
313
263
314
#if defined SPI2_BASE
264
- if (hspi -> Instance == SPI2 ) {
315
+ if (handle -> Instance == SPI2 ) {
265
316
__HAL_RCC_SPI2_CLK_ENABLE ();
266
317
}
267
318
#endif
268
319
269
320
#if defined SPI3_BASE
270
- if (hspi -> Instance == SPI3 ) {
321
+ if (handle -> Instance == SPI3 ) {
271
322
__HAL_RCC_SPI3_CLK_ENABLE ();
272
323
}
273
324
#endif
274
325
275
326
#if defined SPI4_BASE
276
- if (hspi -> Instance == SPI4 ) {
327
+ if (handle -> Instance == SPI4 ) {
277
328
__HAL_RCC_SPI4_CLK_ENABLE ();
278
329
}
279
330
#endif
280
331
281
332
#if defined SPI5_BASE
282
- if (hspi -> Instance == SPI5 ) {
333
+ if (handle -> Instance == SPI5 ) {
283
334
__HAL_RCC_SPI5_CLK_ENABLE ();
284
335
}
285
336
#endif
286
337
287
338
#if defined SPI6_BASE
288
- if (hspi -> Instance == SPI6 ) {
339
+ if (handle -> Instance == SPI6 ) {
289
340
__HAL_RCC_SPI6_CLK_ENABLE ();
290
341
}
291
342
#endif
343
+
344
+ HAL_SPI_Init (handle );
292
345
}
293
346
294
347
/**
0 commit comments