STM32 Software SPI

Beispiel zur Implementierung einer SPI per Software auf dem STM32. Diese Implementierung 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.

stm32_soft_spi.c
#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();
}