00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <p24FJ64GA002.h>
00025
00026 #include "types.h"
00027
00028 #include "librtc.h"
00029 #include "libeeprom.h"
00030
00031
00032
00033
00034
00035
00036 #define EEPROM_TX_SET() TRISBbits.TRISB3 = 0; TRISBbits.TRISB2 = 0;
00037 #define EEPROM_RX_SET() TRISBbits.TRISB3 = 0; TRISBbits.TRISB2 = 1;
00038 #define EEPROM_SCL LATBbits.LATB3
00039 #define EEPROM_SDA_READ PORTBbits.RB2
00040 #define EEPROM_SDA_WRITE LATBbits.LATB2
00041 #define EEPROM_AD_PIN LATAbits.LATA3
00042 #define EEPROM_AE_PIN LATAbits.LATA2
00043
00044
00045
00046 #define EEPROM_HIGH 1
00047 #define EEPROM_LOW 0
00048
00049
00050 #define EEPROM_A0 0x0001
00051 #define EEPROM_A1 0x0002
00052 #define EEPROM_A2 0x0004
00053 #define EEPROM_A3 0x0008
00054 #define EEPROM_A4 0x0010
00055 #define EEPROM_A5 0x0020
00056 #define EEPROM_A6 0x0040
00057 #define EEPROM_A7 0x0080
00058 #define EEPROM_A8 0x0100
00059 #define EEPROM_A9 0x0200
00060 #define EEPROM_AA 0x0400
00061 #define EEPROM_AB 0x0800
00062 #define EEPROM_AC 0x1000
00063 #define EEPROM_AD 0x2000
00064 #define EEPROM_AE 0x4000
00065 #define EEPROM_AF 0x8000
00066
00067 #define EEPROM_MASK(x,y) ((x & y) ? EEPROM_HIGH : EEPROM_LOW)
00068
00069
00070
00071
00072
00073 static void EEPROM_start(void);
00074 static void EEPROM_stop(void);
00075 static void EEPROM_TX_pulse(unsigned char sda);
00076 static unsigned char EEPROM_RX_pulse(void);
00077 static void EEPROM_wait(void);
00078
00079
00080
00081
00082
00083 void EEPROM_init(void)
00084 {
00085 EEPROM_RX_SET();
00086 EEPROM_SCL = EEPROM_HIGH;
00087
00088
00089 EEPROM_AD_PIN = EEPROM_LOW;
00090 EEPROM_AE_PIN = EEPROM_LOW;
00091
00092
00093 return;
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 int EEPROM_read(unsigned int ptr)
00107 {
00108 unsigned char data;
00109
00110
00111 EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00112 EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00113
00114 EEPROM_start();
00115
00116
00117 EEPROM_TX_pulse(EEPROM_HIGH);
00118 EEPROM_TX_pulse(EEPROM_LOW);
00119 EEPROM_TX_pulse(EEPROM_HIGH);
00120 EEPROM_TX_pulse(EEPROM_LOW);
00121
00122 EEPROM_TX_pulse(EEPROM_LOW);
00123 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00124 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00125 EEPROM_TX_pulse(EEPROM_LOW);
00126 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00127
00128
00129 EEPROM_TX_pulse(EEPROM_LOW);
00130 EEPROM_TX_pulse(EEPROM_LOW);
00131 EEPROM_TX_pulse(EEPROM_LOW);
00132 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00133 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00134 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00135 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00136 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00137 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00138
00139
00140 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00141 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00142 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00143 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00144 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00145 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00146 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00147 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00148 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00149
00150
00151 EEPROM_start();
00152
00153
00154 EEPROM_TX_pulse(EEPROM_HIGH);
00155 EEPROM_TX_pulse(EEPROM_LOW);
00156 EEPROM_TX_pulse(EEPROM_HIGH);
00157 EEPROM_TX_pulse(EEPROM_LOW);
00158
00159 EEPROM_TX_pulse(EEPROM_LOW);
00160 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00161 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00162 EEPROM_TX_pulse(EEPROM_HIGH);
00163 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00164
00165
00166 data = 0;
00167 data += EEPROM_RX_pulse() << 7;
00168 data += EEPROM_RX_pulse() << 6;
00169 data += EEPROM_RX_pulse() << 5;
00170 data += EEPROM_RX_pulse() << 4;
00171 data += EEPROM_RX_pulse() << 3;
00172 data += EEPROM_RX_pulse() << 2;
00173 data += EEPROM_RX_pulse() << 1;
00174 data += EEPROM_RX_pulse();
00175 EEPROM_TX_pulse(EEPROM_HIGH);
00176
00177 EEPROM_stop();
00178 return(data);
00179
00180
00181 READ_ERROR:
00182 EEPROM_stop();
00183 return(-1);
00184
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 BOOL EEPROM_write(unsigned int ptr, unsigned char buf)
00200 {
00201 unsigned int wait;
00202
00203
00204 EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00205 EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00206
00207 EEPROM_start();
00208
00209
00210 EEPROM_TX_pulse(EEPROM_HIGH);
00211 EEPROM_TX_pulse(EEPROM_LOW);
00212 EEPROM_TX_pulse(EEPROM_HIGH);
00213 EEPROM_TX_pulse(EEPROM_LOW);
00214
00215 EEPROM_TX_pulse(EEPROM_LOW);
00216 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00217 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00218 EEPROM_TX_pulse(EEPROM_LOW);
00219 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00220
00221
00222 EEPROM_TX_pulse(EEPROM_LOW);
00223 EEPROM_TX_pulse(EEPROM_LOW);
00224 EEPROM_TX_pulse(EEPROM_LOW);
00225 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00226 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00227 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00228 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00229 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00230 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00231
00232
00233 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00234 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00235 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00236 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00237 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00238 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00239 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00240 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00241 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00242
00243
00244 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A7));
00245 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A6));
00246 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A5));
00247 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A4));
00248 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A3));
00249 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A2));
00250 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A1));
00251 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A0));
00252 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00253
00254 EEPROM_stop();
00255
00256
00257 wait = rtc.tick;
00258 while(RTC_get_ticks(wait, rtc.tick) < 100);
00259
00260 return(TRUE);
00261
00262 WRITE_ERROR:
00263 EEPROM_stop();
00264 return(FALSE);
00265 }
00266
00267
00268
00269
00270
00271 static void EEPROM_start(void)
00272 {
00273 EEPROM_TX_SET();
00274
00275 EEPROM_SDA_WRITE = EEPROM_HIGH;
00276 EEPROM_SCL = EEPROM_HIGH;
00277 EEPROM_wait();
00278 EEPROM_SDA_WRITE = EEPROM_LOW;
00279 EEPROM_SCL = EEPROM_LOW;
00280 EEPROM_wait();
00281
00282 EEPROM_RX_SET();
00283 return;
00284 }
00285
00286
00287
00288
00289
00290 static void EEPROM_stop(void)
00291 {
00292 EEPROM_TX_SET();
00293
00294 EEPROM_SCL = EEPROM_LOW;
00295 EEPROM_SDA_WRITE = EEPROM_LOW;
00296 EEPROM_wait();
00297 EEPROM_SCL = EEPROM_HIGH;
00298 EEPROM_SDA_WRITE = EEPROM_HIGH;
00299 EEPROM_wait();
00300
00301 EEPROM_RX_SET();
00302 return;
00303 }
00304
00305
00306
00307
00308
00309
00310
00311
00312 static void EEPROM_TX_pulse(unsigned char sda)
00313 {
00314 EEPROM_TX_SET();
00315
00316 EEPROM_SDA_WRITE = sda;
00317 EEPROM_SCL = EEPROM_HIGH;
00318 EEPROM_wait();
00319 EEPROM_SCL = EEPROM_LOW;
00320 EEPROM_wait();
00321
00322 EEPROM_RX_SET();
00323 return;
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333 static unsigned char EEPROM_RX_pulse(void)
00334 {
00335 unsigned char buf;
00336
00337 EEPROM_RX_SET();
00338
00339 EEPROM_SCL = EEPROM_HIGH;
00340 EEPROM_wait();
00341 buf = EEPROM_SDA_READ;
00342 EEPROM_SCL = EEPROM_LOW;
00343 EEPROM_wait();
00344
00345 return(buf);
00346 }
00347
00348
00349
00350
00351
00352 static void EEPROM_wait(void)
00353 {
00354 Nop();
00355 Nop();
00356 Nop();
00357 Nop();
00358 Nop();
00359 Nop();
00360 Nop();
00361 Nop();
00362 Nop();
00363 Nop();
00364 Nop();
00365 Nop();
00366 Nop();
00367 Nop();
00368 Nop();
00369 Nop();
00370 Nop();
00371 Nop();
00372 return;
00373 }