|
28 | 28 | *******************************************************************************
|
29 | 29 | */
|
30 | 30 | #include "mbed_assert.h"
|
| 31 | +#include "mbed_error.h" |
31 | 32 | #include "spi_api.h"
|
32 | 33 |
|
33 | 34 | #if DEVICE_SPI
|
@@ -227,232 +228,58 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
|
227 | 228 | init_spi(obj);
|
228 | 229 | }
|
229 | 230 |
|
| 231 | +static const uint16_t baudrate_prescaler_table[] = {SPI_BAUDRATEPRESCALER_2, |
| 232 | + SPI_BAUDRATEPRESCALER_4, |
| 233 | + SPI_BAUDRATEPRESCALER_8, |
| 234 | + SPI_BAUDRATEPRESCALER_16, |
| 235 | + SPI_BAUDRATEPRESCALER_32, |
| 236 | + SPI_BAUDRATEPRESCALER_64, |
| 237 | + SPI_BAUDRATEPRESCALER_128, |
| 238 | + SPI_BAUDRATEPRESCALER_256}; |
| 239 | + |
230 | 240 | void spi_frequency(spi_t *obj, int hz)
|
231 | 241 | {
|
232 |
| -#if defined(TARGET_STM32F401RE) || defined(TARGET_STM32F401VC) || defined(TARGET_STM32F407VG) |
233 |
| - // Note: The frequencies are obtained with SPI1 clock = 84 MHz (APB2 clock) |
234 |
| - if (hz < 600000) { |
235 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 330 kHz |
236 |
| - } else if ((hz >= 600000) && (hz < 1000000)) { |
237 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz |
238 |
| - } else if ((hz >= 1000000) && (hz < 2000000)) { |
239 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.3 MHz |
240 |
| - } else if ((hz >= 2000000) && (hz < 5000000)) { |
241 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.6 MHz |
242 |
| - } else if ((hz >= 5000000) && (hz < 10000000)) { |
243 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz |
244 |
| - } else if ((hz >= 10000000) && (hz < 21000000)) { |
245 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz |
246 |
| - } else if ((hz >= 21000000) && (hz < 42000000)) { |
247 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz |
248 |
| - } else { // >= 42000000 |
249 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz |
250 |
| - } |
251 |
| -#elif defined(TARGET_STM32F405RG) |
252 |
| - // Note: The frequencies are obtained with SPI1 clock = 48 MHz (APB2 clock) |
253 |
| - if (obj->spi == SPI_1) { |
254 |
| - if (hz < 375000) { |
255 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 187.5 kHz |
256 |
| - } else if ((hz >= 375000) && (hz < 750000)) { |
257 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 375 kHz |
258 |
| - } else if ((hz >= 750000) && (hz < 1500000)) { |
259 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 0.75 MHz |
260 |
| - } else if ((hz >= 1500000) && (hz < 3000000)) { |
261 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.5 MHz |
262 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
263 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3 MHz |
264 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
265 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6 MHz |
266 |
| - } else if ((hz >= 12000000) && (hz < 24000000)) { |
267 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12 MHz |
268 |
| - } else { // >= 24000000 |
269 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz |
270 |
| - } |
271 |
| - // Note: The frequencies are obtained with SPI2/3 clock = 48 MHz (APB1 clock) |
272 |
| - } else if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { |
273 |
| - if (hz < 375000) { |
274 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 187.5 kHz |
275 |
| - } else if ((hz >= 375000) && (hz < 750000)) { |
276 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 375 kHz |
277 |
| - } else if ((hz >= 750000) && (hz < 1500000)) { |
278 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 0.75 MHz |
279 |
| - } else if ((hz >= 1500000) && (hz < 3000000)) { |
280 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.5 MHz |
281 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
282 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3 MHz |
283 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
284 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6 MHz |
285 |
| - } else if ((hz >= 12000000) && (hz < 24000000)) { |
286 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12 MHz |
287 |
| - } else { // >= 24000000 |
288 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 24 MHz |
289 |
| - } |
290 |
| - } |
291 |
| -#elif defined(TARGET_STM32F411RE) || defined(TARGET_STM32F429ZI) |
292 |
| - // Values depend of PCLK2: 100 MHz |
293 |
| - if ((obj->spi == SPI_1) || (obj->spi == SPI_4) || (obj->spi == SPI_5)) { |
294 |
| - if (hz < 700000) { |
295 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 391 kHz |
296 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
297 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 781 kHz |
298 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
299 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.56 MHz |
300 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
301 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.13 MHz |
302 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
303 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.25 MHz |
304 |
| - } else if ((hz >= 12000000) && (hz < 25000000)) { |
305 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 12.5 MHz |
306 |
| - } else if ((hz >= 25000000) && (hz < 50000000)) { |
307 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 25 MHz |
308 |
| - } else { // >= 50000000 |
309 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz |
310 |
| - } |
311 |
| - } |
312 |
| - // Values depend of PCLK1: 50 MHz |
313 |
| - if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { |
314 |
| - if (hz < 400000) { |
315 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 195 kHz |
316 |
| - } else if ((hz >= 400000) && (hz < 700000)) { |
317 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 391 kHz |
318 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
319 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 781 MHz |
320 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
321 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.56 MHz |
322 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
323 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.13 MHz |
324 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
325 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.25 MHz |
326 |
| - } else if ((hz >= 12000000) && (hz < 25000000)) { |
327 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12.5 MHz |
328 |
| - } else { // >= 25000000 |
329 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 25 MHz |
330 |
| - } |
331 |
| - } |
332 |
| -#elif defined(TARGET_STM32F446RE) |
333 |
| - // Values depend of PCLK2: 90 MHz |
334 |
| - if ((obj->spi == SPI_1) || (obj->spi == SPI_4)) { |
335 |
| - if (hz < 700000) { |
336 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 352 kHz |
337 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
338 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 703 kHz |
339 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
340 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.41 MHz |
341 |
| - } else if ((hz >= 3000000) && (hz < 5000000)) { |
342 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.81 MHz |
343 |
| - } else if ((hz >= 5000000) && (hz < 11000000)) { |
344 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.63 MHz |
345 |
| - } else if ((hz >= 11000000) && (hz < 22000000)) { |
346 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 11.25 MHz |
347 |
| - } else if ((hz >= 22000000) && (hz < 45000000)) { |
348 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 22.5 MHz |
349 |
| - } else { // >= 45000000 |
350 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 45 MHz |
351 |
| - } |
352 |
| - } |
353 |
| - // Values depend of PCLK1: 45 MHz |
354 |
| - if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { |
355 |
| - if (hz < 350000) { |
356 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 176 kHz |
357 |
| - } else if ((hz >= 350000) && (hz < 700000)) { |
358 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 352 kHz |
359 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
360 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 703 kHz |
361 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
362 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.41 MHz |
363 |
| - } else if ((hz >= 3000000) && (hz < 5000000)) { |
364 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 2.81 MHz |
365 |
| - } else if ((hz >= 5000000) && (hz < 11000000)) { |
366 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 5.63 MHz |
367 |
| - } else if ((hz >= 11000000) && (hz < 22000000)) { |
368 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 11.25 MHz |
369 |
| - } else { // >= 22000000 |
370 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 22.5 MHz |
371 |
| - } |
372 |
| - } |
373 |
| -#elif defined(TARGET_STM32F469NI) |
374 |
| - // Values depend of PCLK2: 84 MHz |
375 |
| - if ((obj->spi == SPI_1) || (obj->spi == SPI_4)) { |
376 |
| - if (hz < 600000) { |
377 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 328 kHz |
378 |
| - } else if ((hz >= 600000) && (hz < 1000000)) { |
379 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz |
380 |
| - } else if ((hz >= 1000000) && (hz < 2000000)) { |
381 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.31 MHz |
382 |
| - } else if ((hz >= 2000000) && (hz < 5000000)) { |
383 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.63 MHz |
384 |
| - } else if ((hz >= 5000000) && (hz < 10000000)) { |
385 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz |
386 |
| - } else if ((hz >= 10000000) && (hz < 20000000)) { |
387 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz |
388 |
| - } else if ((hz >= 20000000) && (hz < 40000000)) { |
389 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz |
390 |
| - } else { // >= 40000000 |
391 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz |
392 |
| - } |
393 |
| - } |
394 |
| - // Values depend of PCLK1: 42 MHz |
395 |
| - if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) { |
396 |
| - if (hz < 300000) { |
397 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 164 kHz |
398 |
| - } else if ((hz >= 300000) && (hz < 600000)) { |
399 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 328 kHz |
400 |
| - } else if ((hz >= 600000) && (hz < 1000000)) { |
401 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 656 kHz |
402 |
| - } else if ((hz >= 1000000) && (hz < 2000000)) { |
403 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.31 MHz |
404 |
| - } else if ((hz >= 2000000) && (hz < 5000000)) { |
405 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 2.63 MHz |
406 |
| - } else if ((hz >= 5000000) && (hz < 10000000)) { |
407 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 5.25 MHz |
408 |
| - } else if ((hz >= 10000000) && (hz < 20000000)) { |
409 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 10.5 MHz |
410 |
| - } else { // >= 20000000 |
411 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 21 MHz |
412 |
| - } |
413 |
| - } |
414 |
| -#elif defined(TARGET_STM32F410RB) |
415 |
| - // Values depend of PCLK2: 100 MHz |
416 |
| - if ((obj->spi == SPI_1) || (obj->spi == SPI_5)) { |
417 |
| - if (hz < 700000) { |
418 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 391 kHz |
419 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
420 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 781 kHz |
421 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
422 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.56 MHz |
423 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
424 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.13 MHz |
425 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
426 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.25 MHz |
427 |
| - } else if ((hz >= 12000000) && (hz < 25000000)) { |
428 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 12.5 MHz |
429 |
| - } else if ((hz >= 25000000) && (hz < 50000000)) { |
430 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 25 MHz |
431 |
| - } else { // >= 50000000 |
432 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz |
433 |
| - } |
434 |
| - } |
435 |
| - // Values depend of PCLK1: 50 MHz |
436 |
| - if (obj->spi == SPI_2) { |
437 |
| - if (hz < 400000) { |
438 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 195 kHz |
439 |
| - } else if ((hz >= 400000) && (hz < 700000)) { |
440 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 391 kHz |
441 |
| - } else if ((hz >= 700000) && (hz < 1000000)) { |
442 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 781 MHz |
443 |
| - } else if ((hz >= 1000000) && (hz < 3000000)) { |
444 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.56 MHz |
445 |
| - } else if ((hz >= 3000000) && (hz < 6000000)) { |
446 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.13 MHz |
447 |
| - } else if ((hz >= 6000000) && (hz < 12000000)) { |
448 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.25 MHz |
449 |
| - } else if ((hz >= 12000000) && (hz < 25000000)) { |
450 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12.5 MHz |
451 |
| - } else { // >= 25000000 |
452 |
| - obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 25 MHz |
453 |
| - } |
454 |
| - } |
| 242 | + int spi_hz = 0; |
| 243 | + uint8_t prescaler_rank = 0; |
| 244 | + |
| 245 | + /* Get source clock depending on SPI instance */ |
| 246 | + switch ((int)obj->spi) { |
| 247 | + case SPI_1: |
| 248 | +#if defined SPI4_BASE |
| 249 | + case SPI_4: |
| 250 | +#endif |
| 251 | +#if defined SPI5_BASE |
| 252 | + case SPI_5: |
| 253 | +#endif |
| 254 | +#if defined SPI6_BASE |
| 255 | + case SPI_6: |
| 256 | +#endif |
| 257 | + /* SPI_1, SPI_4, SPI_5 and SPI_6. Source CLK is PCKL2 */ |
| 258 | + spi_hz = HAL_RCC_GetPCLK2Freq(); |
| 259 | + break; |
| 260 | + case SPI_2: |
| 261 | +#if defined SPI3_BASE |
| 262 | + case SPI_3: |
455 | 263 | #endif
|
| 264 | + /* SPI_2 and SPI_3. Source CLK is PCKL1 */ |
| 265 | + spi_hz = HAL_RCC_GetPCLK1Freq(); |
| 266 | + break; |
| 267 | + default: |
| 268 | + error("SPI instance not set"); |
| 269 | + } |
| 270 | + |
| 271 | + /* Define pre-scaler in order to get highest available frequency below requested frequency */ |
| 272 | + while ((spi_hz > hz) && (prescaler_rank < sizeof(baudrate_prescaler_table)/sizeof(baudrate_prescaler_table[0]))){ |
| 273 | + spi_hz = spi_hz / 2; |
| 274 | + prescaler_rank++; |
| 275 | + } |
| 276 | + |
| 277 | + if (prescaler_rank <= sizeof(baudrate_prescaler_table)/sizeof(baudrate_prescaler_table[0])) { |
| 278 | + obj->br_presc = baudrate_prescaler_table[prescaler_rank-1]; |
| 279 | + } else { |
| 280 | + error("Couldn't setup requested SPI frequency"); |
| 281 | + } |
| 282 | + |
456 | 283 | init_spi(obj);
|
457 | 284 | }
|
458 | 285 |
|
|
0 commit comments