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();
}