Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / autonomous_recharging / archs / USI_TWI_Slave.h @ 80

History | View | Annotate | Download (6.16 KB)

1
// This file has been prepared for Doxygen automatic documentation generation.
2
/*! \file ********************************************************************
3
*
4
* Atmel Corporation
5
*
6
* File              : USI_TWI_Slave.h
7
* Compiler          : IAR EWAAVR 4.11A
8
* Revision          : $Revision: 1.14 $
9
* Date              : $Date: Friday, December 09, 2005 17:25:38 UTC $
10
* Updated by        : $Author: jtyssoe $
11
*
12
* Support mail      : avr@atmel.com
13
*
14
* Supported devices : All device with USI module can be used.
15
*                     The example is written for the ATmega169, ATtiny26 & ATtiny2313
16
*
17
* AppNote           : AVR312 - Using the USI module as a TWI slave
18
*
19
* Description       : Header file for USI_TWI driver
20
*
21
*
22
*
23
****************************************************************************/
24

    
25

    
26

    
27
//! Prototypes
28
void          USI_TWI_Slave_Initialise( unsigned char );
29
void          USI_TWI_Transmit_Byte( unsigned char );
30
unsigned char USI_TWI_Receive_Byte( void );
31
unsigned char USI_TWI_Data_In_Receive_Buffer( void );
32
void          Timer_Init(void);
33

    
34
#define TRUE                1
35
#define FALSE               0
36

    
37
typedef     unsigned char       uint8_t;
38

    
39
//////////////////////////////////////////////////////////////////
40
///////////////// Driver Buffer Definitions //////////////////////
41
//////////////////////////////////////////////////////////////////
42
// 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes
43

    
44
#define TWI_RX_BUFFER_SIZE  (16)
45
#define TWI_RX_BUFFER_MASK ( TWI_RX_BUFFER_SIZE - 1 )
46

    
47
#if ( TWI_RX_BUFFER_SIZE & TWI_RX_BUFFER_MASK )
48
        #error TWI RX buffer size is not a power of 2
49
#endif
50

    
51
// 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes
52

    
53
#define TWI_TX_BUFFER_SIZE  (16)
54
#define TWI_TX_BUFFER_MASK ( TWI_TX_BUFFER_SIZE - 1 )
55

    
56
#if ( TWI_TX_BUFFER_SIZE & TWI_TX_BUFFER_MASK )
57
        #error TWI TX buffer size is not a power of 2
58
#endif
59

    
60

    
61

    
62
#define USI_SLAVE_CHECK_ADDRESS                (0x00)
63
#define USI_SLAVE_SEND_DATA                    (0x01)
64
#define USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA (0x02)
65
#define USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA   (0x03)
66
#define USI_SLAVE_REQUEST_DATA                 (0x04)
67
#define USI_SLAVE_GET_DATA_AND_SEND_ACK        (0x05)
68

    
69
#define DDR_USI             DDRB
70
#define PORT_USI            PORTB
71
#define PIN_USI             PINB
72
#define PORT_USI_SDA        PORTB0
73
#define PORT_USI_SCL        PORTB2
74
#define PIN_USI_SDA         PINB0
75
#define PIN_USI_SCL         PINB2
76
#define USI_START_COND_INT  USISIF
77
#define USI_START_VECTOR    USI_START_vect
78
#define USI_OVERFLOW_VECTOR USI_OVF_vect
79

    
80

    
81
//! Functions implemented as macros
82
#define SET_USI_TO_SEND_ACK()                                                                                 \
83
{                                                                                                             \
84
        USIDR    =  0;                                              /* Prepare ACK                         */ \
85
        DDR_USI |=  (1<<PORT_USI_SDA);                              /* Set SDA as output                   */ \
86
        USISR    =  (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|  /* Clear all flags, except Start Cond  */ \
87
                    (0x0E<<USICNT0);                                /* set USI counter to shift 1 bit. */ \
88
}
89

    
90
#define SET_USI_TO_READ_ACK()                                                                                 \
91
{                                                                                                             \
92
        DDR_USI &=  ~(1<<PORT_USI_SDA);                             /* Set SDA as intput */                   \
93
        USIDR    =  0;                                              /* Prepare ACK        */                  \
94
        USISR    =  (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|  /* Clear all flags, except Start Cond  */ \
95
                    (0x0E<<USICNT0);                                /* set USI counter to shift 1 bit. */ \
96
}
97

    
98
#define SET_USI_TO_TWI_START_CONDITION_MODE()                                                                                     \
99
{                                                                                                                                 \
100
  USICR    =  (1<<USISIE)|(0<<USIOIE)|                        /* Enable Start Condition Interrupt. Disable Overflow Interrupt.*/  \
101
              (1<<USIWM1)|(0<<USIWM0)|                        /* Set USI in Two-wire mode. No USI Counter overflow hold.      */  \
102
              (1<<USICS1)|(0<<USICS0)|(0<<USICLK)|            /* Shift Register Clock Source = External, positive edge        */  \
103
              (0<<USITC);                                                                                                         \
104
  USISR    =  (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|  /* Clear all flags, except Start Cond                            */ \
105
              (0x0<<USICNT0);                                                                                                     \
106
}
107

    
108
#define SET_USI_TO_SEND_DATA()                                                                               \
109
{                                                                                                            \
110
    DDR_USI |=  (1<<PORT_USI_SDA);                                  /* Set SDA as output                  */ \
111
    USISR    =  (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      /* Clear all flags, except Start Cond */ \
112
                (0x0<<USICNT0);                                     /* set USI to shift out 8 bits        */ \
113
}
114

    
115
#define SET_USI_TO_READ_DATA()                                                                               \
116
{                                                                                                            \
117
    DDR_USI &= ~(1<<PORT_USI_SDA);                                  /* Set SDA as input                   */ \
118
    USISR    =  (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      /* Clear all flags, except Start Cond */ \
119
                (0x0<<USICNT0);                                     /* set USI to shift out 8 bits        */ \
120
}