3      Copyright (C) Dean Camera, 2010. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this  
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in  
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting  
  17   documentation, and that the name of the author not be used in  
  18   advertising or publicity pertaining to distribution of the  
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  32  *  \brief TWI peripheral driver for the U7, U6 and U4 USB AVRs. 
  34  *  Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. 
  36  *  \note This file should not be included directly. It is automatically included as needed by the TWI driver 
  37  *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. 
  40 /** \ingroup Group_TWI 
  41  *  @defgroup Group_TWI_AVRU4U6U7 Series U4, U6 and U7 Model TWI Driver 
  43  *  Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. 
  45  *  \note This file should not be included directly. It is automatically included as needed by the TWI driver 
  46  *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. 
  51 #ifndef __TWI_AVRU4U6U7_H__ 
  52 #define __TWI_AVRU4U6U7_H__ 
  55                 #include "../../../Common/Common.h" 
  60                 #include <util/delay.h> 
  62         /* Enable C linkage for C++ Compilers: */ 
  63                 #if defined(__cplusplus) 
  67         /* Preprocessor Checks: */ 
  68                 #if !defined(__INCLUDE_FROM_TWI_H) 
  69                         #error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. 
  72         /* Public Interface - May be used in end-application: */ 
  73                 /* Inline Functions: */ 
  74                         /** Initialises the TWI hardware into master mode, ready for data transmission and reception. This must be 
  75                          *  before any other TWI operations. 
  77                         static inline void TWI_Init(void) ATTR_ALWAYS_INLINE
; 
  78                         static inline void TWI_Init(void) 
  83                         /** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to 
  84                          *  \ref TWI_Init() before the TWI can be used again. 
  86                         static inline void TWI_ShutDown(void) ATTR_ALWAYS_INLINE
; 
  87                         static inline void TWI_ShutDown(void) 
  92                         /** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. */ 
  93                         static inline void TWI_StopTransmission(void) ATTR_ALWAYS_INLINE
; 
  94                         static inline void TWI_StopTransmission(void) 
  96                                 TWCR 
= ((1 << TWINT
) | (1 << TWSTO
) | (1 << TWEN
)); 
  99                         /** Sends a byte to the currently addressed device on the TWI bus. 
 101                          *  \param[in] Byte  Byte to send to the currently addressed device 
 103                          *  \return Boolean true if the recipient ACKed the byte, false otherwise 
 105                         static inline bool TWI_SendByte(const uint8_t Byte
) 
 108                                 TWCR 
= ((1 << TWINT
) | (1 << TWEN
));     
 109                                 while (!(TWCR 
& (1 << TWINT
))); 
 111                                 return ((TWSR 
& TW_STATUS_MASK
) == TW_MT_DATA_ACK
); 
 114                         /** Receives a byte from the currently addressed device on the TWI bus. 
 116                          *  \param[in] Byte      Location where the read byte is to be stored 
 117                          *  \param[in] LastByte  Indicates if the byte should be ACKed if false, NAKed if true 
 119                          *  \return Boolean true if the byte reception successfully completed, false otherwise 
 121                         static inline bool TWI_ReceiveByte(uint8_t* const Byte
, 
 124                                 uint8_t TWCRMask 
= ((1 << TWINT
) | (1 << TWEN
)); 
 127                                   TWCRMask 
|= (1 << TWEA
); 
 130                                 while (!(TWCR 
& (1 << TWINT
))); 
 133                                 return ((TWSR 
& TW_STATUS_MASK
) == TW_MR_DATA_ACK
); 
 136                 /* Function Prototypes: */ 
 137                         /** Begins a master mode TWI bus communication with the given slave device address. 
 139                          *  \param[in] SlaveAddress  Address of the slave TWI device to communicate with 
 140                          *  \param[in] TimeoutMS     Timeout period within which the slave must respond, in milliseconds 
 142                          *  \return Boolean true if the device is ready for data, false otherwise 
 144                         bool TWI_StartTransmission(const uint8_t SlaveAddress
, 
 145                                                    const uint8_t TimeoutMS
); 
 147         /* Disable C linkage for C++ Compilers: */ 
 148                 #if defined(__cplusplus)