Skip to content

Commit fb21e3a

Browse files
committed
Add SPI bitwidths to ST targets where supported
1 parent c62b8e5 commit fb21e3a

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

targets/TARGET_STM/stm_spi_api.c

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,19 @@ void spi_get_capabilities(PinName ssel, bool slave, spi_capabilities_t *cap)
9090
} else {
9191
cap->minimum_frequency = 200000; // 200 kHz
9292
cap->maximum_frequency = 2000000; // 2 MHz
93+
#if defined(TARGET_STM32F0) || defined(TARGET_STM32F3) || defined(TARGET_STM32F7) || \
94+
defined(TARGET_STM32G0) || defined(TARGET_STM32G4) || defined(TARGET_STM32L4) || \
95+
defined(TARGET_STM32L5) || defined(TARGET_STM32WB)
96+
cap->word_length = 0x0000FFF8; // 4 through 16 bit symbols, inclusive
97+
#elif defined(TARGET_STM32H7)
98+
cap->word_length = 0xFFFFFFF8; // 4 through 32 bit symbols, inclusive
99+
#elif defined(TARGET_STM32F1) || defined(TARGET_STM32F2) || defined(TARGET_STM32F4) || \
100+
defined(TARGET_STM32L0) || defined(TARGET_STM32L1)
93101
cap->word_length = 0x00008080; // 8 and 16 bit symbols
102+
#else
103+
#error No valid target for this. Update in the appropriate portion above.
104+
#endif
105+
94106
cap->support_slave_mode = false; // to be determined later based on ssel
95107
cap->hw_cs_handle = false; // to be determined later based on ssel
96108
cap->slave_delay_between_symbols_ns = 0; // irrelevant in master mode
@@ -384,7 +396,108 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
384396
DEBUG_PRINTF("spi_format, bits:%d, mode:%d, slave?:%d\r\n", bits, mode, slave);
385397

386398
// Save new values
387-
handle->Init.DataSize = (bits == 16) ? SPI_DATASIZE_16BIT : SPI_DATASIZE_8BIT;
399+
uint32_t DataSize;
400+
switch (bits) {
401+
#if defined(TARGET_STM32F0) || defined(TARGET_STM32F3) || defined(TARGET_STM32F7) || \
402+
defined(TARGET_STM32G0) || defined(TARGET_STM32G4) || defined(TARGET_STM32L4) || \
403+
defined(TARGET_STM32L5) || defined(TARGET_STM32WB) || defined(TARGET_STM32H7)
404+
case 4:
405+
DataSize = SPI_DATASIZE_4BIT;
406+
break;
407+
case 5:
408+
DataSize = SPI_DATASIZE_5BIT;
409+
break;
410+
case 6:
411+
DataSize = SPI_DATASIZE_6BIT;
412+
break;
413+
case 7:
414+
DataSize = SPI_DATASIZE_7BIT;
415+
break;
416+
case 9:
417+
DataSize = SPI_DATASIZE_9BIT;
418+
break;
419+
case 10:
420+
DataSize = SPI_DATASIZE_10BIT;
421+
break;
422+
case 11:
423+
DataSize = SPI_DATASIZE_11BIT;
424+
break;
425+
case 12:
426+
DataSize = SPI_DATASIZE_12BIT;
427+
break;
428+
case 13:
429+
DataSize = SPI_DATASIZE_13BIT;
430+
break;
431+
case 14:
432+
DataSize = SPI_DATASIZE_14BIT;
433+
break;
434+
case 15:
435+
DataSize = SPI_DATASIZE_15BIT;
436+
break;
437+
#if defined(TARGET_STM32H7)
438+
case 17:
439+
DataSize = SPI_DATASIZE_17BIT;
440+
break;
441+
case 18:
442+
DataSize = SPI_DATASIZE_18BIT;
443+
break;
444+
case 19:
445+
DataSize = SPI_DATASIZE_19BIT;
446+
break;
447+
case 20:
448+
DataSize = SPI_DATASIZE_20BIT;
449+
break;
450+
case 21:
451+
DataSize = SPI_DATASIZE_21BIT;
452+
break;
453+
case 22:
454+
DataSize = SPI_DATASIZE_22BIT;
455+
break;
456+
case 23:
457+
DataSize = SPI_DATASIZE_23BIT;
458+
break;
459+
case 24:
460+
DataSize = SPI_DATASIZE_24BIT;
461+
break;
462+
case 25:
463+
DataSize = SPI_DATASIZE_25BIT;
464+
break;
465+
case 26:
466+
DataSize = SPI_DATASIZE_26BIT;
467+
break;
468+
case 27:
469+
DataSize = SPI_DATASIZE_27BIT;
470+
break;
471+
case 28:
472+
DataSize = SPI_DATASIZE_28BIT;
473+
break;
474+
case 29:
475+
DataSize = SPI_DATASIZE_29BIT;
476+
break;
477+
case 30:
478+
DataSize = SPI_DATASIZE_30BIT;
479+
break;
480+
case 31:
481+
DataSize = SPI_DATASIZE_31BIT;
482+
break;
483+
case 32:
484+
DataSize = SPI_DATASIZE_32BIT;
485+
break;
486+
#endif
487+
#elif !defined(TARGET_STM32F1) && !defined(TARGET_STM32F2) && !defined(TARGET_STM32F4) && \
488+
!defined(TARGET_STM32L0) && defined(TARGET_STM32L1)
489+
#error No valid target for this. Update in the appropriate portion above.
490+
#endif
491+
case 16:
492+
DataSize = SPI_DATASIZE_16BIT;
493+
break;
494+
// 8 bits is the default for anything not found before
495+
default:
496+
DataSize = SPI_DATASIZE_8BIT;
497+
break;
498+
}
499+
500+
handle->Init.DataSize = DataSize;
388501

389502
switch (mode) {
390503
case 0:

0 commit comments

Comments
 (0)