284 SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel = NC);
387 int write(
const uint8_t *tx_buffer,
int tx_length, uint8_t *rx_buffer,
int rx_length)
389 return write_internal(tx_buffer, tx_length, rx_buffer, rx_length);
393 int write(
const int8_t *tx_buffer,
int tx_length, int8_t *rx_buffer,
int rx_length)
395 return write_internal(tx_buffer, tx_length, rx_buffer, rx_length);
398 int write(
const char *tx_buffer,
int tx_length,
char *rx_buffer,
int rx_length)
400 return write_internal(tx_buffer, tx_length, rx_buffer, rx_length);
402 int write(
const uint16_t *tx_buffer,
int tx_length, uint16_t *rx_buffer,
int rx_length)
404 return write_internal(tx_buffer, tx_length, rx_buffer, rx_length);
406 int write(
const uint32_t *tx_buffer,
int tx_length, uint32_t *rx_buffer,
int rx_length)
408 return write_internal(tx_buffer, tx_length, rx_buffer, rx_length);
489 return transfer_internal(tx_buffer, tx_length, rx_buffer.
data(), rx_length,
callback, event);
495 return transfer_internal(tx_buffer, tx_length, rx_buffer, rx_length,
callback, event);
497 int transfer(
const int8_t *tx_buffer,
int tx_length, CacheAlignedBuffer<int8_t> &rx_buffer,
int rx_length,
const event_callback_t &
callback,
int event =
SPI_EVENT_COMPLETE)
499 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity()));
500 return transfer_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length,
callback, event);
504 return transfer_internal(tx_buffer, tx_length, rx_buffer, rx_length,
callback, event);
507 int transfer(
const char *tx_buffer,
int tx_length, CacheAlignedBuffer<char> &rx_buffer,
int rx_length,
const event_callback_t &
callback,
int event =
SPI_EVENT_COMPLETE)
509 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity()));
510 return transfer_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length,
callback, event);
514 return transfer_internal(tx_buffer, tx_length, rx_buffer, rx_length,
callback, event);
516 int transfer(
const uint16_t *tx_buffer,
int tx_length, CacheAlignedBuffer<uint16_t> &rx_buffer,
int rx_length,
const event_callback_t &
callback,
int event =
SPI_EVENT_COMPLETE)
518 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity() *
sizeof(uint16_t)));
519 return transfer_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length,
callback, event);
523 return transfer_internal(tx_buffer, tx_length, rx_buffer, rx_length,
callback, event);
525 int transfer(
const uint32_t *tx_buffer,
int tx_length, CacheAlignedBuffer<uint32_t> &rx_buffer,
int rx_length,
const event_callback_t &
callback,
int event =
SPI_EVENT_COMPLETE)
527 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity() *
sizeof(uint32_t)));
528 return transfer_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length,
callback, event);
532 return transfer_internal(tx_buffer, tx_length, rx_buffer, rx_length,
callback, event);
563 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer.
data(), rx_length, timeout);
569 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer, rx_length, timeout);
573 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity()));
574 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length, timeout);
578 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer, rx_length, timeout);
583 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity()));
584 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length, timeout);
588 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer, rx_length, timeout);
592 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity() *
sizeof(uint16_t)));
593 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length, timeout);
597 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer, rx_length, timeout);
601 MBED_ASSERT(rx_length <=
static_cast<int>(rx_buffer.capacity() *
sizeof(uint32_t)));
602 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer.data(), rx_length, timeout);
606 return transfer_and_wait_internal(tx_buffer, tx_length, rx_buffer, rx_length, timeout);
638#if !defined(DOXYGEN_ONLY)
643 void irq_handler_asynch(
void);
661 int transfer_internal(
const void *tx_buffer,
int tx_length,
void *rx_buffer,
int rx_length,
const event_callback_t &
callback,
int event);
687 int transfer_and_wait_internal(
const void *tx_buffer,
int tx_length,
void *rx_buffer,
int rx_length, rtos::Kernel::Clock::duration_u32 timeout);
705 int queue_transfer(
const void *tx_buffer,
int tx_length,
void *rx_buffer,
int rx_length,
unsigned char bit_width,
const event_callback_t &
callback,
int event);
719 void start_transfer(
const void *tx_buffer,
int tx_length,
void *rx_buffer,
int rx_length,
unsigned char bit_width,
const event_callback_t &
callback,
int event);
723 void lock_deep_sleep();
726 void unlock_deep_sleep();
729#if MBED_CONF_DRIVERS_SPI_TRANSACTION_QUEUE_LEN
738 void dequeue_transaction();
744#if !defined(DOXYGEN_ONLY)
746#ifdef DEVICE_SPI_COUNT
748 typedef ::SPIName SPIName;
751 enum SPIName { GlobalSPI };
760 struct spi_peripheral_s {
762 SPIName name = SPIName(0);
768 SPI *owner =
nullptr;
770 uint8_t numUsers = 0;
772 bool initialized =
false;
773#if DEVICE_SPI_ASYNCH && MBED_CONF_DRIVERS_SPI_TRANSACTION_QUEUE_LEN
782 static spi_peripheral_s _peripherals[SPI_PERIPHERALS_USED];
783 static int _peripherals_used;
786 spi_peripheral_s *_peripheral;
792 event_callback_t _callback;
796 bool _deep_sleep_locked;
800 volatile bool _transfer_in_progress =
false;
804 bool _transfer_in_progress_uses_dma;
809 void *_transfer_in_progress_rx_buffer;
810 size_t _transfer_in_progress_rx_len;
835 volatile uint8_t _select_count = 0;
839 SPIName _peripheral_name;
841 void (*_init_func)(
SPI *);
850 void _do_construct();
861 static spi_peripheral_s *_lookup(SPIName name);
866 static spi_peripheral_s *_alloc();
870 static void _dealloc(spi_peripheral_s *peripheral);
872 static void _do_init(SPI *obj);
873 static void _do_init_direct(SPI *obj);
893 virtual int write_internal(
const void *tx_buffer,
int tx_length,
void *rx_buffer,
int rx_length);