|
71 | 71 | extern HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi);
|
72 | 72 | #endif
|
73 | 73 |
|
| 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 | + |
74 | 121 | void init_spi(spi_t *obj)
|
75 | 122 | {
|
76 | 123 | struct spi_s *spiobj = SPI_S(obj);
|
|
0 commit comments