From 0f422f5332f8868aee277cc621e2f1633506b1c3 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 20 Dec 2019 12:58:04 +0100 Subject: add untested Arduino Nano SPI driver --- src/arch/arduino-nano/driver/spi.cc | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/arch/arduino-nano/driver/spi.cc (limited to 'src/arch/arduino-nano/driver') diff --git a/src/arch/arduino-nano/driver/spi.cc b/src/arch/arduino-nano/driver/spi.cc new file mode 100644 index 0000000..86aa311 --- /dev/null +++ b/src/arch/arduino-nano/driver/spi.cc @@ -0,0 +1,41 @@ +#include "driver/spi.h" +#include "driver/gpio.h" +#include "arch.h" +#include + +signed char SPI::setup() +{ + // configure SS as output to avoid unintened switches to slave mode + gpio.output(GPIO::pb2, 0); + // up to 1 MHz SPI clock +#if F_CPU == 16000000UL + SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); +#elif F_CPU == 8000000UL + SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); +#else + SPCR = _BV(SPE) | _BV(MSTR); +#endif +} + +signed char SPI::xmit( + unsigned char tx_len, unsigned char *tx_buf, + unsigned char rx_len, unsigned char *rx_buf) +{ + unsigned char i; + + while ((i < tx_len) || (i < rx_len)) { + if (i < tx_len) { + SPDR = tx_buf[i]; + } else { + SPDR = 0; + } + while (!(SPSR & _BV(SPIF))) ; + if (i < rx_len) { + rx_buf[i] = SPDR; + } + i++; + } + return 0; +} + +SPI spi; -- cgit v1.2.3