| Line No. | Rev | Author | Line | 
|---|---|---|---|
| 1 | 6 | kaklik | /*! \file i2c.h \brief I2C interface using AVR Two-Wire Interface (TWI) hardware. */ | 
| 2 | //***************************************************************************** | ||
| 3 | // | ||
| 4 | // File Name	: 'i2c.h' | ||
| 5 | // Title		: I2C interface using AVR Two-Wire Interface (TWI) hardware | ||
| 6 | // Author		: Pascal Stang - Copyright (C) 2002-2003 | ||
| 7 | // Created		: 2002.06.25 | ||
| 8 | // Revised		: 2003.03.03 | ||
| 9 | // Version		: 0.9 | ||
| 10 | // Target MCU	: Atmel AVR series | ||
| 11 | // Editor Tabs	: 4 | ||
| 12 | // | ||
| 13 | ///	\ingroup driver_avr | ||
| 14 | /// \defgroup i2c I2C Serial Interface Function Library (i2c.c) | ||
| 15 | /// \code #include "i2c.h" \endcode | ||
| 16 | /// \par Overview | ||
| 17 | ///		This library provides the high-level functions needed to use the I2C | ||
| 18 | ///	serial interface supported by the hardware of several AVR processors. | ||
| 19 | /// The library is functional but has not been exhaustively tested yet and is | ||
| 20 | /// still expanding.  Thanks to the standardization of the I2C protocol and | ||
| 21 | ///	register access, the send and receive commands are everything you need to | ||
| 22 | /// talk to thousands of different I2C devices including: EEPROMS, Flash memory, | ||
| 23 | /// MP3 players, A/D and D/A converters, electronic potentiometers, etc. | ||
| 24 | /// | ||
| 25 | /// \par About I2C | ||
| 26 | ///			I2C (pronounced "eye-squared-see") is a two-wire bidirectional | ||
| 27 | ///		network designed for easy transfer of information between a wide variety | ||
| 28 | ///		of intelligent devices.  Many of the Atmel AVR series processors have | ||
| 29 | ///		hardware support for transmitting and receiving using an I2C-type bus. | ||
| 30 | ///		In addition to the AVRs, there are thousands of other parts made by | ||
| 31 | ///		manufacturers like Philips, Maxim, National, TI, etc that use I2C as | ||
| 32 | ///		their primary means of communication and control.  Common device types | ||
| 33 | ///		are A/D & D/A converters, temp sensors, intelligent battery monitors, | ||
| 34 | ///		MP3 decoder chips, EEPROM chips, multiplexing switches, etc. | ||
| 35 | /// | ||
| 36 | ///		I2C uses only two wires (SDA and SCL) to communicate bidirectionally | ||
| 37 | ///		between devices.  I2C is a multidrop network, meaning that you can have | ||
| 38 | ///		several devices on a single bus.  Because I2C uses a 7-bit number to | ||
| 39 | ///		identify which device it wants to talk to, you cannot have more than | ||
| 40 | ///		127 devices on a single bus. | ||
| 41 | /// | ||
| 42 | ///		I2C ordinarily requires two 4.7K pull-up resistors to power (one each on | ||
| 43 | ///		SDA and SCL), but for small numbers of devices (maybe 1-4), it is enough | ||
| 44 | ///		to activate the internal pull-up resistors in the AVR processor.  To do | ||
| 45 | ///		this, set the port pins, which correspond to the I2C pins SDA/SCL, high. | ||
| 46 | ///		For example, on the mega163, sbi(PORTC, 0); sbi(PORTC, 1);. | ||
| 47 | /// | ||
| 48 | ///		For complete information about I2C, see the Philips Semiconductor | ||
| 49 | ///		website.  They created I2C and have the largest family of devices that | ||
| 50 | ///		work with I2C. | ||
| 51 | /// | ||
| 52 | /// \Note: Many manufacturers market I2C bus devices under a different or generic | ||
| 53 | ///		bus name like "Two-Wire Interface".  This is because Philips still holds | ||
| 54 | ///		"I2C" as a trademark.  For example, SMBus and SMBus devices are hardware | ||
| 55 | ///		compatible and closely related to I2C.  They can be directly connected | ||
| 56 | ///		to an I2C bus along with other I2C devices are are generally accessed in | ||
| 57 | ///		the same way as I2C devices.  SMBus is often found on modern motherboards | ||
| 58 | ///		for temp sensing and other low-level control tasks. | ||
| 59 | // | ||
| 60 | // This code is distributed under the GNU Public License | ||
| 61 | //		which can be found at http://www.gnu.org/licenses/gpl.txt | ||
| 62 | // | ||
| 63 | //***************************************************************************** | ||
| 64 | |||
| 65 | #ifndef I2C_H | ||
| 66 | #define I2C_H | ||
| 67 | |||
| 68 | #include "global.h" | ||
| 69 | |||
| 70 | // include project-specific configuration | ||
| 71 | #include "i2cconf.h" | ||
| 72 | |||
| 73 | // TWSR values (not bits) | ||
| 74 | // (taken from avr-libc twi.h - thank you Marek Michalkiewicz) | ||
| 75 | // Master | ||
| 76 | #define TW_START					0x08 | ||
| 77 | #define TW_REP_START				0x10 | ||
| 78 | // Master Transmitter | ||
| 79 | #define TW_MT_SLA_ACK				0x18 | ||
| 80 | #define TW_MT_SLA_NACK				0x20 | ||
| 81 | #define TW_MT_DATA_ACK				0x28 | ||
| 82 | #define TW_MT_DATA_NACK				0x30 | ||
| 83 | #define TW_MT_ARB_LOST				0x38 | ||
| 84 | // Master Receiver | ||
| 85 | #define TW_MR_ARB_LOST				0x38 | ||
| 86 | #define TW_MR_SLA_ACK				0x40 | ||
| 87 | #define TW_MR_SLA_NACK				0x48 | ||
| 88 | #define TW_MR_DATA_ACK				0x50 | ||
| 89 | #define TW_MR_DATA_NACK				0x58 | ||
| 90 | // Slave Transmitter | ||
| 91 | #define TW_ST_SLA_ACK				0xA8 | ||
| 92 | #define TW_ST_ARB_LOST_SLA_ACK		0xB0 | ||
| 93 | #define TW_ST_DATA_ACK				0xB8 | ||
| 94 | #define TW_ST_DATA_NACK				0xC0 | ||
| 95 | #define TW_ST_LAST_DATA				0xC8 | ||
| 96 | // Slave Receiver | ||
| 97 | #define TW_SR_SLA_ACK				0x60 | ||
| 98 | #define TW_SR_ARB_LOST_SLA_ACK		0x68 | ||
| 99 | #define TW_SR_GCALL_ACK				0x70 | ||
| 100 | #define TW_SR_ARB_LOST_GCALL_ACK	0x78 | ||
| 101 | #define TW_SR_DATA_ACK				0x80 | ||
| 102 | #define TW_SR_DATA_NACK				0x88 | ||
| 103 | #define TW_SR_GCALL_DATA_ACK		0x90 | ||
| 104 | #define TW_SR_GCALL_DATA_NACK		0x98 | ||
| 105 | #define TW_SR_STOP					0xA0 | ||
| 106 | // Misc | ||
| 107 | #define TW_NO_INFO					0xF8 | ||
| 108 | #define TW_BUS_ERROR				0x00 | ||
| 109 | |||
| 110 | // defines and constants | ||
| 111 | #define TWCR_CMD_MASK		0x0F | ||
| 112 | #define TWSR_STATUS_MASK	0xF8 | ||
| 113 | |||
| 114 | // return values | ||
| 115 | #define I2C_OK				0x00 | ||
| 116 | #define I2C_ERROR_NODEV		0x01 | ||
| 117 | |||
| 118 | // types | ||
| 119 | typedef enum | ||
| 120 | { | ||
| 121 | 	I2C_IDLE = 0, I2C_BUSY = 1, | ||
| 122 | 	I2C_MASTER_TX = 2, I2C_MASTER_RX = 3, | ||
| 123 | 	I2C_SLAVE_TX = 4, I2C_SLAVE_RX = 5 | ||
| 124 | } eI2cStateType; | ||
| 125 | |||
| 126 | // functions | ||
| 127 | |||
| 128 | //! Initialize I2C (TWI) interface | ||
| 129 | void i2cInit(void); | ||
| 130 | |||
| 131 | //! Set the I2C transaction bitrate (in KHz) | ||
| 132 | void i2cSetBitrate(u16 bitrateKHz); | ||
| 133 | |||
| 134 | // I2C setup and configurations commands | ||
| 135 | //! Set the local (AVR processor's) I2C device address | ||
| 136 | void i2cSetLocalDeviceAddr(u08 deviceAddr, u08 genCallEn); | ||
| 137 | |||
| 138 | //! Set the user function which handles receiving (incoming) data as a slave | ||
| 139 | void i2cSetSlaveReceiveHandler(void (*i2cSlaveRx_func)(u08 receiveDataLength, u08* recieveData)); | ||
| 140 | //! Set the user function which handles transmitting (outgoing) data as a slave | ||
| 141 | void i2cSetSlaveTransmitHandler(u08 (*i2cSlaveTx_func)(u08 transmitDataLengthMax, u08* transmitData)); | ||
| 142 | |||
| 143 | // Low-level I2C transaction commands  | ||
| 144 | //! Send an I2C start condition in Master mode | ||
| 145 | void i2cSendStart(void); | ||
| 146 | //! Send an I2C stop condition in Master mode | ||
| 147 | void i2cSendStop(void); | ||
| 148 | //! Wait for current I2C operation to complete | ||
| 149 | void i2cWaitForComplete(void); | ||
| 150 | //! Send an (address|R/W) combination or a data byte over I2C | ||
| 151 | void i2cSendByte(u08 data); | ||
| 152 | //! Receive a data byte over I2C   | ||
| 153 | // ackFlag = TRUE if recevied data should be ACK'ed | ||
| 154 | // ackFlag = FALSE if recevied data should be NACK'ed | ||
| 155 | void i2cReceiveByte(u08 ackFlag); | ||
| 156 | //! Pick up the data that was received with i2cReceiveByte() | ||
| 157 | u08 i2cGetReceivedByte(void); | ||
| 158 | //! Get current I2c bus status from TWSR | ||
| 159 | u08 i2cGetStatus(void); | ||
| 160 | |||
| 161 | // high-level I2C transaction commands | ||
| 162 | |||
| 163 | //! send I2C data to a device on the bus | ||
| 164 | void i2cMasterSend(u08 deviceAddr, u08 length, u08 *data); | ||
| 165 | //! receive I2C data from a device on the bus | ||
| 166 | void i2cMasterReceive(u08 deviceAddr, u08 length, u08* data); | ||
| 167 | |||
| 168 | //! send I2C data to a device on the bus (non-interrupt based) | ||
| 169 | u08 i2cMasterSendNI(u08 deviceAddr, u08 length, u08* data); | ||
| 170 | //! receive I2C data from a device on the bus (non-interrupt based) | ||
| 171 | u08 i2cMasterReceiveNI(u08 deviceAddr, u08 length, u08 *data); | ||
| 172 | |||
| 173 | //! Get the current high-level state of the I2C interface | ||
| 174 | eI2cStateType i2cGetState(void); | ||
| 175 | |||
| 176 | #endif | 
Powered by WebSVN v2.8.3