APPLICATION NOTE AT07335: SAM4 TWI Slave Mode Driver ASF PROGRAMMERS MANUAL SAM4 TWI Slave Mode Driver This driver provides access to the main features of the TWIS The TWIS 2 interconnects components on a unique two-wire bus in a manner similar to I C. The TWIS is programmable as a slave with sequential or single-byte access. High speed mode capability is also supported. This document does not provide any information regarding SMBus usage. ● Prerequisites ● Module Overview ● Examples ● API Overview ● Special Considerations ● Extra Information 42273A-MCU-05/2014 Table of Contents SAM4 TWI Slave Mode Driver ........................................................... 1 Software License ................................................................................ 4 1. Prerequisites ................................................................................. 5 2. Module Overview .......................................................................... 6 2.1. 2.2. Functional Description .................................................................. 6 TWI Bus Topology ...................................................................... 6 3. Special Considerations ................................................................. 7 4. Extra Information .......................................................................... 8 4.1. Terms and Definitions .................................................................. 8 5. Examples ...................................................................................... 9 6. API Overview .............................................................................. 10 6.1. 6.2. 6.3. 6.4. 6.5. Variable and Type Definitions ...................................................... 10 6.1.1. Type twis_callback_t ..................................................... 10 6.1.2. Type twis_error_callback_t ............................................. 10 6.1.3. Type twis_interrupt_source_t .......................................... 10 6.1.4. Type twis_rx_callback_t ................................................ 10 6.1.5. Type twis_stop_callback_t ............................................. 10 6.1.6. Type twis_tx_callback_t ................................................. 10 Structure Definitions ................................................................... 10 6.2.1. Struct twis_callback ....................................................... 10 6.2.2. Struct twis_config .......................................................... 11 6.2.3. Struct twis_dev_inst ....................................................... 11 Macro Definitions ...................................................................... 12 6.3.1. Macro TWIS_WAIT_TIMEOUT ....................................... 12 Function Definitions ................................................................... 12 6.4.1. Function twis_clear_status() ........................................... 12 6.4.2. Function twis_disable() .................................................. 12 6.4.3. Function twis_disable_interrupt() ..................................... 12 6.4.4. Function twis_enable() .................................................. 13 6.4.5. Function twis_enable_interrupt() ...................................... 13 6.4.6. Function twis_get_config_defaults() ................................. 13 6.4.7. Function twis_get_interrupt_mask() .................................. 14 6.4.8. Function twis_get_smbus_pec() ...................................... 14 6.4.9. Function twis_get_smbus_transfer_nb() ............................ 15 6.4.10. Function twis_get_status() ............................................. 15 6.4.11. Function twis_init() ....................................................... 15 6.4.12. Function twis_read() ..................................................... 16 6.4.13. Function twis_send_data_ack() ....................................... 16 6.4.14. Function twis_send_data_nack() ..................................... 17 6.4.15. Function twis_set_callback() ........................................... 17 6.4.16. Function twis_set_smbus_transfer_nb() ............................ 17 6.4.17. Function twis_write() ..................................................... 18 Enumeration Definitions .............................................................. 18 6.5.1. Enum twis_interrupt_source ........................................... 18 7. TWI Slave Example .................................................................... 20 7.1. 7.2. 7.3. 7.4. 7.5. Introduction .............................................................................. Requirements ........................................................................... Main Files ................................................................................ Description of the Example ......................................................... Compilation Info ........................................................................ AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 2 20 20 20 20 20 8. Quickstart guide for SAM TWIS driver ....................................... 21 8.1. 8.2. Basic Use Case ........................................................................ 8.1.1. Prerequisites ................................................................ Setup Steps ............................................................................. 8.2.1. Example Code .............................................................. 21 21 21 21 Index ................................................................................................. 22 Document Revision History .............................................................. 23 AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 3 Software License Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of Atmel may not be used to endorse or promote products derived from this software without specific prior written permission. 4. This software may only be redistributed and used in connection with an Atmel microcontroller product. THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 4 1. Prerequisites There are no prerequisites for this module. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 5 2. Module Overview The outline of this section is as follows: 2.1 ● Functional Description ● TWI Bus Topology Functional Description 2 Driver for the TWIS (Two-Wire aka I C Slave Interface). This driver provides access to the main features of the TWIS controller. The two wire interface connects components on a two-wire bus, each having a unique ID. The TWI modules is programmable as a slave with sequential or single-byte access. High speed mode capability is also supported. The TWI bus provides a simple, but efficient, method of interconnecting multiple master and slave devices. An arbitration mechanism is provided for resolving bus ownership between masters, as only one master device may own the bus at any given time. The arbitration mechanism relies on the wired-AND connections to avoid bus drivers short-circuiting. 2.2 TWI Bus Topology Figure 2-1: I2C Bus Topology on page 6. The pull-up resistors (Rs) will provide a high level on the bus lines when none of the TWI devices are driving the bus. These are optional, and can be replaced with a constant current source. Figure 2-1. I2C Bus Topology VCC RP RP I2C DEVICE #1 I2C DEVICE #2 I2C DEVICE #N RS RS RS RS RS RS SDA SCL Note: RS is optional AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 6 3. Special Considerations NONE. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 7 4. Extra Information 4.1 Terms and Definitions Term Definition Standard speed Original 100kHz clock Fast Mode plus 1MHz clock High spead mode 3.4MHz clock Ultra Fast mode 5MHz clock AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 8 5. Examples ● Quickstart guide for SAM TWIS driver ● TWI Slave Example AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 9 6. API Overview 6.1 Variable and Type Definitions 6.1.1 Type twis_callback_t typedef struct twis_callback twis_callback_t 6.1.2 Type twis_error_callback_t typedef void(* twis_error_callback_t )(void) 6.1.3 Type twis_interrupt_source_t typedef enum twis_interrupt_source twis_interrupt_source_t TWIS interrupt source type. 6.1.4 Type twis_rx_callback_t typedef void(* twis_rx_callback_t )(uint8_t) 6.1.5 Type twis_stop_callback_t typedef void(* twis_stop_callback_t )(void) 6.1.6 Type twis_tx_callback_t typedef uint8_t(* twis_tx_callback_t )(void) 6.2 Structure Definitions 6.2.1 Struct twis_callback Table 6-1. Members Type Name Description twis_error_callback_t error Routine to handle bus error twis_rx_callback_t rx Routine to receive data from TWI master AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 10 6.2.2 Type Name Description twis_stop_callback_t stop Routine to signal a TWI STOP twis_tx_callback_t tx Routine to transmit data to TWI master Type Name Description bool ack_general_call Acknowledge the general call address bool ack_slave_addr Acknowledge the specified slave address bool ack_smbus_default_addr Acknowledge the SMBus default address bool ack_smbus_host_header Acknowledge the SMBus host header uint32_t chip The desired address. bool enable_pec Enable packet error checking uint8_t exp Clock Prescaler uint8_t fs_dadrivel Data Drive Strength Low in F/S mode uint8_t fs_daslew Data Slew Limit in F/S mode uint8_t fs_filter Input Spike Filter Control in F/S mode uint8_t hddat Data Hold Cycles uint8_t hs_dadrivel Data Drive Strength Low in HS mode uint8_t hs_daslew Data Slew Limit in HS mode uint8_t hs_filter Input Spike Filter Control in HS mode bool smbus SMBUS mode bool stretch_clk_addr Stretch clock on address match bool stretch_clk_data Stretch clock on data byte reception bool stretch_clk_hr Stretch clock if RHR is full or THR is empty uint8_t sudat Data Setup Cycles bool ten_bit Ten-bit addressing uint8_t tlows SMBus Low:Sext Cycles uint8_t ttouts SMBus TIMEOUT Cycles Struct twis_config Table 6-2. Members 6.2.3 Struct twis_dev_inst AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 11 6.2.3.1 asfdoc_sam_twis_structure Device instance structure for a TWI Slave driver instance. This structure should be initialized by the twis_init() function to associate the instance with a particular hardware module of the device. Table 6-3. Members Type Name Description Twis * hw_dev Base address of the TWIS module. struct twis_config * twis_cfg Pointer to TWIS configuration structure. 6.3 Macro Definitions 6.3.1 Macro TWIS_WAIT_TIMEOUT #define TWIS_WAIT_TIMEOUT 6.4 Function Definitions 6.4.1 Function twis_clear_status() Clear the current status of the TWIS. void twis_clear_status( struct twis_dev_inst *const dev_inst, uint32_t clear_status) Table 6-4. Parameters 6.4.2 Data direction Parameter name Description [out] dev_inst Device structure pointer [in] clear_status The TWIS status to be clear Function twis_disable() Disable TWIS Module. void twis_disable( struct twis_dev_inst *const dev_inst) Table 6-5. Parameters 6.4.3 Data direction Parameter name Description [in] dev_inst Device structure pointer Function twis_disable_interrupt() Disable the TWIS interrupts. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 12 void twis_disable_interrupt( struct twis_dev_inst *const dev_inst, twis_interrupt_source_t interrupt_source) Table 6-6. Parameters 6.4.4 Data direction Parameter name Description [in] dev_inst Device structure pointer [in] interrupt_source The TWIS interrupt to be disabled Function twis_enable() Enable TWIS Module. void twis_enable( struct twis_dev_inst *const dev_inst) Table 6-7. Parameters 6.4.5 Data direction Parameter name Description [in] dev_inst Device structure pointer Function twis_enable_interrupt() Enable the TWIS interrupts. void twis_enable_interrupt( struct twis_dev_inst *const dev_inst, twis_interrupt_source_t interrupt_source) Table 6-8. Parameters 6.4.6 Data direction Parameter name Description [in] dev_inst Device structure pointer [in] interrupt_source The TWIS interrupt source to be enabled Function twis_get_config_defaults() Get the TWIS master default configurations. void twis_get_config_defaults( struct twis_config *const cfg) Use to initialize the configuration structure to known default values. This function should be called at the start of any TWIS initiation. The default configuration is as follows: ● 7-bit addressing ● Self address is 0x50 AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 13 ● Normal mode ● Do not stretch clock on data byte reception ● Do not stretch clock on address match ● Stretch clock if RHR is full or THR is empty ● Do not acknowledge the general call address ● Acknowledge the specified slave address ● Disable packet error checking ● Do not acknowledge the SMBus host header ● Do not acknowledge the SMBus default address ● 0 data setup cycles in F/S mode and high speed mode ● Zero-initialization for slew rate setting in F/S mode and high speed mode ● Clock Prescaler is 0 ● 0 SMBus TIMEOUT cycle ● 0 SMBus Low:Sext cycle Table 6-9. Parameters 6.4.7 Data direction Parameter name Description [out] cfg Pointer to configuration structure to be initiated Function twis_get_interrupt_mask() Get the TWIS interrupt mask. uint32_t twis_get_interrupt_mask( struct twis_dev_inst *const dev_inst) Table 6-10. Parameters Returns 6.4.8 Data direction Parameter name Description [in] dev_inst Device structure pointer TWIS interrupt mask. Function twis_get_smbus_pec() Get the calculated PEC value. Only for SMBus mode. uint8_t twis_get_smbus_pec( struct twis_dev_inst *const dev_inst) AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 14 Note Only for SMBus mode Table 6-11. Parameters Data direction Parameter name Description [in] dev_inst Device structure pointer Returns 6.4.9 Calculated PEC value Function twis_get_smbus_transfer_nb() Get the progress of the transfer in SMBus mode. uint8_t twis_get_smbus_transfer_nb( struct twis_dev_inst *const dev_inst) Note Only for SMBus mode Table 6-12. Parameters Data direction Parameter name Description [in] dev_inst Device structure pointer Returns 6.4.10 The left number of data bytes in the transmission. Function twis_get_status() Information about the current status of the TWIS. uint32_t twis_get_status( struct twis_dev_inst *const dev_inst) Table 6-13. Parameters Returns 6.4.11 Data direction Parameter name Description [in] dev_inst Device structure pointer TWI Status. Function twis_init() Initialize the TWI Slave Module. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 15 enum status_code twis_init( struct twis_dev_inst *const dev_inst, Twis *const twis, struct twis_config * config) Table 6-14. Parameters Data direction Parameter name Description [in] dev_inst Device structure pointer [in] twis Base address of the TWIS [in] config Configuration for the TWIS Returns Status of module initialization. Table 6-15. Return Values 6.4.12 Return value Description STATUS_OK The data is written correctly STATUS_ERR_DENIED Initialization failed due to the module was enable before. STATUS_ERR_BUSY Initialization failed due to the module is busy with transfer. Function twis_read() Get the last byte data received from TWI bus. enum status_code twis_read( struct twis_dev_inst *const dev_inst, uint8_t * data) Table 6-16. Parameters Returns Data direction Parameter name Description [in] dev_inst Device structure pointer [out] data The read data Status of write operation. Table 6-17. Return Values 6.4.13 Return value Description STATUS_OK The data is read correctly STATUS_ERR_TIMEOUT The read operation aborted due to timeout Function twis_send_data_ack() Enable ACK transfer in Slave Receiver Mode. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 16 void twis_send_data_ack( struct twis_dev_inst *const dev_inst) Table 6-18. Parameters 6.4.14 Data direction Parameter name Description [in] dev_inst Device structure pointer Function twis_send_data_nack() Enable NACK transfer in Slave Receiver Mode. void twis_send_data_nack( struct twis_dev_inst *const dev_inst) Table 6-19. Parameters 6.4.15 Data direction Parameter name Description [in] dev_inst Device structure pointer Function twis_set_callback() Set callback for TWIS. void twis_set_callback( struct twis_dev_inst *const dev_inst, twis_interrupt_source_t source, twis_callback_t callback, uint8_t irq_level) Note Slave address match interrupt is enabled by default so that TWIS ISR can work appropriately. Table 6-20. Parameters 6.4.16 Data direction Parameter name Description [in] dev_inst Device structure pointer [in] source Interrupt source [in] callback Callback function pointer [in] irq_level Interrupt level Function twis_set_smbus_transfer_nb() Set the total number of data bytes in the transmission. Only for SMBus mode. void twis_set_smbus_transfer_nb( struct twis_dev_inst *const dev_inst, uint8_t nb, bool increment) AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 17 Note Only for SMBus mode Table 6-21. Parameters 6.4.17 Data direction Parameter name Description [in] dev_inst Device structure pointer [in] nb Total number of data bytes in the transmission [in] increment Count up per byte transferred if true, otherwise count down. Function twis_write() Write one byte data to TWI bus. enum status_code twis_write( struct twis_dev_inst *const dev_inst, uint8_t byte) Table 6-22. Parameters Returns Data direction Parameter name Description [in] dev_inst Device structure pointer [in] byte The byte data to write Status of write operation. Table 6-23. Return Values Return value Description STATUS_OK The data is written correctly STATUS_ERR_TIMEOUT The write operation aborted due to timeout 6.5 Enumeration Definitions 6.5.1 Enum twis_interrupt_source TWIS interrupt source type. Table 6-24. Members Enum value Description TWIS_INTERRUPT_RX_BUFFER_READY TWIS_INTERRUPT_TX_BUFFER_READY TWIS_INTERRUPT_TRANS_COMP TWIS_INTERRUPT_UNDER_RUN TWIS_INTERRUPT_OVER_RUN TWIS_INTERRUPT_NAK_RECEIVED AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 18 Enum value Description TWIS_INTERRUPT_SMBUS_TIMEOUT TWIS_INTERRUPT_SMBUS_PEC_ERROR TWIS_INTERRUPT_BUS_ERROR TWIS_INTERRUPT_SLAVEADR_MATCH TWIS_INTERRUPT_GENCALL_MATCH TWIS_INTERRUPT_SMBUS_HHADR_MATCH TWIS_INTERRUPT_SMBUS_DEFADR_MATCH TWIS_INTERRUPT_STOP_RECEIVED TWIS_INTERRUPT_RESTART_RECEIVED TWIS_INTERRUPT_BYTE_TRANS_FINISHED TWIS_INTERRUPT_ERRORS TWIS_INTERRUPT_ALL AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 19 7. TWI Slave Example 7.1 Introduction The application demonstrates how to use use the SAM TWIS peripheral. 7.2 Requirements This package can be used with SAM4L boards. In addition, another device will be needed to act as the TWI master. The twim_example can be used for that, in which case a second kit supported by that project is needed. 7.3 7.4 1. Connect TWD (SDA) for the two boards. 2. Connect TWCK (SCL) for the two boards. 3. Connect GND for the two boards. 4. Add a pull up resistor on TWD and TWCK. Main Files ● twis.c SAM Two-Wire Slave Interface driver implementation ● twis.h SAM Two-Wire Slave Interface driver definitions ● twi_slave_example.c Example application Description of the Example After launching the program, the device will act as a simple TWI-enabled serial memory containing 50 bytes. This enables this project to be used with the twim_example project as the master. To write in the memory, the TWI master must address the device first, then send two bytes containing the memory address to access. Additional bytes are treated as the data to write. Reading is done in the same fashion, except that after receiving the memory address, the device will start outputting data until a STOP condition is sent by the master. The default address for the TWI slave is fixed to 0x50. If the board has a TWI component with this address, you can change the define TARGET_ADDRESS in conf_example.h of twim_example project, and then define SLAVE_ADDRESS in twi_slave_example.c of twi_slave_example project. 7.5 Compilation Info This software was written for the GNU GCC and IAR(™) EWARM. Other compilers may or may not work. AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 20 8. Quickstart guide for SAM TWIS driver This is the quickstart guide for the SAM TWIS driver with step-by-step instructions on how to configure and use the driver in a selection of use cases. The use cases contain several code fragments. The code fragments in the steps for setup can be copied into a custom initialization function, while the steps for usage can be copied into, e.g., the main application function. 8.1 Basic Use Case The basic use case demonstrate how to initialize the TWIS module and configure it. 8.1.1 Prerequisites ● System Clock Management (Sysclock). 8.2 Setup Steps 8.2.1 Example Code Place the following at the start of your main function. twis_callback_t slave_callbacks; /* Initialize the SAM system */ sysclk_init(); /* Initialize the board */ board_init(); /* Initialize the console UART */ configure_console(); Then set the device as a TWI slave. struct twis_config config; twis_get_config_defaults(&config); config.chip = SLAVE_ADDRESS; Now initialise the TWI subsystem: if (twis_init(&twis_device, BOARD_BASE_TWI_SLAVE, &config) == STATUS_OK) { Set up the callback functions to handle reception, transmission, STOP condition and errors. In the end, enable the slave address match interrupt: /* Set pointer to user specific application routines */ slave_callbacks.rx = &twis_slave_rx; slave_callbacks.tx = &twis_slave_tx; slave_callbacks.stop = &twis_slave_stop; slave_callbacks.error = &twis_slave_error; twis_set_callback(&twis_device, TWIS_INTERRUPT_SLAVEADR_MATCH, slave_callbacks, 1); /* Enable the TWIS module */ twis_enable(&twis_device); AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 21 Index E Enumeration Definitions twis_interrupt_source, 18 F Function Definitions twis_clear_status, 12 twis_disable, 12 twis_disable_interrupt, 12 twis_enable, 13 twis_enable_interrupt, 13 twis_get_config_defaults, 13 twis_get_interrupt_mask, 14 twis_get_smbus_pec, 14 twis_get_smbus_transfer_nb, 15 twis_get_status, 15 twis_init, 15 twis_read, 16 twis_send_data_ack, 16 twis_send_data_nack, 17 twis_set_callback, 17 twis_set_smbus_transfer_nb, 17 twis_write, 18 M Macro Definitions TWIS_WAIT_TIMEOUT, 12 S Structure Definitions twis_callback, 10 twis_config, 11 twis_dev_inst, 11 T Type Definitions twis_callback_t, 10 twis_error_callback_t, 10 twis_interrupt_source_t, 10 twis_rx_callback_t, 10 twis_stop_callback_t, 10 twis_tx_callback_t, 10 AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 22 Document Revision History Doc. Rev. Date Comments 42273A 05/2014 Initial document release AT07335: SAM4 TWI Slave Mode Driver [APPLICATION NOTE] 42273A-MCU-05/2014 23 Atmel Corporation 1600 Technology Drive, San Jose, CA 95110 USA T: (+1)(408) 441.0311 F: (+1)(408) 436.4200 | www.atmel.com © 2014 Atmel Corporation. All rights reserved. / Rev.: 42273A-MCU-05/2014 ® ® Atmel , Atmel logo and combinations thereof, Enabling Unlimited Possibilities , and others are registered trademarks or trademarks of Atmel Corporation or its subsidiaries. Other terms and product names may be trademarks of others. Disclaimer: The information in this document is provided in connection with Atmel products. No license, express or implied, by estoppel or otherwise, to any intellectual property right is granted by this document or in connection with the sale of Atmel products. EXCEPT AS SET FORTH IN THE ATMEL TERMS AND CONDITIONS OF SALES LOCATED ON THE ATMEL WEBSITE, ATMEL ASSUMES NO LIABILITY WHATSOEVER AND DISCLAIMS ANY EXPRESS, IMPLIED OR STATUTORY WARRANTY RELATING TO ITS PRODUCTS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE, SPECIAL OR INCIDENTAL DAMAGES (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS AND PROFITS, BUSINESS INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF THE USE OR INABILITY TO USE THIS DOCUMENT, EVEN IF ATMEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Atmel makes no representations or warranties with respect to the accuracy or completeness of the contents of this document and reserves the right to make changes to specifications and products descriptions at any time without notice. Atmel does not make any commitment to update the information contained herein. Unless specifically provided otherwise, Atmel products are not suitable for, and shall not be used in, automotive applications. Atmel products are not intended, authorized, or warranted for use as components in applications intended to support or sustain life.