Serial Peripheral Interface (SPI) is a synchronous serial data protocol used by microcontrollers for communicating with one or more peripheral devices quickly over short distances. It can also be used for communication between two microcontrollers.
With an SPI connection there is always one master device (usually a microcontroller) which controls the peripheral devices. Typically there are three lines common to all the devices:
- MISO (Master In Slave Out) — The Slave line for sending data to the master
- MOSI (Master Out Slave In) — The Master line for sending data to the peripherals
- SCK (Serial Clock) — The clock pulses which synchronize data transmission generated by the master
- CS/SS (Slave Select or Chips Select) — the pin on each device that the master can use to enable and disable specific devices.
For more infomation about pins of Z-Uno here
When a device's Slave Select pin is low, it communicates with the master. When it's high, it ignores the master. This allows you to have multiple SPI devices sharing the same MISO, MOSI, and CLK lines.
To write code for a new SPI device you need to note a few things:
- What is the maximum SPI speed your device can use? This is controlled by the first parameter in SPISettings. Z-Uno supports up to 8MHz (8000000). Z-Uno will automatically use the best speed that is equal to or less than the number you use with SPISettings.
- Is data shifted in Most Significant Bit (MSB) or Least Significant Bit (LSB) first? This is controlled by second SPISettings parameter, either MSBFIRST or LSBFIRST. Most SPI chips use MSB first data order.
- Is the data clock idle when high or low? Are samples on the rising or falling edge of clock pulses? These modes are controlled by the third parameter in SPISettings.
Once you have your SPI parameters, use SPI.beginTransaction() to begin using the SPI port.
The SPI settings are applied at the beginning of the transaction and SPI.endTransaction() doesn't change SPI settings. Unless you, or some library, calls beginTransaction a second time, the setting are maintained. You should attempt to minimize the time between before you call SPI.endTransaction(), for best compatibility if your program is used together with other libraries which use SPI. With most SPI devices, after SPI.beginTransaction(), you will write the slave select pin LOW, call SPI.transfer() any number of times to transfer data, then write the SS pin HIGH, and finally call SPI.endTransaction().SPISettings spi_settings = SPISettings(8000000, MSBFIRST, SPI_MODE0); SPI.beginTransaction(&spi_settings); // ... SPI.endTransaction();