Beispiel zur Implementierung einer SPI per Software auf dem STM32. Diese Implementierung in C ist unvollständig (es ist nur das Senden von Daten implementiert), reicht aber aus um z.B. Displays per SPI anzusteuern. Die Daten werden mit dem MSB zuerst gesendet.
#include <stddef.h> /* size_t */
#define SPI_CLK_L() GPIOA->BRR=(1<<0)
#define SPI_CLK_H() GPIOA->BSRR=(1<<0)
#define SPI_MOSI_L() GPIOA->BRR=(1<<1)
#define SPI_MOSI_H() GPIOA->BSRR=(1<<1)
#define SPI_CS_L() GPIOA->BRR=(1<<2)
#define SPI_CS_H() GPIOA->BSRR=(1<<2)
void spi_wr_byte(uint8_t data)
{
SPI_CS_L();
for(size_t i = 0; i < 8; i++) {
if (data & 0x80) {
SPI_MOSI_H();
} else {
SPI_MOSI_L();
}
data = data << 1;
SPI_CLK_L();
SPI_CLK_H();
}
SPI_CS_H();
}