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