SPI

To use the hardware SPI, include it in your code:

#include "SPI.h"

The first SPI object is explicitly created, and is connected to the SPI1 instance.

Please check your board documentation to see which pins is SPI connected to by default.

To use additional SPI, use the constructors to create your object, or the stm32SetInstance() method.

SPIClass(SPI_TypeDef *instance)

Create a SPI object that is connected to the instance, on the default mosi/miso/sck. To avoid confusion, it is better to use the constructor below with implicit pins.

SPIClass(SPI_TypeDef *instance, uint8_t mosi, uint8_t miso, uint8_t sck)

Create a SPI object that is connected to the instance, on the specified mosi/miso/sck pins.

Please check the documentation of the chip to see which pins can be used.

Example: set up SPI2

SPIClass SPI_2(SPI2, mosi, iso, sck);
void setup() {
    SPI_2.begin();
}

begin()

Enables SPI on the pins

end()

Disables SPI on the pins

beginTransaction(SPISettings settings);

Initializes SPI with the provided SPISettings mySetting(speedMaximum, dataOrder, dataMode) parameters.

Parameter Description
speedMaximum The maximum speed requested
dataOrder MSBFIRST, LSBFIRST
dataMode SPI_MODE0, SPI_MODE1, SPI_MODE2, or SPI_MODE3

Example:

SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));

endTransaction();

uint8_t transfer(uint8_t data);

Send a 8 bits on SPI, and return the received 8 bit data.

uint16_t transfer16(uint16_t data);

Send a 16 bits on SPI, and return the received 16 bit data.

transfer(uint8_t *buf, size_t count);

Send the data in the buffer. The received data is stored in the same buffer.

transfer(tx, rxBuffer, size_t count[, callback]);

tx| --- |--- uint8_t txData | the same byte is sent count times uint8_t *txBuffer| the buffer is sent NULL | 0xFF is sent count times

rxBuffer| --- |--- uint8_t *rxBuffer | the received data is stored in the rxBuffer NULL | the received data is ignored

callback| --- | --- parameter not set | transfer is blocking NULL | transfer is non-blocking, sends the data using DMA, and returns immediately. function pointer | transfer is non-blocking, sends the data using DMA, and returns immediately. At the end of the transfer, the callback function is called in interrupt.

void flush(void);

Waits for the last non-blocking transfer to complete.

bool done(void);

Returns true if the last non-blocking transfer is completed.

stm32SetMOSI(uint8_t pin);

Set the MOSI pin used by this SPI.

This method must be called before begin()!

stm32SetMISO(uint8_t pin);

Set the alternative MISO pin used by this SPI.

This method must be called before begin()!

stm32SetSCK(uint8_t pin);

Set the alternative SCK pin used by this SPI.

This method must be called before begin()!

stm32SetInstance(SPI_TypeDef *instance);

Set the alternative SPI instance (SPI1/SPI2/...) used by this object.

This method must be called before begin()!

Example: If you want to use a library that has hardcoded SPI in it, but you want to use SPI2:

#include "SPI.h"

void setup() {
    SPI.stm32SetInstance(SPI2);
    SPI.stm32SetMOSI(mosi);
    SPI.stm32SetMISO(miso);
    SPI.stm32SetSCK(sck);
    ...
    library.begin();
}