diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/avr25/spi_usi.c | 56 | 
1 files changed, 56 insertions, 0 deletions
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 */  | 
