10 // Default timeout, in milliseconds for generic read/write
12 #define I2C_DEFAULT_TIMEOUT 100
28 static volatile int i2cBusInUse;
30 static U8 *i2cDataBuffer;
31 static int i2cDataLenWrite;
32 static int i2cDataLenRead;
33 static unsigned int i2cTimeoutInTicks = I2C_DEFAULT_TIMEOUT / portTICK_RATE_MS;
34 static int i2cDataCnt;
35 static ackPoll_e i2cAckPoll = ACKPOLL_NO;
41 static U8 i2cTransactions [64];
42 static int i2cTransactionsIndex;
43 #define i2cDebug(x) do { if (i2cAckPoll && (i2cTransactionsIndex < (int) sizeof (i2cTransactions))) i2cTransactions [i2cTransactionsIndex++] = x; } while (0)
44 #define i2cDebugReset() do { i2cTransactionsIndex = 0; } while (0)
46 #define i2cDebug(x) do { } while (0)
47 #define i2cDebugReset() do { } while (0)
50 static void i2cISR (void) __attribute__ ((interrupt ("IRQ")));
51 static void i2cISR (void)
53 i2cErrno = (I2C0_STAT & I2C_STAT_STATMASK);
59 // Transmit conditions
61 case I2CERR_BUSERRORx : // 0x00
63 I2C0_CONSET = I2C_CONSET_STO | I2C_CONSET_AA;
64 i2cAckPoll = ACKPOLL_NO;
69 case I2CERR_STARTTX : // 0x08
70 case I2CERR_REPEATEDSTARTTX : // 0x10
72 i2cDebug (i2cAddress);
73 I2C0_DAT = i2cAddress;
77 case I2CERR_SLAWTX_ACKRX : // 0x18
78 case I2CERR_DATTX_ACKRX : // 0x28
80 i2cAckPoll = ACKPOLL_NO;
82 if (i2cDataLenWrite && (i2cDataCnt < i2cDataLenWrite))
84 i2cDebug (i2cDataBuffer [i2cDataCnt]);
85 I2C0_DAT = i2cDataBuffer [i2cDataCnt++];
86 I2C0_CONCLR = I2C_CONCLR_STAC;
93 I2C0_CONCLR = I2C_CONCLR_STAC;
94 I2C0_CONSET = I2C_CONSET_STO;
95 i2cErrno = I2CERR_NONE;
103 I2C0_CONSET = I2C_CONSET_STA;
109 case I2CERR_DATRX_NACKTX : // 0x58
111 i2cDataBuffer [i2cDataCnt++] = I2C0_DAT;
112 i2cDebug (i2cDataBuffer [i2cDataCnt - 1]);
113 i2cErrno = I2CERR_NONE;
116 case I2CERR_SLAWTX_NACKRX : // 0x20
117 case I2CERR_SLARTX_NACKRX : // 0x48
123 case I2CERR_DATTX_NACKRX : // 0x30
125 I2C0_CONCLR = I2C_CONCLR_STAC;
126 I2C0_CONSET = I2C_CONSET_STO;
131 case I2CERR_ARBLOST : // 0x38
133 I2C0_CONSET = I2C_CONSET_STA;
138 // Receive byte conditions (fall through is intentional)
140 case I2CERR_DATRX_ACKTX : // 0x50
142 i2cDataBuffer [i2cDataCnt++] = I2C0_DAT;
143 i2cDebug (i2cDataBuffer [i2cDataCnt - 1]);
146 case I2CERR_SLARTX_ACKRX : // 0x40
148 if (i2cDataCnt < i2cDataLenRead - 1)
150 I2C0_CONCLR = I2C_CONCLR_STAC;
151 I2C0_CONSET = I2C_CONSET_AA;
154 I2C0_CONCLR = I2C_CONCLR_STAC | I2C_CONCLR_AAC;
163 I2C0_CONCLR = I2C_CONCLR_I2ENC;
164 i2cAckPoll = ACKPOLL_NO;
170 I2C0_CONCLR = I2C_CONSET_SI;
180 i2cAckPoll = ACKPOLL_NO;
182 SCB_PCONP |= SCB_PCONP_PCI2C0;
184 PCB_PINSEL0 = (PCB_PINSEL0 & ~(PCB_PINSEL0_P02_MASK | PCB_PINSEL0_P03_MASK)) | (PCB_PINSEL0_P02_SCL0 | PCB_PINSEL0_P03_SDA0);
186 I2C0_CONCLR = I2C_CONCLR_MASK;
187 I2C0_CONSET = I2C_CONSET_I2EN;
192 // Initialize the interrupt vector
194 VIC_IntSelect &= ~VIC_IntSelect_I2C0;
195 VIC_VectCntl7 = VIC_VectCntl_ENABLE | VIC_Channel_I2C0;
196 VIC_VectAddr7 = (int) i2cISR;
197 VIC_IntEnable = VIC_IntEnable_I2C0;
203 static int i2cWaitComplete (int ticks)
209 for (theFuture = times (NULL) + ticks; i2cBusInUse; )
211 if (times (NULL) > theFuture)
213 I2C0_CONCLR = I2C_CONCLR_I2ENC;
214 i2cErrno = I2CERR_TIMEOUTWC;
220 return (i2cErrno == I2CERR_NONE) ? 0 : -1;
223 static int i2cPoll (U8 address)
225 clock_t theFuture = times (NULL) + 10;
227 VIC_IntEnClr = VIC_IntEnClr_I2C0;
229 while (times (NULL) < theFuture)
231 I2C0_CONCLR = I2C_CONSET_SI;
232 I2C0_CONSET = I2C_CONSET_STA;
234 while (!(I2C0_CONSET & I2C_CONSET_SI))
237 I2C0_CONCLR = I2C_CONCLR_STAC | I2C_CONCLR_SIC;
238 I2C0_DAT = address & ~0x01;
240 while (!(I2C0_CONSET & I2C_CONSET_SI))
243 if ((i2cErrno = I2C0_STAT) == I2CERR_SLAWTX_ACKRX)
247 if (i2cErrno != I2CERR_SLAWTX_ACKRX)
248 i2cErrno = I2CERR_TIMEOUTACKPOLL;
250 I2C0_CONCLR = I2C_CONCLR_SIC;
251 I2C0_CONSET = I2C_CONSET_STO | I2C_CONSET_AA;
253 while (I2C0_CONSET & I2C_CONSET_STO)
256 VIC_IntEnable = VIC_IntEnable_I2C0;
258 return (i2cErrno == I2CERR_SLAWTX_ACKRX) ? 0 : -1;
264 static int i2cKickOff (U8 address, U8 *buffer, int bufferLenWrite, int bufferLenRead, ackPoll_e ackPoll)
267 // Determine if our first operation will be a write or read. If both, the
268 // write always occurs first.
272 else if (bufferLenRead)
278 // Wait until last I2C operation has finished.
280 if (i2cBusInUse && i2cWaitComplete (i2cTimeoutInTicks))
282 i2cErrno = I2CERR_TIMEOUT;
287 // Mark bus as in use, save the address, buffer and length
290 i2cAddress = address;
291 i2cDataBuffer = buffer;
292 i2cDataLenWrite = bufferLenWrite;
293 i2cDataLenRead = bufferLenRead;
295 i2cAckPoll = ackPoll;
299 // Clear any outstanding bits, enable the interface, and send a start bit.
300 // Once the start bit goes out, the interrupt drive state machine begins.
302 I2C0_CONCLR = I2C_CONCLR_MASK;
303 I2C0_CONSET = I2C_CONSET_I2EN;
304 I2C0_CONSET = I2C_CONSET_STA;
312 static int i2cWriteBufferEx (U8 address, U8 *buffer, U32 bufferLength, int milliseconds)
316 if (!(r = i2cKickOff (address, buffer, bufferLength, 0, ACKPOLL_NO)))
317 r = i2cWaitComplete (milliseconds / portTICK_RATE_MS);
322 static int i2cReadBufferEx (U8 address, U8 *buffer, U32 bufferLength, int milliseconds)
326 if (!(r = i2cKickOff (address, buffer, 0, bufferLength, ACKPOLL_NO)))
327 r = i2cWaitComplete (milliseconds / portTICK_RATE_MS);
332 static int i2cWriteReadBufferEx (U8 address, U8 *buffer, U32 putLength, U32 getLength, int milliseconds)
336 if (!(r = i2cKickOff (address, buffer, putLength, getLength, ACKPOLL_NO)))
337 r = i2cWaitComplete (milliseconds / portTICK_RATE_MS);
345 void i2cSetTimeout (unsigned int timeoutInMilliseconds)
347 if (timeoutInMilliseconds < portTICK_RATE_MS)
348 timeoutInMilliseconds = portTICK_RATE_MS;
350 i2cTimeoutInTicks = timeoutInMilliseconds / portTICK_RATE_MS;
358 for (i = 0; i < i2cTransactionsIndex; i++)
359 printf ("0x%02x ", i2cTransactions [i]);
363 printf ("Not compiled for i2c debugging\n");
368 // DANGER, WILL ROBINSON! The callers buffer must persist until we're done
370 int i2cWriteBuffer (U8 address, U8 *buffer, U32 bufferLength)
372 return i2cWriteBufferEx (address, buffer, bufferLength, i2cTimeoutInTicks);
375 int i2cReadBuffer (U8 address, U8 *buffer, U32 bufferLength)
377 return i2cReadBufferEx (address, buffer, bufferLength, i2cTimeoutInTicks);
380 int i2cWriteReadBuffer (U8 address, U8 *buffer, U32 putLength, U32 getLength)
382 return i2cWriteReadBufferEx (address, buffer, putLength, getLength, i2cTimeoutInTicks);
385 int i2cWriteBufferPoll (U8 address, U8 *buffer, U32 bufferLength)
389 if (!(r = i2cKickOff (address, buffer, bufferLength, 0, ACKPOLL_NO)))
390 if (!(r = i2cWaitComplete (i2cTimeoutInTicks)))
391 r = i2cPoll (address);
396 int i2cWriteReadBufferPoll (U8 address, U8 *buffer, U32 putLength, U32 getLength)
400 if (!(r = i2cKickOff (address, buffer, putLength, getLength, ACKPOLL_NO)))
401 if (!(r = i2cWaitComplete (i2cTimeoutInTicks)))
402 r = i2cPoll (address);