From 8a115123eee5b9e294ff86ec4e41e6112dc47774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sat, 14 Mar 2015 11:36:26 +0100 Subject: SPI USI implementation !NOT TESTED! SPI on USI implemented. But not tested yet. --- spi_usi.h | 25 ++++++++++++++++++++++++ src/avr25/spi_usi.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 spi_usi.h create mode 100644 src/avr25/spi_usi.c diff --git a/spi_usi.h b/spi_usi.h new file mode 100644 index 0000000..2e603ac --- /dev/null +++ b/spi_usi.h @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +#include "mcu/mcu.h" + +#ifndef _IOE_SPI_USI_H_ +#define _IOE_SPI_USI_H_ + +inline void ioe_spi_usi_init(void); +#ifdef IOE_SPI_USI_MASTER +inline int8_t ioe_spi_usi_transfer(int8_t data); +#else +inline void ioe_spi_usi_expose(int8_t data); +inline void ioe_spi_usi_expect(void); +inline int ioe_spi_usi_ready(void); +inline void ioe_spi_usi_join(void); + +// Following function must be user defined +inline void ioe_spi_usi_retrieve(int8_t data); +#endif /* IOE_SPI_USI_MASTER */ + + +#endif /* _IOE_SPI_USI_H_ */ diff --git a/src/avr25/spi_usi.c b/src/avr25/spi_usi.c new file mode 100644 index 0000000..e63721a --- /dev/null +++ b/src/avr25/spi_usi.c @@ -0,0 +1,56 @@ +#include "../../spi_usi.h" + +#if __AVR_ARCH__ == 25 + +#ifdef IOE_SPI_USI_MASTER + +// TODO counter settings with interups +inline void ioe_spi_usi_init(void) { + USI_DIR_REG |= _BV(USI_USCK_PIN) | _BV(USI_DO_PIN); + USI_OUT_REG |= _BV(USI_DI_PIN); + + 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) { + USI_DIR_REG |= _BV(USI_DO_PIN); + USI_OUT_REG |= _BV(USI_USCK_PIN) | _BV(USI_DI_PIN); + + USICR |= _BV(USIWM0) | _BV(USICS1) | _BV(USIOIE); +} + +inline void ioe_spi_usi_expose(int8_t data) { + USIDR = data; +} + +inline void ioe_spi_usi_expect(void) { + USISR |= _BV(USIOIF); +} + +inline int 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); +} + +#endif /* IOE_SPI_USI_MASTER */ + +#endif /* __AVR_ARCH__ == 25 */ -- cgit v1.2.3