/[H8]/trunk/docs/Microchip TCP_IP stack/TCPIP Stack/I2CEEPROM.c
ViewVC logotype

Contents of /trunk/docs/Microchip TCP_IP stack/TCPIP Stack/I2CEEPROM.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15 - (show annotations) (download)
Thu Apr 19 09:01:15 2007 UTC (17 years, 1 month ago) by hedin
File MIME type: text/plain
File size: 19661 byte(s)
added the TCP/IP stack, source code.
1 /*********************************************************************
2 *
3 * Data I2C EEPROM Access Routines
4 *
5 *********************************************************************
6 * FileName: I2CEEPROM.c
7 * Dependencies: Compiler.h
8 * XEEPROM.h
9 * Processor: PIC18
10 * Complier: Microchip C18 v3.03 or higher
11 * Company: Microchip Technology, Inc.
12 *
13 * Software License Agreement
14 *
15 * Copyright © 2002-2007 Microchip Technology Inc. All rights
16 * reserved.
17 *
18 * Microchip licenses to you the right to use, modify, copy, and
19 * distribute:
20 * (i) the Software when embedded on a Microchip microcontroller or
21 * digital signal controller product (“Device”) which is
22 * integrated into Licensee’s product; or
23 * (ii) ONLY the Software driver source files ENC28J60.c and
24 * ENC28J60.h ported to a non-Microchip device used in
25 * conjunction with a Microchip ethernet controller for the
26 * sole purpose of interfacing with the ethernet controller.
27 *
28 * You should refer to the license agreement accompanying this
29 * Software for additional information regarding your rights and
30 * obligations.
31 *
32 * THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT
33 * WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
34 * LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A
35 * PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
36 * MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR
37 * CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF
38 * PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
39 * BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE
40 * THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER
41 * SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT
42 * (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE.
43 *
44 *
45 * Author Date Comment
46 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 * Nilesh Rajbharti 5/20/02 Original (Rev. 1.0)
48 * Howard Schlunder 8/10/06 Renamed registers/bits to use
49 * C18/C30 style standard names
50 ********************************************************************/
51 #include "TCPIP Stack/TCPIP.h"
52
53 #if defined(MPFS_USE_EEPROM) && defined(EEPROM_SCL_TRIS) && defined(STACK_USE_MPFS)
54
55 // 24LC256 I/O pins
56 #define EEPROM_SCL_TRIS (TRISCbits.TRISC3)
57 #define EEPROM_SDA_TRIS (TRISCbits.TRISC4)
58 #define EEPROM_SCL_IO (PORTCbits.RC3)
59 #define EEPROM_SDA_IO (PORTCbits.RC4)
60 #define EEPROM_SSPBUF (SSPBUF)
61 #define EEPROM_SSPCON1 (SSPCON1)
62 #define EEPROM_SSPCON1bits (SSPCON1bits)
63 #define EEPROM_SSPCON2 (SSPCON2)
64 #define EEPROM_SSPCON2bits (SSPCON2bits)
65 #define EEPROM_SSPSTATbits (SSPSTATbits)
66
67
68 // I2C bits are in different registers for 8-bit and 16-bit
69 // microcontrollers
70 #if defined(__18CXX)
71 #define I2CBIT_ACKDT (EEPROM_SSPCON2bits.ACKDT)
72 #define I2CBIT_ACKEN (EEPROM_SSPCON2bits.ACKEN)
73 #define I2CBIT_RCEN (EEPROM_SSPCON2bits.RCEN)
74 #define I2CBIT_PEN (EEPROM_SSPCON2bits.PEN)
75 #define I2CBIT_SEN (EEPROM_SSPCON2bits.SEN)
76 #define I2CBIT_ACKSTAT (EEPROM_SSPCON2bits.ACKSTAT)
77 #define I2CBIT_TRSTAT (EEPROM_SSPSTATbits.R_W)
78 // #define I2CBIT_TRSTAT (EEPROM_SSPSTATbits.BF)
79 #define I2CBIT_IWCOL (EEPROM_SSPCON1bits.WCOL)
80 #define I2C_DATA_IN (EEPROM_SSPBUF)
81 #define I2C_DATA_OUT (EEPROM_SSPBUF)
82 #elif defined(__C30__)
83 #define I2CBIT_ACKDT (EEPROM_I2CCONbits.ACKDT)
84 #define I2CBIT_ACKEN (EEPROM_I2CCONbits.ACKEN)
85 #define I2CBIT_RCEN (EEPROM_I2CCONbits.RCEN)
86 #define I2CBIT_PEN (EEPROM_I2CCONbits.PEN)
87 #define I2CBIT_SEN (EEPROM_I2CCONbits.SEN)
88 #define I2CBIT_ACKSTAT (EEPROM_I2CSTATbits.ACKSTAT)
89 #define I2CBIT_TRSTAT (EEPROM_I2CSTATbits.TRSTAT)
90 #define I2CBIT_IWCOL (EEPROM_I2CSTATbits.IWCOL)
91 #define I2C_DATA_IN (EEPROM_I2CRCV)
92 #define I2C_DATA_OUT (EEPROM_I2CTRN)
93 #endif
94
95
96 #define READ (0x01)
97 #define WRITE (0x00)
98
99 static BOOL NeedACK = FALSE;
100 static BOOL NeedEndRead = FALSE;
101 static BOOL NeedEndWrite = FALSE;
102
103
104 static void Delayus(BYTE v);
105 static void I2CStart(void);
106 static void I2CStop(void);
107 static void I2CAck(BOOL Not);
108 static BOOL I2CPut(BYTE c);
109 static BYTE I2CGet(void);
110
111 static void Delayus(BYTE v)
112 {
113 while(v--)
114 {
115 Nop();
116 }
117 }
118
119
120 static void I2CStart(void)
121 {
122 EEPROM_SCL_TRIS = 1; // Clock line must be high
123 while(EEPROM_SCL_IO == 0);
124 Delayus(3);
125
126 // Generate a start condition
127 EEPROM_SDA_TRIS = 0;
128 Delayus(3);
129 }
130
131 static void I2CStop(void)
132 {
133 // Pull data low
134 EEPROM_SDA_TRIS = 0;
135 Delayus(1);
136
137
138 EEPROM_SCL_TRIS = 1; // Clock line must be high
139 while(EEPROM_SCL_IO == 0);
140 Delayus(3);
141
142 // Generate a stop condition
143 EEPROM_SDA_TRIS = 1;
144 Delayus(3);
145 }
146
147 static void I2CAck(BOOL Not)
148 {
149 // Generate the (N)Ack
150 EEPROM_SDA_TRIS = Not;
151 Delayus(3);
152
153 EEPROM_SCL_TRIS = 1; // Release the clock
154 while(EEPROM_SCL_IO == 0);
155 Delayus(3);
156
157 EEPROM_SCL_TRIS = 0; // Pull clock low
158 Delayus(1);
159 EEPROM_SDA_TRIS = 1;
160 Delayus(3);
161 }
162
163 static BOOL I2CPut(BYTE c)
164 {
165 BYTE i;
166
167 EEPROM_SCL_TRIS = 0; // Clock line must be low
168 Delayus(1);
169
170 for(i = 0; i < 8; i++)
171 {
172 // Generate the data bit
173 EEPROM_SDA_TRIS = ((BYTE_VAL*)&c)->bits.b7;
174 Delayus(3);
175 EEPROM_SCL_TRIS = 1; // Release the clock
176 while(EEPROM_SCL_IO == 0);
177 Delayus(3);
178 EEPROM_SCL_TRIS = 0; // Pull clock low
179 Delayus(1);
180 c <<= 1;
181 }
182
183 // Read the ACK response
184 EEPROM_SDA_TRIS = 1;
185 Delayus(3);
186
187 EEPROM_SCL_TRIS = 1; // Release the clock
188 while(EEPROM_SCL_IO == 0);
189 Delayus(1);
190 i = EEPROM_SDA_IO;
191 Delayus(1);
192 i += EEPROM_SDA_IO;
193 Delayus(1);
194 i += EEPROM_SDA_IO;
195
196 EEPROM_SCL_TRIS = 0; // Pull clock low
197 Delayus(3);
198
199 return i >= 2;
200 }
201
202
203 static BYTE I2CGet(void)
204 {
205 BYTE i;
206 BYTE c;
207
208 EEPROM_SCL_TRIS = 0; // Clock line must be low
209 Delayus(1);
210 EEPROM_SDA_TRIS = 1;
211 Delayus(3);
212
213 for(i = 0; i < 8; i++)
214 {
215 EEPROM_SCL_TRIS = 1; // Release the clock
216 while(EEPROM_SCL_IO == 0);
217 Delayus(3);
218
219 // Get the data bit
220 c <<= 1;
221 ((BYTE_VAL*)&c)->bits.b0 = EEPROM_SDA_IO;
222 EEPROM_SCL_TRIS = 0; // Pull clock low
223 Delayus(3);
224 }
225
226 return c;
227 }
228
229 void XEEInit(void)
230 {
231 LATCbits.LATC3 = 0;
232 LATCbits.LATC4 = 0;
233 // EEPROM_SCL_IO = 0;
234 // EEPROM_SDA_IO = 0;
235 EEPROM_SCL_TRIS = 1; // Set SCL pin to output
236 EEPROM_SDA_TRIS = 1; // Set SDA pin to input
237 }
238
239 XEE_RESULT XEEBeginWrite(XEE_ADDR address)
240 {
241 if(NeedEndRead)
242 while(1);
243 if(NeedEndWrite)
244 while(1);
245
246 while(XEEIsBusy());
247
248 NeedEndWrite = TRUE;
249
250 // Generate a start condition
251 I2CStart();
252
253 // Send "control" byte with device address to slave
254 if(I2CPut(EEPROM_CONTROL | WRITE))
255 while(1);
256 // Send address bytes
257 if(I2CPut(((WORD_VAL*)&address)->v[1]))
258 while(1);
259 if(I2CPut(((WORD_VAL*)&address)->v[0]))
260 while(1);
261
262 return XEE_SUCCESS;
263 }
264
265 XEE_RESULT XEEBeginRead(XEE_ADDR address)
266 {
267 // Set the address to read from. This procedure is identical
268 // for reading and writing.
269 XEEBeginWrite(address);
270
271 NeedEndRead = TRUE;
272 NeedEndWrite = FALSE;
273
274 // Generate a start condition
275 I2CStart();
276
277 // Send "control" byte with device address to slave
278 if(I2CPut(EEPROM_CONTROL | READ))
279 while(1);
280
281 return XEE_SUCCESS;
282 }
283
284 XEE_RESULT XEEEndWrite(void)
285 {
286 if(!NeedEndWrite)
287 while(1);
288 if(NeedEndRead)
289 while(1);
290
291 NeedEndWrite = FALSE;
292
293 // Generate a STOP condition
294 I2CStop();
295 }
296
297 XEE_RESULT XEEWrite(unsigned char val)
298 {
299 if(!NeedEndWrite)
300 while(1);
301 if(NeedEndRead)
302 while(1);
303
304 // Send data byte
305 if(I2CPut(val))
306 while(1);
307
308 return XEE_SUCCESS;
309 }
310
311 unsigned char XEERead(void)
312 {
313 if(NeedEndWrite)
314 while(1);
315 if(!NeedEndRead)
316 while(1);
317
318 if(NeedACK)
319 {
320 NeedACK = FALSE;
321 I2CAck(FALSE);
322 }
323
324 NeedACK = TRUE;
325
326 // Receive a byte
327 return I2CGet();
328 }
329
330 XEE_RESULT XEEEndRead(void)
331 {
332 if(NeedEndWrite)
333 while(1);
334 if(!NeedEndRead)
335 while(1);
336
337 NeedEndRead = FALSE;
338
339 // Send a NACK to complete the read
340 I2CAck(TRUE);
341 NeedACK = FALSE;
342
343 // Generate a STOP condition
344 I2CStop();
345
346 DelayMs(1);//TODO: debug
347
348 return XEE_SUCCESS;
349 }
350
351 XEE_RESULT XEEReadArray(XEE_ADDR address, unsigned char *buffer, unsigned char length)
352 {
353 XEEBeginRead(address);
354 while(length--)
355 *buffer++ = XEERead();
356 XEEEndRead();
357
358 return XEE_SUCCESS;
359 }
360
361 BOOL XEEIsBusy(void)
362 {
363 BOOL i;
364
365 if(NeedEndWrite)
366 while(1);
367 if(NeedEndRead)
368 while(1);
369
370 // Generate a start condition
371 I2CStart();
372
373 // Send "control" byte with device address to slave
374 i = I2CPut(EEPROM_CONTROL | WRITE);
375
376 // Generate a STOP condition
377 I2CStop();
378
379 return i;
380 }
381
382
383 //
384 ///*********************************************************************
385 // * Function: void XEEInit(unsigned char baud)
386 // *
387 // * PreCondition: None
388 // *
389 // * Input: baud - SSPADD value for bit rate.
390 // *
391 // * Output: None
392 // *
393 // * Side Effects: None
394 // *
395 // * Overview: Initialize I2C module to communicate to serial
396 // * EEPROM.
397 // *
398 // * Note: None
399 // ********************************************************************/
400 //void XEEInit(BYTE baud)
401 //{
402 //
403 //#if defined(__18CXX)
404 // EEPROM_SCL_TRIS = 1; // Set SCL pin to output
405 // EEPROM_SDA_TRIS = 1; // Set SDA pin to input
406 // SSPCON1 = 0x28; // Set SSPEN and set I2C Master mode
407 // SSPADD = (INSTR_FREQ+I2CBAUD/2)/I2CBAUD - 1;
408 //#elif defined(__C30__)
409 // EEPROM_I2CCONbits.I2CEN = 1;
410 // #if defined(__dsPIC30F__)
411 // I2CBRG = ((INSTR_FREQ+I2CBAUD/2)/I2CBAUD - (INSTR_FREQ+1111111/2)/1111111)-1; //dsPIC30F only
412 // #else
413 // I2CBRG = (INSTR_FREQ+I2CBAUD)/(2*I2CBAUD)-1 // PIC24, dsPIC33
414 // #endif
415 //#endif
416 //}
417 //
418 //
419 ///*********************************************************************
420 // * Macro: XEE_RESULT XEEBeginWrite(XEE_ADDR address)
421 // *
422 // * PreCondition: XEEInit() is already called.
423 // *
424 // * Input: control - data EEPROM control code
425 // * address - address to where to write
426 // *
427 // * Output: XEE_SUCCESS if successful
428 // * other value if failed.
429 // *
430 // * Side Effects: None
431 // *
432 // * Overview: Sets up internal address counter of EEPROM.
433 // *
434 // * Note: This function does not release the I2C bus.
435 // * User must close XEEEndWrite() after this function
436 // * is called to relase the I2C bus.
437 // ********************************************************************/
438 //XEE_RESULT XEEBeginWrite(BYTE control, XEE_ADDR address)
439 //{
440 // if(NeedEndRead)
441 // while(1);
442 // if(NeedEndWrite)
443 // while(1);
444 //
445 // NeedEndWrite = TRUE;
446 //
447 // // Generate a start condition
448 // I2CBIT_SEN = 1;
449 // while(I2CBIT_SEN);
450 //
451 // // Send "control" byte with device address to slave
452 // do
453 // {
454 // I2CBIT_IWCOL = 0;
455 // I2C_DATA_OUT = EEPROM_CONTROL | WRITE;
456 // } while(I2CBIT_IWCOL);
457 // while(I2CBIT_TRSTAT);
458 // if(I2CBIT_ACKSTAT)
459 // while(1);
460 //
461 // // Send address bytes
462 // do
463 // {
464 // I2CBIT_IWCOL = 0;
465 // I2C_DATA_OUT = ((WORD_VAL*)&address)->v[1];
466 // } while(I2CBIT_IWCOL);
467 // while(I2CBIT_TRSTAT);
468 // if(I2CBIT_ACKSTAT)
469 // while(1);
470 // do
471 // {
472 // I2CBIT_IWCOL = 0;
473 // I2C_DATA_OUT = ((WORD_VAL*)&address)->v[0];
474 // } while(I2CBIT_IWCOL);
475 // while(I2CBIT_TRSTAT);
476 // if(I2CBIT_ACKSTAT)
477 // while(1);
478 //
479 // return XEE_SUCCESS;
480 //}
481 //
482 ///*********************************************************************
483 // * Function: XEE_RESULT XEEBeginRead(XEE_ADDR address)
484 // *
485 // * PreCondition: XEEInit() is already called.
486 // *
487 // * Input: control - EEPROM control and address code.
488 // * address - Address at which read is to be performed.
489 // *
490 // * Output: XEE_SUCCESS if successful
491 // * other value if failed.
492 // *
493 // * Side Effects: None
494 // *
495 // * Overview: Sets internal address counter to given address.
496 // * Puts EEPROM in sequential read mode.
497 // *
498 // * Note: This function does not release I2C bus.
499 // * User must call XEEEndRead() when read is not longer
500 // * needed; I2C bus will released after XEEEndRead()
501 // * is called.
502 // ********************************************************************/
503 //XEE_RESULT XEEBeginRead(BYTE control, XEE_ADDR address)
504 //{
505 // if(NeedEndWrite)
506 // while(1);
507 // if(NeedEndRead)
508 // while(1);
509 //
510 //
511 // // Set the address to read from. This procedure is identical
512 // // for reading and writing.
513 // XEEBeginWrite(0, address);
514 //
515 // NeedEndRead = TRUE;
516 // NeedEndWrite = FALSE;
517 //
518 //// // Generate a STOP condition
519 //// I2CBIT_PEN = 1;
520 //// while(I2CBIT_PEN);
521 //
522 //
523 // EEPROM_SCL_TRIS = 1;
524 //
525 // // Generate a start condition
526 // I2CBIT_SEN = 1;
527 // while(I2CBIT_SEN);
528 //
529 // // Send "control" byte with device address to slave
530 // do
531 // {
532 // I2CBIT_IWCOL = 0;
533 // I2C_DATA_OUT = EEPROM_CONTROL | READ;
534 // } while(I2CBIT_IWCOL);
535 // while(I2CBIT_TRSTAT);
536 // if(I2CBIT_ACKSTAT)
537 // while(1);
538 //
539 // return XEE_SUCCESS;
540 //}
541 //
542 //
543 //XEE_RESULT XEEWrite(unsigned char val)
544 //{
545 // if(!NeedEndWrite)
546 // while(1);
547 // if(NeedEndRead)
548 // while(1);
549 //
550 // // Send data byte
551 // do
552 // {
553 // I2CBIT_IWCOL = 0;
554 // I2C_DATA_OUT = val;
555 // } while(I2CBIT_IWCOL);
556 // while(I2CBIT_TRSTAT);
557 // if(I2CBIT_ACKSTAT)
558 // while(1);
559 //
560 // return XEE_SUCCESS;
561 //}
562 //
563 ///*********************************************************************
564 // * Function: XEE_RESULT XEEEndWrite(void)
565 // *
566 // * PreCondition: XEEInit() && XEEBeginWrite() are already called.
567 // *
568 // * Input: None
569 // *
570 // * Output: XEE_SUCCESS if successful
571 // * other value if failed.
572 // *
573 // * Side Effects: None
574 // *
575 // * Overview: Instructs EEPROM to begin write cycle.
576 // *
577 // * Note: Call this function after either page full of bytes
578 // * written or no more bytes are left to load.
579 // * This function initiates the write cycle.
580 // * User must call for XEEWait() to ensure that write
581 // * cycle is finished before calling any other
582 // * routine.
583 // ********************************************************************/
584 //XEE_RESULT XEEEndWrite(void)
585 //{
586 // if(!NeedEndWrite)
587 // while(1);
588 // if(NeedEndRead)
589 // while(1);
590 //
591 // NeedEndWrite = FALSE;
592 //
593 // // Generate a STOP condition
594 // I2CBIT_PEN = 1;
595 // while(I2CBIT_PEN);
596 //
597 // DelayMs(5);
598 //
599 //}
600 //
601 //
602 //
603 ///*********************************************************************
604 // * Function: XEE_RESULT XEERead(void)
605 // *
606 // * PreCondition: XEEInit() && XEEBeginRead() are already called.
607 // *
608 // * Input: None
609 // *
610 // * Output: XEE_SUCCESS if successful
611 // * other value if failed.
612 // *
613 // * Side Effects: None
614 // *
615 // * Overview: Reads next byte from EEPROM; internal address
616 // * is incremented by one.
617 // *
618 // * Note: This function does not release I2C bus.
619 // * User must call XEEEndRead() when read is not longer
620 // * needed; I2C bus will released after XEEEndRead()
621 // * is called.
622 // ********************************************************************/
623 //unsigned char XEERead(void)
624 //{
625 // volatile BYTE i;
626 //
627 // if(NeedEndWrite)
628 // while(1);
629 // if(!NeedEndRead)
630 // while(1);
631 //
632 // if(NeedACK)
633 // {
634 // NeedACK = FALSE;
635 // I2CBIT_ACKDT = 0;
636 // I2CBIT_ACKEN = 1;
637 // while(I2CBIT_ACKEN);
638 // }
639 //
640 // // Receive a byte
641 // I2CBIT_RCEN = 1;
642 // while(I2CBIT_RCEN);
643 // NeedACK = TRUE;
644 //
645 // i = I2C_DATA_IN;
646 // return i;
647 //}
648 //
649 ///*********************************************************************
650 // * Function: XEE_RESULT XEEEndRead(void)
651 // *
652 // * PreCondition: XEEInit() && XEEBeginRead() are already called.
653 // *
654 // * Input: None
655 // *
656 // * Output: XEE_SUCCESS if successful
657 // * other value if failed.
658 // *
659 // * Side Effects: None
660 // *
661 // * Overview: Ends sequential read cycle.
662 // *
663 // * Note: This function ends seuential cycle that was in
664 // * progress. It releases I2C bus.
665 // ********************************************************************/
666 //XEE_RESULT XEEEndRead(void)
667 //{
668 // if(NeedEndWrite)
669 // while(1);
670 // if(!NeedEndRead)
671 // while(1);
672 //
673 // NeedEndRead = FALSE;
674 //
675 // // Send a NACK to complete the read
676 // I2CBIT_ACKDT = 1;
677 // I2CBIT_ACKEN = 1;
678 // while(I2CBIT_ACKEN);
679 // NeedACK = FALSE;
680 //
681 // // Generate a STOP condition
682 // I2CBIT_PEN = 1;
683 // while(I2CBIT_PEN);
684 //
685 // return XEE_SUCCESS;
686 //}
687 //
688 //
689 ///*********************************************************************
690 // * Function: XEE_RESULT XEEReadArray(XEE_ADDR address,
691 // * unsigned char *buffer,
692 // * unsigned char length)
693 // *
694 // * PreCondition: XEEInit() is already called.
695 // *
696 // * Input: control - EEPROM control and address code.
697 // * address - Address from where array is to be read
698 // * buffer - Caller supplied buffer to hold the data
699 // * length - Number of bytes to read.
700 // *
701 // * Output: XEE_SUCCESS if successful
702 // * other value if failed.
703 // *
704 // * Side Effects: None
705 // *
706 // * Overview: Reads desired number of bytes in sequential mode.
707 // * This function performs all necessary steps
708 // * and releases the bus when finished.
709 // *
710 // * Note: None
711 // ********************************************************************/
712 //XEE_RESULT XEEReadArray(BYTE control, XEE_ADDR address,
713 // unsigned char *buffer,
714 // unsigned char length)
715 //{
716 // XEEBeginRead(0, address);
717 // while(length--)
718 // *buffer++ = XEERead();
719 // XEEEndRead();
720 //
721 // return XEE_SUCCESS;
722 //}
723 //
724 //
725 ///*********************************************************************
726 // * Function: BOOL XEEIsBusy(void)
727 // *
728 // * PreCondition: XEEInit() is already called.
729 // *
730 // * Input: None
731 // *
732 // * Output: FALSE if EEPROM is not busy
733 // * TRUE if EEPROM is busy or operation failed
734 // *
735 // * Side Effects: None
736 // *
737 // * Overview: Requests ACK from EEPROM.
738 // *
739 // * Note: None
740 // ********************************************************************/
741 //BOOL XEEIsBusy(BYTE control)
742 //{
743 // if(NeedEndWrite)
744 // while(1);
745 // if(NeedEndRead)
746 // while(1);
747 //
748 // // Generate a start condition
749 // I2CBIT_SEN = 1;
750 // while(I2CBIT_SEN);
751 //
752 // // Send "control" byte with device address to slave
753 // do
754 // {
755 // I2CBIT_IWCOL = 0;
756 // I2C_DATA_OUT = EEPROM_CONTROL | WRITE;
757 // } while(I2CBIT_IWCOL);
758 // while(I2CBIT_TRSTAT);
759 //
760 // // Generate a STOP condition
761 // I2CBIT_PEN = 1;
762 // while(I2CBIT_PEN);
763 //
764 // return I2CBIT_ACKSTAT;
765 //}
766 //
767
768 #endif //#if defined(MPFS_USE_EEPROM) && defined(EEPROM_SCL_TRIS) && defined(STACK_USE_MPFS)

  ViewVC Help
Powered by ViewVC 1.1.20