SPI Communication

Learn about the SPI Communication system used in Arduino projects

SPI Bus Fundamentals

SPI (Serial Peripheral Interface) is a synchronous serial communication protocol...


// Basic SPI Initialization
#include <SPI.h>

void setup() {
    SPI.begin();
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    SPI.setDataMode(SPI_MODE0);
}

void loop() {
    // Your code here
}
            

Pin Configuration

Board MOSI MISO SCK SS
Arduino Uno 11 12 13 10
Arduino Mega 51 50 52 53

Advanced Configuration


// Advanced SPI Settings
SPI.beginTransaction(SPISettings(
    8000000,   // 8 MHz clock
    MSBFIRST,  // Bit order
    SPI_MODE0   // SPI Mode
));
            

Multiple Slave Configuration


const int slave1 = 9;
const int slave2 = 8;

void setup() {
    pinMode(slave1, OUTPUT);
    pinMode(slave2, OUTPUT);
    digitalWrite(slave1, HIGH);
    digitalWrite(slave2, HIGH);
}

void selectSlave(int pin) {
    digitalWrite(slave1, HIGH);
    digitalWrite(slave2, HIGH);
    digitalWrite(pin, LOW);
}
            

SPI Modes

Mode CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1

Troubleshooting Guide


// Debugging Example
void checkSPIConnection() {
    digitalWrite(SS_PIN, LOW);
    if (SPI.transfer(0x00) == 0xFF) {
        Serial.println("SPI Connection OK");
    } else {
        Serial.println("SPI Connection Error");
    }
    digitalWrite(SS_PIN, HIGH);
}
            

Temperature Sensor Example


#include <SPI.h>
const int CS_PIN = 10;

void setup() {
    Serial.begin(9600);
    SPI.begin();
    pinMode(CS_PIN, OUTPUT);
}

void loop() {
    digitalWrite(CS_PIN, LOW);
    byte data1 = SPI.transfer(0x00);
    byte data2 = SPI.transfer(0x00);
    digitalWrite(CS_PIN, HIGH);
    
    int result = (data1 << 8) | data2;
    Serial.print("Temperature: ");
    Serial.println(result);
    delay(1000);
}
            

Best Practices


// Safe SPI Transaction
void safeSPITransfer() {
    SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
    digitalWrite(SS_PIN, LOW);
    // Critical operations here
    digitalWrite(SS_PIN, HIGH);
    SPI.endTransaction();
}