00001 #include "includes.h"
00002
00003 #define DELAYTIME 1000
00004 #define TIMEOUT (15625*10)
00005 #define IICBUFSIZE 0x20
00006 enum {WRDATA=1,POLLACK,RDDATA,SETRDADDR};
00007 void F_IicInit(void);
00008 void F_IicWrite(U32 slvAddr,U32 addr,U8 data);
00009 void F_IicRead(U32 slvAddr,U32 addr,U8 *data);
00010 void F_IicPollingSet(void);
00011 void F_IicPolling(void);
00012
00013 static U8 _iicData[IICBUFSIZE];
00014 static volatile int _iicDataCount;
00015 static volatile int _iicStatus;
00016 static volatile int _iicMode;
00017 static int _iicPt;
00018
00019 void F_IicInit(void){
00020 rGPEUP |= 0xc000;
00021 rGPECON = (rGPECON&~0xf0000000) | 0xa0000000;
00022
00023
00024
00025 rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
00026 rIICADD = 0x10;
00027 rIICSTAT = 0x10;
00028
00029
00030 }
00031 void F_IicDelay(U32 i){
00032 if(i==0) for(i=0;i<10000;i++);
00033 else if(i==1) for(i=0;i<1000;i++);
00034 else if(i==2) for(i=0;i<100;i++);
00035 }
00036 void F_IicWrite(U32 slvAddr,U32 addr,U8 data){
00037 ulong timeout;
00038
00039 _iicMode = WRDATA;
00040 _iicPt = 0;
00041 _iicData[0] = (U8)addr;
00042 _iicData[1] = data;
00043 _iicDataCount = 2;
00044 rIICDS = slvAddr;
00045 rIICSTAT = 0xf0;
00046 timeout = 0x100000;
00047 while(_iicDataCount!=-1) {
00048 F_IicPollingSet();
00049 if(timeout!=0) timeout--;
00050 if (timeout==0) break;
00051 }
00052 rIICSTAT = 0xd0;
00053 rIICCON = 0xaf;
00054 F_IicDelay(0);
00055 }
00056
00057 void F_IicRead(U32 slvAddr,U32 addr,U8 *data)
00058 {
00059 ulong timeout;
00060
00061 _iicMode = SETRDADDR;
00062 _iicPt = 0;
00063 _iicData[0] = (U8)addr;
00064 _iicDataCount = 1;
00065
00066 rIICDS = slvAddr;
00067 rIICSTAT = 0xf0;
00068
00069
00070 timeout = 0x100000;
00071 while(_iicDataCount!=-1) {
00072 F_IicPollingSet();
00073 if(timeout!=0) timeout--;
00074 if (timeout==0) break;
00075 }
00076 _iicMode = RDDATA;
00077 _iicPt = 0;
00078 _iicDataCount = 1;
00079 rIICDS = slvAddr;
00080 rIICSTAT = 0xb0;
00081 rIICCON = 0xaf;
00082 timeout = 0x100000;
00083 while(_iicDataCount!=-1) {
00084 F_IicPollingSet();
00085 if(timeout!=0) timeout--;
00086 if (timeout==0) break;
00087 }
00088 *data = _iicData[1];
00089 F_IicDelay(0);
00090 }
00091
00092 void F_IicPollingSet(void)
00093 {
00094 if(rIICCON & 0x10) {
00095 F_IicPolling();
00096 }
00097 }
00098
00099 void F_IicPolling(void)
00100 {
00101 U32 iicSt,i;
00102
00103 iicSt = rIICSTAT;
00104 if(iicSt & 0x8){}
00105 if(iicSt & 0x4){}
00106 if(iicSt & 0x2){}
00107 if(iicSt & 0x1){}
00108
00109
00110
00111 switch(_iicMode)
00112 {
00113 case POLLACK:
00114 _iicStatus = iicSt;
00115 break;
00116
00117 case RDDATA:
00118 if((_iicDataCount--)==0)
00119 {
00120 _iicData[_iicPt++] = rIICDS;
00121
00122 rIICSTAT = 0x90;
00123 rIICCON = 0xaf;
00124
00125
00126 F_IicDelay(1);
00127
00128
00129 break;
00130 }
00131 _iicData[_iicPt++] = rIICDS;
00132
00133 if((_iicDataCount)==0)
00134 rIICCON = 0x2f;
00135 else
00136 rIICCON = 0xaf;
00137 break;
00138
00139 case WRDATA:
00140 if((_iicDataCount--)==0)
00141 {
00142 rIICSTAT = 0xd0;
00143 rIICCON = 0xaf;
00144
00145 F_IicDelay(1);
00146
00147 break;
00148 }
00149 rIICDS = _iicData[_iicPt++];
00150 for(i=0;i<100;i++);
00151 rIICCON = 0xaf;
00152 break;
00153
00154 case SETRDADDR:
00155
00156 if((_iicDataCount--)==0)
00157 {
00158 F_IicDelay(1);
00159 break;
00160 }
00161 rIICDS = _iicData[_iicPt++];
00162 for(i=0;i<100;i++);
00163 rIICCON = 0xaf;
00164 break;
00165
00166 default:
00167 break;
00168 }
00169 }
00170
00171
00172
00173
00174