Skip to content

Commit 7202b77

Browse files
committed
STM SPI capabilities: rx/tx buffers can have different sizes
1 parent 769b7c5 commit 7202b77

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

targets/TARGET_STM/stm_spi_api.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,53 @@
7171
extern HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi);
7272
#endif
7373

74+
void spi_get_capabilities(PinName ssel, bool slave, spi_capabilities_t *cap)
75+
{
76+
if (slave) {
77+
cap->minimum_frequency = 200000; // 200 kHz
78+
cap->maximum_frequency = 2000000; // 2 MHz
79+
cap->word_length = 0x00008080; // 8 and 16 bit symbols
80+
cap->support_slave_mode = false; // to be determined later based on ssel
81+
cap->hw_cs_handle = false; // irrelevant in slave mode
82+
cap->slave_delay_between_symbols_ns = 2500; // 2.5 us
83+
cap->clk_modes = 0x0f; // all clock modes
84+
cap->tx_rx_buffers_equal_length = false; // rx/tx buffers can have different sizes
85+
#if DEVICE_SPI_ASYNCH
86+
cap->async_mode = true;
87+
#else
88+
cap->async_mode = false;
89+
#endif
90+
} else {
91+
cap->minimum_frequency = 200000; // 200 kHz
92+
cap->maximum_frequency = 2000000; // 2 MHz
93+
cap->word_length = 0x00008080; // 8 and 16 bit symbols
94+
cap->support_slave_mode = false; // to be determined later based on ssel
95+
cap->hw_cs_handle = false; // to be determined later based on ssel
96+
cap->slave_delay_between_symbols_ns = 0; // irrelevant in master mode
97+
cap->clk_modes = 0x0f; // all clock modes
98+
cap->tx_rx_buffers_equal_length = false; // rx/tx buffers can have different sizes
99+
#if DEVICE_SPI_ASYNCH
100+
cap->async_mode = true;
101+
#else
102+
cap->async_mode = false;
103+
#endif
104+
}
105+
106+
// check if given ssel pin is in the cs pinmap
107+
const PinMap *cs_pins = spi_master_cs_pinmap();
108+
PinName pin = NC;
109+
while (cs_pins->pin != NC) {
110+
if (cs_pins->pin == ssel) {
111+
#if DEVICE_SPISLAVE
112+
cap->support_slave_mode = true;
113+
#endif
114+
cap->hw_cs_handle = true;
115+
break;
116+
}
117+
cs_pins++;
118+
}
119+
}
120+
74121
void init_spi(spi_t *obj)
75122
{
76123
struct spi_s *spiobj = SPI_S(obj);

0 commit comments

Comments
 (0)