Arduino SPI Communication
Basic SPI master example reading from an SPI slave device:
Arduino (Master Device)
#include <SPI.h>
const int chipSelect = 10; // CS pin
void setup() {
Serial.begin(9600);
// Initialize SPI
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setDataMode(SPI_MODE0); // Mode 0: CPOL=0, CPHA=0
pinMode(chipSelect, OUTPUT);
digitalWrite(chipSelect, HIGH); // Deselect initially
}
void loop() {
// Select slave
digitalWrite(chipSelect, LOW);
delayMicroseconds(10);
// Send command and read response
byte response = SPI.transfer(0xAA); // Send 0xAA, read response
Serial.print("Response: 0x");
Serial.println(response, HEX);
// Deselect slave
digitalWrite(chipSelect, HIGH);
delayMicroseconds(10);
delay(500);
}
STM32 SPI Communication
SPI configuration using STM32CubeMX generated code:
STM32 (HAL Library)
void SPI_Init(void) {
// SPI1 is configured via CubeMX
// PA5 = SCLK, PA6 = MISO, PA7 = MOSI, PA4 = CS
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi1);
}
void SPI_Write(uint8_t data) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
Reading from SPI Sensor (ADXL345 Accelerometer)
Complete Read Sequence
// ADXL345 register addresses
#define ADXL345_DEVID 0x00
#define ADXL345_DATAX0 0x32
uint8_t readADXL345Register(uint8_t reg) {
digitalWrite(chipSelect, LOW);
// For read operation, set MSB to 1
SPI.transfer(0x80 | reg); // Read mode
uint8_t value = SPI.transfer(0x00); // Read data
digitalWrite(chipSelect, HIGH);
return value;
}
void setup() {
Serial.begin(9600);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16);
pinMode(chipSelect, OUTPUT);
digitalWrite(chipSelect, HIGH);
}
void loop() {
// Read device ID
uint8_t deviceID = readADXL345Register(ADXL345_DEVID);
Serial.print("Device ID: 0x");
Serial.println(deviceID, HEX);
delay(1000);
}