|  | /* ---------------------------------------------------------------------------- */ | 
|  | /*	    ATMEL Microcontroller Software Support  -  ROUSSET	-		*/ | 
|  | /* ---------------------------------------------------------------------------- */ | 
|  | /*  The software is delivered "AS IS" without warranty or condition of any	*/ | 
|  | /*  kind, either express, implied or statutory. This includes without		*/ | 
|  | /*  limitation any warranty or condition with respect to merchantability or	*/ | 
|  | /*  fitness for any particular purpose, or against the infringements of		*/ | 
|  | /*  intellectual property rights of others.					*/ | 
|  | /* ---------------------------------------------------------------------------- */ | 
|  | /* File Name	       : at91rm9200_i2c.h					*/ | 
|  | /* Object	       : AT91RM9200 / TWI definitions				*/ | 
|  | /* Generated	       : AT91 SW Application Group  12/03/2002 (10:48:02)	*/ | 
|  | /*										*/ | 
|  | /* ---------------------------------------------------------------------------- */ | 
|  |  | 
|  | #ifndef AT91RM9200_TWI_H | 
|  | #define AT91RM9200_TWI_H | 
|  |  | 
|  | /* ******************************************************************************/ | 
|  | /*		SOFTWARE API DEFINITION	 FOR Two-wire Interface			*/ | 
|  | /* ******************************************************************************/ | 
|  | #ifndef __ASSEMBLY__ | 
|  |  | 
|  | typedef struct _AT91S_TWI { | 
|  | AT91_REG	 TWI_CR;	/* Control Register			*/ | 
|  | AT91_REG	 TWI_MMR;	/* Master Mode Register			*/ | 
|  | AT91_REG	 TWI_SMR;	/* Slave Mode Register			*/ | 
|  | AT91_REG	 TWI_IADR;	/* Internal Address Register		*/ | 
|  | AT91_REG	 TWI_CWGR;	/* Clock Waveform Generator Register	*/ | 
|  | AT91_REG	 Reserved0[3]; | 
|  | AT91_REG	 TWI_SR;	/* Status Register			*/ | 
|  | AT91_REG	 TWI_IER;	/* Interrupt Enable Register		*/ | 
|  | AT91_REG	 TWI_IDR;	/* Interrupt Disable Register		*/ | 
|  | AT91_REG	 TWI_IMR;	/* Interrupt Mask Register		*/ | 
|  | AT91_REG	 TWI_RHR;	/* Receive Holding Register		*/ | 
|  | AT91_REG	 TWI_THR;	/* Transmit Holding Register		*/ | 
|  | AT91_REG	 Reserved1[50]; | 
|  | AT91_REG	 TWI_RPR;	/* Receive Pointer Register		*/ | 
|  | AT91_REG	 TWI_RCR;	/* Receive Counter Register		*/ | 
|  | AT91_REG	 TWI_TPR;	/* Transmit Pointer Register		*/ | 
|  | AT91_REG	 TWI_TCR;	/* Transmit Counter Register		*/ | 
|  | AT91_REG	 TWI_RNPR;	/* Receive Next Pointer Register	*/ | 
|  | AT91_REG	 TWI_RNCR;	/* Receive Next Counter Register	*/ | 
|  | AT91_REG	 TWI_TNPR;	/* Transmit Next Pointer Register	*/ | 
|  | AT91_REG	 TWI_TNCR;	/* Transmit Next Counter Register	*/ | 
|  | AT91_REG	 TWI_PTCR;	/* PDC Transfer Control Register	*/ | 
|  | AT91_REG	 TWI_PTSR;	/* PDC Transfer Status Register		*/ | 
|  | } AT91S_TWI, *AT91PS_TWI; | 
|  |  | 
|  | #endif | 
|  |  | 
|  | /* -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register --------		*/ | 
|  | #define AT91C_TWI_START (0x1 <<	 0)	/* (TWI) Send a START Condition		*/ | 
|  | #define AT91C_TWI_STOP	(0x1 <<	 1)	/* (TWI) Send a STOP Condition		*/ | 
|  | #define AT91C_TWI_MSEN	(0x1 <<	 2)	/* (TWI) TWI Master Transfer Enabled	*/ | 
|  | #define AT91C_TWI_MSDIS (0x1 <<	 3)	/* (TWI) TWI Master Transfer Disabled	*/ | 
|  | #define AT91C_TWI_SVEN	(0x1 <<	 4)	/* (TWI) TWI Slave Transfer Enabled	*/ | 
|  | #define AT91C_TWI_SVDIS (0x1 <<	 5)	/* (TWI) TWI Slave Transfer Disabled	*/ | 
|  | #define AT91C_TWI_SWRST (0x1 <<	 7)	/* (TWI) Software Reset		*/ | 
|  | /* -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register --------	*/ | 
|  | #define AT91C_TWI_IADRSZ      (0x3 <<  8) /* (TWI) Internal Device Address Size */ | 
|  | #define	  AT91C_TWI_IADRSZ_NO	  (0x0 <<  8) /* (TWI) No internal device address	*/ | 
|  | #define	  AT91C_TWI_IADRSZ_1_BYTE (0x1 <<  8) /* (TWI) One-byte internal device address */ | 
|  | #define	  AT91C_TWI_IADRSZ_2_BYTE (0x2 <<  8) /* (TWI) Two-byte internal device address */ | 
|  | #define	  AT91C_TWI_IADRSZ_3_BYTE (0x3 <<  8) /* (TWI) Three-byte internal device address */ | 
|  | #define AT91C_TWI_MREAD (0x1 << 12)	/* (TWI) Master Read Direction		*/ | 
|  | #define AT91C_TWI_DADR	(0x7F <<  6)	/* (TWI) Device Address			*/ | 
|  | /* -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register --------	*/ | 
|  | #define AT91C_TWI_SADR	(0x7F << 16)	/* (TWI) Slave Device Address		*/ | 
|  | /* -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register --------	*/ | 
|  | #define AT91C_TWI_CLDIV	 (0xFF <<  0)	/* (TWI) Clock Low Divider		*/ | 
|  | #define AT91C_TWI_CHDIV	 (0xFF <<  8)	/* (TWI) Clock High Divider		*/ | 
|  | #define AT91C_TWI_CKDIV	 (0x7 << 16)	/* (TWI) Clock Divider			*/ | 
|  | /* -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register --------		*/ | 
|  | #define AT91C_TWI_TXCOMP (0x1 <<  0)	/* (TWI) Transmission Completed		*/ | 
|  | #define AT91C_TWI_RXRDY	 (0x1 <<  1)	/* (TWI) Receive holding register ReaDY */ | 
|  | #define AT91C_TWI_TXRDY	 (0x1 <<  2)	/* (TWI) Transmit holding register ReaDY*/ | 
|  | #define AT91C_TWI_SVREAD (0x1 <<  3)	/* (TWI) Slave Read			*/ | 
|  | #define AT91C_TWI_SVACC	 (0x1 <<  4)	/* (TWI) Slave Access			*/ | 
|  | #define AT91C_TWI_GCACC	 (0x1 <<  5)	/* (TWI) General Call Access		*/ | 
|  | #define AT91C_TWI_OVRE	 (0x1 <<  6)	/* (TWI) Overrun Error			*/ | 
|  | #define AT91C_TWI_UNRE	 (0x1 <<  7)	/* (TWI) Underrun Error			*/ | 
|  | #define AT91C_TWI_NACK	 (0x1 <<  8)	/* (TWI) Not Acknowledged		*/ | 
|  | #define AT91C_TWI_ARBLST (0x1 <<  9)	/* (TWI) Arbitration Lost		*/ | 
|  | /* -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- */ | 
|  | /* -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register ------- */ | 
|  | /* -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register --------	*/ | 
|  |  | 
|  | /* | 
|  | i2c Support for Atmel's AT91RM9200 Two-Wire Interface | 
|  |  | 
|  | (c) Rick Bronson | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 2 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, write to the Free Software | 
|  | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | */ | 
|  |  | 
|  | #ifndef AT91_I2C_H | 
|  | #define AT91_I2C_H | 
|  |  | 
|  | #define AT91C_TWI_CLOCK		100000 | 
|  | #define AT91C_TWI_SCLOCK	(10 * AT91C_MASTER_CLOCK / AT91C_TWI_CLOCK) | 
|  | #define AT91C_TWI_CKDIV1	(2 << 16)	/* TWI clock divider.  NOTE: see Errata #22 */ | 
|  |  | 
|  | #if (AT91C_TWI_SCLOCK % 10) >= 5 | 
|  | #define AT91C_TWI_CLDIV2 ((AT91C_TWI_SCLOCK / 10) - 5) | 
|  | #else | 
|  | #define AT91C_TWI_CLDIV2 ((AT91C_TWI_SCLOCK / 10) - 6) | 
|  | #endif | 
|  | #define AT91C_TWI_CLDIV3 ((AT91C_TWI_CLDIV2 + (4 - AT91C_TWI_CLDIV2 % 4)) >> 2) | 
|  |  | 
|  | #define AT91C_EEPROM_I2C_ADDRESS	(0x50 << 16) | 
|  |  | 
|  | #endif	/* __ASSEMBLY__ */ | 
|  | #endif	/* AT91RM9200_TWI_H */ |