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
00084 void EEPROM_init(void)
00085 {
00086 EEPROM_RX_SET();
00087 EEPROM_SCL = EEPROM_HIGH;
00088
00089
00090 EEPROM_AD_PIN = EEPROM_LOW;
00091 EEPROM_AE_PIN = EEPROM_LOW;
00092
00093
00094 return;
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 int EEPROM_read(unsigned int ptr)
00108 {
00109 unsigned char data;
00110
00111
00112 EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00113 EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00114
00115 EEPROM_start();
00116
00117
00118 EEPROM_TX_pulse(EEPROM_HIGH);
00119 EEPROM_TX_pulse(EEPROM_LOW);
00120 EEPROM_TX_pulse(EEPROM_HIGH);
00121 EEPROM_TX_pulse(EEPROM_LOW);
00122
00123 EEPROM_TX_pulse(EEPROM_LOW);
00124 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00125 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00126 EEPROM_TX_pulse(EEPROM_LOW);
00127 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00128
00129
00130 EEPROM_TX_pulse(EEPROM_LOW);
00131 EEPROM_TX_pulse(EEPROM_LOW);
00132 EEPROM_TX_pulse(EEPROM_LOW);
00133 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00134 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00135 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00136 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00137 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00138 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00139
00140
00141 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00142 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00143 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00144 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00145 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00146 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00147 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00148 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00149 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00150
00151
00152 EEPROM_start();
00153
00154
00155 EEPROM_TX_pulse(EEPROM_HIGH);
00156 EEPROM_TX_pulse(EEPROM_LOW);
00157 EEPROM_TX_pulse(EEPROM_HIGH);
00158 EEPROM_TX_pulse(EEPROM_LOW);
00159
00160 EEPROM_TX_pulse(EEPROM_LOW);
00161 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00162 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00163 EEPROM_TX_pulse(EEPROM_HIGH);
00164 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;
00165
00166
00167 data = 0;
00168 data += EEPROM_RX_pulse() << 7;
00169 data += EEPROM_RX_pulse() << 6;
00170 data += EEPROM_RX_pulse() << 5;
00171 data += EEPROM_RX_pulse() << 4;
00172 data += EEPROM_RX_pulse() << 3;
00173 data += EEPROM_RX_pulse() << 2;
00174 data += EEPROM_RX_pulse() << 1;
00175 data += EEPROM_RX_pulse();
00176 EEPROM_TX_pulse(EEPROM_HIGH);
00177
00178 EEPROM_stop();
00179 return(data);
00180
00181
00182 READ_ERROR:
00183 EEPROM_stop();
00184 return(-1);
00185
00186 }
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 BOOL EEPROM_write(unsigned int ptr, unsigned char buf)
00201 {
00202 unsigned int wait;
00203
00204
00205 EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00206 EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00207
00208 EEPROM_start();
00209
00210
00211 EEPROM_TX_pulse(EEPROM_HIGH);
00212 EEPROM_TX_pulse(EEPROM_LOW);
00213 EEPROM_TX_pulse(EEPROM_HIGH);
00214 EEPROM_TX_pulse(EEPROM_LOW);
00215
00216 EEPROM_TX_pulse(EEPROM_LOW);
00217 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00218 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00219 EEPROM_TX_pulse(EEPROM_LOW);
00220 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00221
00222
00223 EEPROM_TX_pulse(EEPROM_LOW);
00224 EEPROM_TX_pulse(EEPROM_LOW);
00225 EEPROM_TX_pulse(EEPROM_LOW);
00226 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00227 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00228 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00229 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00230 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00231 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00232
00233
00234 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00235 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00236 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00237 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00238 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00239 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00240 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00241 EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00242 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00243
00244
00245 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A7));
00246 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A6));
00247 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A5));
00248 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A4));
00249 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A3));
00250 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A2));
00251 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A1));
00252 EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A0));
00253 if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;
00254
00255 EEPROM_stop();
00256
00257
00258 wait = rtc.tick;
00259 while(RTC_get_ticks(wait, rtc.tick) < 100);
00260
00261 return(TRUE);
00262
00263 WRITE_ERROR:
00264 EEPROM_stop();
00265 return(FALSE);
00266 }
00267
00268
00269
00270
00271
00272 static void EEPROM_start(void)
00273 {
00274 EEPROM_TX_SET();
00275
00276 EEPROM_SDA_WRITE = EEPROM_HIGH;
00277 EEPROM_SCL = EEPROM_HIGH;
00278 EEPROM_wait();
00279 EEPROM_SDA_WRITE = EEPROM_LOW;
00280 EEPROM_SCL = EEPROM_LOW;
00281 EEPROM_wait();
00282
00283 EEPROM_RX_SET();
00284 return;
00285 }
00286
00287
00288
00289
00290
00291 static void EEPROM_stop(void)
00292 {
00293 EEPROM_TX_SET();
00294
00295 EEPROM_SCL = EEPROM_LOW;
00296 EEPROM_SDA_WRITE = EEPROM_LOW;
00297 EEPROM_wait();
00298 EEPROM_SCL = EEPROM_HIGH;
00299 EEPROM_SDA_WRITE = EEPROM_HIGH;
00300 EEPROM_wait();
00301
00302 EEPROM_RX_SET();
00303 return;
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313 static void EEPROM_TX_pulse(unsigned char sda)
00314 {
00315 EEPROM_TX_SET();
00316
00317 EEPROM_SDA_WRITE = sda;
00318 EEPROM_SCL = EEPROM_HIGH;
00319 EEPROM_wait();
00320 EEPROM_SCL = EEPROM_LOW;
00321 EEPROM_wait();
00322
00323 EEPROM_RX_SET();
00324 return;
00325 }
00326
00327
00328
00329
00330
00331
00332
00333
00334 static unsigned char EEPROM_RX_pulse(void)
00335 {
00336 unsigned char buf;
00337
00338 EEPROM_RX_SET();
00339
00340 EEPROM_SCL = EEPROM_HIGH;
00341 EEPROM_wait();
00342 buf = EEPROM_SDA_READ;
00343 EEPROM_SCL = EEPROM_LOW;
00344 EEPROM_wait();
00345
00346 return(buf);
00347 }
00348
00349
00350
00351
00352
00353 static void EEPROM_wait(void)
00354 {
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 Nop();
00373 return;
00374 }