Loading...
Searching...
No Matches
spi.c
1/***********************************************************************************
2 * @file spi.c *
3 * @author Matt Ricci *
4 * @addtogroup SPI *
5 * @brief Implements functions for SPI device interface initialization and *
6 * communication. *
7 * *
8 * @todo Rewrite initialisation to implement enum check for 8/16 bit mode *
9 * and assign approprriate function pointers *
10 ***********************************************************************************/
11
12#include "spi.h"
13
14static void SPI_send8(SPI *, uint16_t);
15static void SPI_send16(SPI *, uint16_t);
16
17static void SPI_receive8(SPI *, volatile uint16_t *);
18static void SPI_receive16(SPI *, volatile uint16_t *);
19
20/* =============================================================================== */
32void SPI_init(SPI *spi, DeviceType device, SPI_TypeDef *interface, DataFormat df, GPIO_TypeDef *port, unsigned long cs) {
33 spi->device = device;
34 spi->interface = interface;
35 spi->port = port;
36 spi->cs = cs;
37
38 spi->send = (df == MODE8) ? SPI_send8 : SPI_send16;
39 spi->receive = (df == MODE8) ? SPI_receive8 : SPI_receive16;
41}
42
43/* =============================================================================== */
52uint16_t SPI_transmit(SPI *spi, uint16_t data) {
53 volatile uint16_t response;
54 spi->send(spi, data);
55 spi->receive(spi, &response);
56 while (spi->interface->SR & SPI_SR_BSY);
57 return response;
58}
59
60/* =============================================================================== */
69static void SPI_send8(SPI *spi, uint16_t data) {
70 while (!(spi->interface->SR & SPI_SR_TXE));
71 spi->interface->DR = (uint8_t)data;
72}
73
74static void SPI_send16(SPI *spi, uint16_t data) {
75 while (!(spi->interface->SR & SPI_SR_TXE));
76 spi->interface->DR = data;
77}
78
79/* =============================================================================== */
88static void SPI_receive8(SPI *spi, volatile uint16_t *data) {
89 while (!(spi->interface->SR & SPI_SR_RXNE));
90 *data = (uint8_t) spi->interface->DR;
91}
92
93static void SPI_receive16(SPI *spi, volatile uint16_t *data) {
94 while (!(spi->interface->SR & SPI_SR_RXNE));
95 *data = spi->interface->DR;
96}
uint16_t SPI_transmit(SPI *, uint16_t)
Instance method to communicate a SPI transaction with slave device.
Definition spi.c:52
void SPI_init(SPI *spi, DeviceType device, SPI_TypeDef *interface, DataFormat df, GPIO_TypeDef *port, unsigned long cs)
Initialiser for an SPI device interface.
Definition spi.c:32
DataFormat
Data format enum Describes the format of dataframes sent on the SPI data bus.
Definition spi.h:40
DeviceType
Device type enum Describes the type of peripheral implementing an SPI interface.
Definition spi.h:28
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
Definition spi.h:49
void(* send)(struct SPI *, uint16_t)
SPI send method.
Definition spi.h:54
DeviceType device
Enum specifier for device type.
Definition spi.h:50
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Definition spi.h:56
GPIO_TypeDef * port
Pointer to GPIO port struct.
Definition spi.h:52
unsigned long cs
Device chip select address.
Definition spi.h:53
void(* receive)(struct SPI *, volatile uint16_t *)
SPI receive method.
Definition spi.h:55
SPI_TypeDef * interface
Pointer to SPI interface struct.
Definition spi.h:51