summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/arch/arduino-nano/driver/spi.h18
-rw-r--r--src/arch/arduino-nano-168/Makefile.inc4
-rw-r--r--src/arch/arduino-nano/Makefile.inc4
-rw-r--r--src/arch/arduino-nano/arch.cc8
-rw-r--r--src/arch/arduino-nano/driver/spi.cc41
5 files changed, 73 insertions, 2 deletions
diff --git a/include/arch/arduino-nano/driver/spi.h b/include/arch/arduino-nano/driver/spi.h
new file mode 100644
index 0000000..8c593ee
--- /dev/null
+++ b/include/arch/arduino-nano/driver/spi.h
@@ -0,0 +1,18 @@
+#ifndef SPI_H
+#define SPI_H
+
+class SPI {
+ private:
+ SPI(const SPI &copy);
+
+ public:
+ SPI () {}
+ signed char setup();
+ signed char xmit(
+ unsigned char tx_len, unsigned char *tx_buf,
+ unsigned char rx_len, unsigned char *rx_buf);
+};
+
+extern SPI spi;
+
+#endif
diff --git a/src/arch/arduino-nano-168/Makefile.inc b/src/arch/arduino-nano-168/Makefile.inc
index 3b72c4d..f57914e 100644
--- a/src/arch/arduino-nano-168/Makefile.inc
+++ b/src/arch/arduino-nano-168/Makefile.inc
@@ -37,6 +37,10 @@ else ifneq ($(findstring i2c,${arch_drivers}), )
CXX_TARGETS += src/arch/arduino-nano/driver/i2c.cc
endif
+ifneq ($(findstring spi,${arch_drivers}), )
+ CXX_TARGETS += src/arch/arduino-nano/driver/spi.cc
+endif
+
ifneq ($(findstring stdin,${arch_drivers}), )
CXX_TARGETS += src/arch/arduino-nano/driver/stdin.cc
endif
diff --git a/src/arch/arduino-nano/Makefile.inc b/src/arch/arduino-nano/Makefile.inc
index 9e149ac..ebc77ea 100644
--- a/src/arch/arduino-nano/Makefile.inc
+++ b/src/arch/arduino-nano/Makefile.inc
@@ -37,6 +37,10 @@ else ifneq ($(findstring i2c,${arch_drivers}), )
CXX_TARGETS += src/arch/arduino-nano/driver/i2c.cc
endif
+ifneq ($(findstring spi,${arch_drivers}), )
+ CXX_TARGETS += src/arch/arduino-nano/driver/spi.cc
+endif
+
ifneq ($(findstring stdin,${arch_drivers}), )
CXX_TARGETS += src/arch/arduino-nano/driver/stdin.cc
endif
diff --git a/src/arch/arduino-nano/arch.cc b/src/arch/arduino-nano/arch.cc
index 221ef5b..1023927 100644
--- a/src/arch/arduino-nano/arch.cc
+++ b/src/arch/arduino-nano/arch.cc
@@ -105,12 +105,16 @@ void Arch::idle(void)
void Arch::delay_us(unsigned int const us)
{
- _delay_us(us);
+ for (unsigned int i = 0; i < us; i++) {
+ _delay_us(1);
+ }
}
void Arch::delay_ms(unsigned int const ms)
{
- _delay_ms(ms);
+ for (unsigned int i = 0; i < ms; i++) {
+ _delay_ms(1);
+ }
}
Arch arch;
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 <avr/io.h>
+
+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;