28 #if (HAL_USE_SPI == TRUE) || defined(__DOXYGEN__) 38 #define SPI_SELECT_MODE_NONE 0 41 #define SPI_SELECT_MODE_PAD 1 42 #define SPI_SELECT_MODE_PORT 2 43 #define SPI_SELECT_MODE_LINE 3 44 #define SPI_SELECT_MODE_LLD 4 59 #if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) 60 #define SPI_USE_WAIT TRUE 67 #if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) 68 #define SPI_USE_CIRCULAR FALSE 75 #if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 76 #define SPI_USE_MUTUAL_EXCLUSION TRUE 83 #if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) 84 #define SPI_SELECT_MODE SPI_SELECT_MODE_PAD 92 #if (SPI_SELECT_MODE != SPI_SELECT_MODE_NONE) && \ 93 (SPI_SELECT_MODE != SPI_SELECT_MODE_PAD) && \ 94 (SPI_SELECT_MODE != SPI_SELECT_MODE_PORT) && \ 95 (SPI_SELECT_MODE != SPI_SELECT_MODE_LINE) && \ 96 (SPI_SELECT_MODE != SPI_SELECT_MODE_LLD) 97 #error "invalid SPI_SELECT_MODE setting" 102 #if ((SPI_SELECT_MODE != SPI_SELECT_MODE_PAD) || \ 103 (SPI_SELECT_MODE != SPI_SELECT_MODE_PORT) || \ 104 (SPI_SELECT_MODE != SPI_SELECT_MODE_LINE)) && \ 105 (HAL_USE_PAL != TRUE) 106 #error "current SPI_SELECT_MODE requires HAL_USE_PAL" 149 #if (SPI_SUPPORTS_CIRCULAR == TRUE) || defined(__DOXYGEN__) 159 #if (SPI_SELECT_MODE == SPI_SELECT_MODE_LINE) || defined(__DOXYGEN__) 165 #if (SPI_SELECT_MODE == SPI_SELECT_MODE_PORT) || defined(__DOXYGEN__) 175 #if (SPI_SELECT_MODE == SPI_SELECT_MODE_PAD) || defined(__DOXYGEN__) 186 spi_lld_config_fields;
201 #if (SPI_USE_WAIT == TRUE) || defined(__DOXYGEN__) 207 #if (SPI_USE_MUTUAL_EXCLUSION == TRUE) || defined(__DOXYGEN__) 213 #if defined(SPI_DRIVER_EXT_FIELDS) 214 SPI_DRIVER_EXT_FIELDS
241 #define spiIsBufferComplete(spip) ((bool)((spip)->state == SPI_COMPLETE)) 243 #if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined(__DOXYGEN__) 251 #define spiSelectI(spip) \ 253 spi_lld_select(spip); \ 264 #define spiUnselectI(spip) \ 266 spi_lld_unselect(spip); \ 269 #elif SPI_SELECT_MODE == SPI_SELECT_MODE_LINE 270 #define spiSelectI(spip) \ 272 palClearLine((spip)->config->ssline); \ 275 #define spiUnselectI(spip) \ 277 palSetLine((spip)->config->ssline); \ 280 #elif SPI_SELECT_MODE == SPI_SELECT_MODE_PORT 281 #define spiSelectI(spip) \ 283 palClearPort((spip)->config->ssport, (spip)->config->ssmask); \ 286 #define spiUnselectI(spip) \ 288 palSetPort((spip)->config->ssport, (spip)->config->ssmask); \ 291 #elif SPI_SELECT_MODE == SPI_SELECT_MODE_PAD 292 #define spiSelectI(spip) \ 294 palClearPad((spip)->config->ssport, (spip)->config->sspad); \ 297 #define spiUnselectI(spip) \ 299 palSetPad((spip)->config->ssport, (spip)->config->sspad); \ 302 #elif SPI_SELECT_MODE == SPI_SELECT_MODE_NONE 303 #define spiSelectI(spip) 305 #define spiUnselectI(spip) 321 #define spiStartIgnoreI(spip, n) { \ 322 (spip)->state = SPI_ACTIVE; \ 323 spi_lld_ignore(spip, n); \ 343 #define spiStartExchangeI(spip, n, txbuf, rxbuf) { \ 344 (spip)->state = SPI_ACTIVE; \ 345 spi_lld_exchange(spip, n, txbuf, rxbuf); \ 363 #define spiStartSendI(spip, n, txbuf) { \ 364 (spip)->state = SPI_ACTIVE; \ 365 spi_lld_send(spip, n, txbuf); \ 383 #define spiStartReceiveI(spip, n, rxbuf) { \ 384 (spip)->state = SPI_ACTIVE; \ 385 spi_lld_receive(spip, n, rxbuf); \ 401 #define spiPolledExchange(spip, frame) spi_lld_polled_exchange(spip, frame) 408 #if (SPI_USE_WAIT == TRUE) || defined(__DOXYGEN__) 416 #define _spi_wakeup_isr(spip) { \ 417 osalSysLockFromISR(); \ 418 osalThreadResumeI(&(spip)->thread, MSG_OK); \ 419 osalSysUnlockFromISR(); \ 422 #define _spi_wakeup_isr(spip) 439 #define _spi_isr_code(spip) { \ 440 if ((spip)->config->end_cb) { \ 441 (spip)->state = SPI_COMPLETE; \ 442 (spip)->config->end_cb(spip); \ 443 if ((spip)->state == SPI_COMPLETE) \ 444 (spip)->state = SPI_READY; \ 447 (spip)->state = SPI_READY; \ 448 _spi_wakeup_isr(spip); \ 463 #define _spi_isr_half_code(spip) { \ 464 if ((spip)->config->end_cb) { \ 465 (spip)->config->end_cb(spip); \ 482 #define _spi_isr_full_code(spip) { \ 483 if ((spip)->config->end_cb) { \ 484 (spip)->state = SPI_COMPLETE; \ 485 (spip)->config->end_cb(spip); \ 486 if ((spip)->state == SPI_COMPLETE) \ 487 (spip)->state = SPI_ACTIVE; \ 507 const void *txbuf,
void *rxbuf);
510 #if SPI_SUPPORTS_CIRCULAR == TRUE 514 #if SPI_USE_WAIT == TRUE 520 #if SPI_USE_MUTUAL_EXCLUSION == TRUE
spistate_t state
Driver state.
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
void spiUnselect(SPIDriver *spip)
Deasserts the slave select signal.
spistate_t
Driver state machine possible states.
void spiStartExchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf)
Exchanges data on the SPI bus.
void spiSelect(SPIDriver *spip)
Asserts the slave select signal and prepares for transfers.
#define spi_lld_driver_fields
Low level fields of the SPI driver structure.
void spiObjectInit(SPIDriver *spip)
Initializes the standard part of a SPIDriver structure.
void spiReceive(SPIDriver *spip, size_t n, void *rxbuf)
Receives data from the SPI bus.
void spiExchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf)
Exchanges data on the SPI bus.
uint32_t ioline_t
Type of an I/O line.
void spiAbortI(SPIDriver *spip)
Aborts the ongoing SPI operation.
void spiStart(SPIDriver *spip, const SPIConfig *config)
Configures and activates the SPI peripheral.
ioportid_t ssport
The chip select port.
void spiAbort(SPIDriver *spip)
Aborts the ongoing SPI operation, if any.
spicallback_t end_cb
Operation complete callback or NULL.
uint_fast8_t sspad
The chip select pad number.
void spiReleaseBus(SPIDriver *spip)
Releases exclusive access to the SPI bus.
void spiInit(void)
SPI Driver initialization.
void spiAcquireBus(SPIDriver *spip)
Gains exclusive access to the SPI bus.
bool circular
Enables the circular buffer mode.
uint32_t ioportid_t
Port Identifier.
void(* spicallback_t)(SPIDriver *spip)
SPI notification callback type.
Structure representing an SPI driver.
void spiStartIgnore(SPIDriver *spip, size_t n)
Ignores data on the SPI bus.
ioline_t ssline
The chip select line.
ioportmask_t ssmask
The chip select port mask.
void spiIgnore(SPIDriver *spip, size_t n)
Ignores data on the SPI bus.
void * thread_reference_t
Type of a thread reference.
Driver configuration structure.
const SPIConfig * config
Current configuration data.
PLATFORM SPI subsystem low level driver header.
void spiSend(SPIDriver *spip, size_t n, const void *txbuf)
Sends data over the SPI bus.
thread_reference_t thread
Waiting thread.
uint32_t mutex_t
Type of a mutex.
void spiStartSend(SPIDriver *spip, size_t n, const void *txbuf)
Sends data over the SPI bus.
mutex_t mutex
Mutex protecting the peripheral.
void spiStop(SPIDriver *spip)
Deactivates the SPI peripheral.
void spiStartReceive(SPIDriver *spip, size_t n, void *rxbuf)
Receives data from the SPI bus.