aboutsummaryrefslogtreecommitdiff
path: root/spi_usi.h
blob: 900999fc66c06f24ad70aa6abbb1582652ecfe79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

#include "mcu/mcu.h"

#ifndef _IOE_SPI_USI_H_
#define _IOE_SPI_USI_H_

/*
 * Initialize USI as SPI
 *
 * NOTE: Global interrupt must be enabled for right function.
 * { SREG |= _BV(7) }
 */
inline void ioe_spi_usi_init(void);
#ifdef IOE_SPI_USI_MASTER
/*
 * Swaps byte with slave over SPI.
 */
inline int8_t ioe_spi_usi_transfer(int8_t data);
#else
/*
 * Expose data for next master request.
 * Please don't use this when device is busy.
 * Best place to call this is ioe_spi_usi_retrieve().
 */
inline void ioe_spi_usi_expose(int8_t data);
/*
 * Returns NULL when device is no busy.
 * When device is busy, returned value is number of already send bits.
 */
inline uint8_t ioe_spi_usi_busy(void);
/*
 * Blocks processor until device is not busy.
 */
inline void ioe_spi_usi_join(void);

/*
 * This function must be defined by user.
 * This function is called every time transfer is finished.
 * And until return from this function interrupts are disabled.
 * WARNING: Please define this function in your code.
 */
inline void ioe_spi_usi_retrieve(int8_t data);
#endif /* IOE_SPI_USI_MASTER */

#if !(__MCU_ATtiny4313__ || __MCU_ATtiny85__)
#error "USI is not probably supported by your MCU."
#endif

#endif /* _IOE_SPI_USI_H_ */