From a5bb06281011f4f0edd6f7b9331f149bd256d495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 22 Mar 2015 14:05:00 +0100 Subject: SPI moved from src subfolder and mode changes SPI USI should now work. SPI USI is now documented. Removing architecture specific folders in src. --- src/spi_usi.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/spi_usi.c (limited to 'src/spi_usi.c') diff --git a/src/spi_usi.c b/src/spi_usi.c new file mode 100644 index 0000000..7bdb5c2 --- /dev/null +++ b/src/spi_usi.c @@ -0,0 +1,54 @@ +#include "../spi_usi.h" +#include "../mcu/mcu.h" + +#ifdef IOE_SPI_USI_MASTER + +// TODO counter settings with interups +inline void ioe_spi_usi_init(void) { + // Set USCK and DO as output + DDR_USI |= _BV(DD_USCK) | _BV(DD_DO); + // Set DI pull up resistor + PORT_USI |= _BV(PORT_DI); + + USICR |= _BV(USIWM0) | _BV(USICS1) | _BV(USICLK); +} + +inline int8_t ioe_spi_usi_transfer(int8_t d) { + USISR |= _BV(USIOIF); + USIDR = d; + do { + USICR |= _BV(USITC); + } while (!(USISR & _BV(USIOIF))); + return USIDR; +} + +#else /* IOE_SPI_USI_MASTER */ + +inline void ioe_spi_usi_init(void) { + // Set DO as output + DDR_USI |= _BV(DD_DO); + // Set USCK and DI pull up resistor + PORT_USI |= _BV(PORT_USCK) | _BV(PORT_DI); + + USICR |= _BV(USIWM0) | _BV(USICS1) | _BV(USIOIE); +} + +inline void ioe_spi_usi_expose(int8_t data) { + USIDR = data; +} + +inline uint8_t ioe_spi_usi_busy(void) { + return USISR & 0x0F; +} + +inline void ioe_spi_usi_join(void) { + while (ioe_spi_usi_busy()) { + } +} + +SIGNAL(USI_OVF_vect) { + ioe_spi_usi_retrieve(USIDR); + USISR |= _BV(USIOIF); +} + +#endif /* IOE_SPI_USI_MASTER */ -- cgit v1.2.3