From 27da40679354e323e8d7c6910da6722235ad0317 Mon Sep 17 00:00:00 2001 From: liangkangnan Date: Tue, 5 May 2020 18:32:46 +0800 Subject: [PATCH] add spi driver Signed-off-by: liangkangnan --- tests/example/include/spi.h | 18 +++++++++++++ tests/example/lib/spi.c | 51 +++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 tests/example/include/spi.h create mode 100644 tests/example/lib/spi.c diff --git a/tests/example/include/spi.h b/tests/example/include/spi.h new file mode 100644 index 0000000..2a75ff9 --- /dev/null +++ b/tests/example/include/spi.h @@ -0,0 +1,18 @@ +#ifndef _SPI_H_ +#define _SPI_H_ + +#define SPI_BASE (0x50000000) +#define SPI_CTRL (SPI_BASE + (0x00)) +#define SPI_DATA (SPI_BASE + (0x04)) +#define SPI_STATUS (SPI_BASE + (0x08)) + +#define SPI_REG(addr) (*((volatile uint32_t *)addr)) + +void spi_init(); +void spi_set_ss(uint8_t level); +void spi_write_byte(uint8_t data); +void spi_write_bytes(uint8_t data[], uint32_t len); +uint8_t spi_read_byte(); +void spi_read_bytes(uint8_t data[], uint32_t len); + +#endif diff --git a/tests/example/lib/spi.c b/tests/example/lib/spi.c new file mode 100644 index 0000000..1ff4a21 --- /dev/null +++ b/tests/example/lib/spi.c @@ -0,0 +1,51 @@ +#include + +#include "../include/spi.h" + + +void spi_init() +{ + SPI_REG(SPI_CTRL) = 0x06; // CPOL = 1, CPHA = 1 +} + +void spi_set_ss(uint8_t level) +{ + if (!level) + SPI_REG(SPI_CTRL) |= 1 << 3; + else + SPI_REG(SPI_CTRL) &= ~(1 << 3); +} + +void spi_write_byte(uint8_t data) +{ + SPI_REG(SPI_DATA) = data; + SPI_REG(SPI_CTRL) |= 1 << 0; // start + while (SPI_REG(SPI_STATUS) & 0x1); // wait transfer complete +} + +void spi_write_bytes(uint8_t data[], uint32_t len) +{ + uint32_t i; + + for (i = 0; i < len; i++) + spi_write_byte(data[i]); +} + +uint8_t spi_read_byte() +{ + uint8_t data; + + SPI_REG(SPI_CTRL) |= 1 << 0; // start + while (SPI_REG(SPI_STATUS) & 0x1); // wait transfer complete + data = SPI_REG(SPI_DATA) & 0xff; // readback data + + return data; +} + +void spi_read_bytes(uint8_t data[], uint32_t len) +{ + uint32_t i; + + for (i = 0; i < len; i++) + data[i] = spi_read_byte(); +}