How to Use SPI in Arduino: Simple Guide with Example
To use
SPI in Arduino, include the SPI.h library, initialize SPI with SPI.begin(), and communicate using functions like SPI.transfer(). This allows your Arduino to talk to SPI devices like sensors or displays using the SPI protocol.Syntax
Here is the basic syntax to use SPI in Arduino:
#include <SPI.h>: Includes the SPI library.SPI.begin(): Initializes the SPI bus.SPI.transfer(data): Sends and receives a byte over SPI.pinMode(SS, OUTPUT): Sets the Slave Select pin as output to control device selection.
You control the Slave Select (SS) pin manually to start and stop communication with the SPI device.
arduino
#include <SPI.h> void setup() { pinMode(SS, OUTPUT); // Set Slave Select pin as output SPI.begin(); // Initialize SPI bus } void loop() { digitalWrite(SS, LOW); // Select the SPI device byte response = SPI.transfer(0x42); // Send byte 0x42 and receive response digitalWrite(SS, HIGH); // Deselect the SPI device delay(1000); }
Example
This example shows how to send a byte to an SPI device and read the response. It uses the built-in SPI library and controls the Slave Select pin manually.
arduino
#include <SPI.h> const int slaveSelectPin = 10; // Common SS pin for SPI devices void setup() { Serial.begin(9600); pinMode(slaveSelectPin, OUTPUT); SPI.begin(); } void loop() { digitalWrite(slaveSelectPin, LOW); // Select the device byte sentData = 0x55; // Data to send byte receivedData = SPI.transfer(sentData); // Send and receive digitalWrite(slaveSelectPin, HIGH); // Deselect the device Serial.print("Sent: 0x"); Serial.print(sentData, HEX); Serial.print(" | Received: 0x"); Serial.println(receivedData, HEX); delay(1000); }
Output
Sent: 0x55 | Received: 0x0
Common Pitfalls
Common mistakes when using SPI in Arduino include:
- Not setting the Slave Select (SS) pin as
OUTPUT, which can cause the Arduino to become an SPI slave unintentionally. - Forgetting to pull the SS pin
LOWbefore communication andHIGHafter, which can confuse the SPI device. - Not matching SPI settings (clock speed, data order, mode) with the device requirements.
- Using
SPI.transfer()without checking device datasheets for proper command sequences.
Example of wrong and right SS pin handling:
arduino
// Wrong way: Not controlling SS pin #include <SPI.h> void setup() { SPI.begin(); } void loop() { SPI.transfer(0xFF); // No SS control, device may not respond delay(1000); } // Right way: Control SS pin #include <SPI.h> const int ssPin = 10; void setup() { pinMode(ssPin, OUTPUT); SPI.begin(); } void loop() { digitalWrite(ssPin, LOW); // Select device SPI.transfer(0xFF); digitalWrite(ssPin, HIGH); // Deselect device delay(1000); }
Quick Reference
Here is a quick cheat sheet for SPI functions and pins in Arduino:
| Function/Pin | Description |
|---|---|
| #include <SPI.h> | Include SPI library |
| SPI.begin() | Initialize SPI bus |
| SPI.transfer(byte) | Send and receive a byte over SPI |
| pinMode(SS, OUTPUT) | Set Slave Select pin as output |
| digitalWrite(SS, LOW/HIGH) | Select/Deselect SPI device |
| SPI.setClockDivider(divider) | Set SPI clock speed |
| SPI.setDataMode(mode) | Set SPI mode (0-3) |
| SPI.setBitOrder(order) | Set bit order (MSBFIRST or LSBFIRST) |
Key Takeaways
Always include
SPI.h and call SPI.begin() to start SPI communication.Manually control the Slave Select (SS) pin to select the SPI device before transfer and deselect after.
Use
SPI.transfer() to send and receive data bytes over SPI.Match SPI settings like clock speed and mode to your device's requirements.
Common errors include not setting SS pin as output and not toggling it properly.