// This file has been prepared for Doxygen automatic documentation generation. /*! \file ******************************************************************** * * Atmel Corporation * * File : USI_TWI_Slave.h * Compiler : IAR EWAAVR 4.11A * Revision : $Revision: 1.14 $ * Date : $Date: Friday, December 09, 2005 17:25:38 UTC $ * Updated by : $Author: jtyssoe $ * * Support mail : avr@atmel.com * * Supported devices : All device with USI module can be used. * The example is written for the ATmega169, ATtiny26 & ATtiny2313 * * AppNote : AVR312 - Using the USI module as a TWI slave * * Description : Header file for USI_TWI driver * * * ****************************************************************************/ //! Prototypes void USI_TWI_Slave_Initialise( unsigned char ); void USI_TWI_Transmit_Byte( unsigned char ); unsigned char USI_TWI_Receive_Byte( void ); unsigned char USI_TWI_Data_In_Receive_Buffer( void ); void Timer_Init(void); #define TRUE 1 #define FALSE 0 typedef unsigned char uint8_t; ////////////////////////////////////////////////////////////////// ///////////////// Driver Buffer Definitions ////////////////////// ////////////////////////////////////////////////////////////////// // 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes #define TWI_RX_BUFFER_SIZE (16) #define TWI_RX_BUFFER_MASK ( TWI_RX_BUFFER_SIZE - 1 ) #if ( TWI_RX_BUFFER_SIZE & TWI_RX_BUFFER_MASK ) #error TWI RX buffer size is not a power of 2 #endif // 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes #define TWI_TX_BUFFER_SIZE (16) #define TWI_TX_BUFFER_MASK ( TWI_TX_BUFFER_SIZE - 1 ) #if ( TWI_TX_BUFFER_SIZE & TWI_TX_BUFFER_MASK ) #error TWI TX buffer size is not a power of 2 #endif #define USI_SLAVE_CHECK_ADDRESS (0x00) #define USI_SLAVE_SEND_DATA (0x01) #define USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA (0x02) #define USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA (0x03) #define USI_SLAVE_REQUEST_DATA (0x04) #define USI_SLAVE_GET_DATA_AND_SEND_ACK (0x05) //! Device dependent defines #if defined(__AT90tiny26__) | defined(__ATtiny26__) #define DDR_USI DDRB #define PORT_USI PORTB #define PIN_USI PINB #define PORT_USI_SDA PORTB0 #define PORT_USI_SCL PORTB2 #define PIN_USI_SDA PINB0 #define PIN_USI_SCL PINB2 #define USI_START_COND_INT USISIF #define USI_START_VECTOR USI_STRT_vect #define USI_OVERFLOW_VECTOR USI_OVF_vect #endif #if defined(__AT90Tiny2313__) | defined(__ATtiny2313__) #define DDR_USI DDRB #define PORT_USI PORTB #define PIN_USI PINB #define PORT_USI_SDA PORTB5 #define PORT_USI_SCL PORTB7 #define PIN_USI_SDA PINB5 #define PIN_USI_SCL PINB7 #define USI_START_COND_INT USISIF #define USI_START_VECTOR USI_STRT_vect #define USI_OVERFLOW_VECTOR USI_OVF_vect #endif #if defined(__ATtiny25__) | defined(__ATtiny45__) | defined(__ATtiny85__) #define DDR_USI DDRB #define PORT_USI PORTB #define PIN_USI PINB #define PORT_USI_SDA PORTB0 #define PORT_USI_SCL PORTB2 #define PIN_USI_SDA PINB0 #define PIN_USI_SCL PINB2 #define USI_START_COND_INT USICIF #define USI_START_VECTOR USI_START_vect #define USI_OVERFLOW_VECTOR USI_OVF_vect #endif #if defined(__AT90Mega165__) | defined(__ATmega165__) | \ defined(__ATmega325__) | defined(__ATmega3250__) | \ defined(__ATmega645__) | defined(__ATmega6450__) | \ defined(__ATmega329__) | defined(__ATmega3290__) | \ defined(__ATmega649__) | defined(__ATmega6490__) #define DDR_USI DDRE #define PORT_USI PORTE #define PIN_USI PINE #define PORT_USI_SDA PORTE5 #define PORT_USI_SCL PORTE4 #define PIN_USI_SDA PINE5 #define PIN_USI_SCL PINE4 #define USI_START_COND_INT USISIF #define USI_START_VECTOR USI_START_vect #define USI_OVERFLOW_VECTOR USI_OVERFLOW_vect #endif #if defined(__AT90Mega169__) | defined(__ATmega169__) #define DDR_USI DDRE #define PORT_USI PORTE #define PIN_USI PINE #define PORT_USI_SDA PORTE5 #define PORT_USI_SCL PORTE4 #define PIN_USI_SDA PINE5 #define PIN_USI_SCL PINE4 #define USI_START_COND_INT USISIF #define USI_START_VECTOR USI_STRT_vect #define USI_OVERFLOW_VECTOR USI_OVF_vect #endif //! Functions implemented as macros #define SET_USI_TO_SEND_ACK() \ { \ USIDR = 0; /* Prepare ACK */ \ DDR_USI |= (1<