00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "pic24_all.h"
00031
00038 #define EEPROM 0xA0 //LC515 address assuming both address pins tied low.
00039 #define BLKSIZE 64
00040
00041
00042 void waitForWriteCompletion(uint8 u8_i2cAddr) {
00043 uint8 u8_ack, u8_savedSWDTEN;
00044 u8_savedSWDTEN = _SWDTEN;
00045 _SWDTEN = 1;
00046 u8_i2cAddr = I2C_WADDR(u8_i2cAddr);
00047 do {
00048 startI2C1();
00049 u8_ack = putNoAckCheckI2C1(u8_i2cAddr);
00050 stopI2C1();
00051 } while (u8_ack == I2C_NAK);
00052 _SWDTEN = u8_savedSWDTEN;
00053 }
00054
00055 void memWriteLC515(uint8 u8_i2cAddr, uint16 u16_MemAddr, uint8 *pu8_buf) {
00056 uint8 u8_AddrLo, u8_AddrHi;
00057
00058 u8_AddrLo = u16_MemAddr & 0x00FF;
00059 u8_AddrHi = (u16_MemAddr >> 8);
00060 pu8_buf[0] = u8_AddrHi;
00061 pu8_buf[1] = u8_AddrLo;
00062
00063 if (u16_MemAddr & 0x8000) {
00064
00065 u8_i2cAddr = u8_i2cAddr | 0x08;
00066 }
00067 waitForWriteCompletion(u8_i2cAddr);
00068 writeNI2C1(u8_i2cAddr,pu8_buf,BLKSIZE+2);
00069 }
00070
00071 void memReadLC515(uint8 u8_i2cAddr, uint16 u16_MemAddr, uint8 *pu8_buf) {
00072
00073 uint8 u8_AddrLo, u8_AddrHi;
00074
00075 u8_AddrLo = u16_MemAddr & 0x00FF;
00076 u8_AddrHi = (u16_MemAddr >> 8);
00077
00078 if (u16_MemAddr & 0x8000) {
00079
00080 u8_i2cAddr = u8_i2cAddr | 0x08;
00081 }
00082 waitForWriteCompletion(u8_i2cAddr);
00083
00084 write2I2C1(u8_i2cAddr,u8_AddrHi, u8_AddrLo);
00085
00086 readNI2C1(u8_i2cAddr,pu8_buf, BLKSIZE);
00087 }
00088
00089
00090 int main (void) {
00091 uint8 au8_buf[64+2];
00092 uint16 u16_MemAddr;
00093 uint8 u8_Mode;
00094
00095 configBasic(HELLO_MSG);
00096 configI2C1(400);
00097 outString("\nEnter 'w' for write mode, anything else reads: ");
00098 u8_Mode = inCharEcho();
00099 outString("\n");
00100 u16_MemAddr = 0;
00101 while (1) {
00102 uint8 u8_i;
00103 if (u8_Mode == 'w') {
00104 outString("Enter 64 chars.\n");
00105
00106 for (u8_i = 2;u8_i< 64+2;u8_i++) {
00107 au8_buf[u8_i] = inCharEcho();
00108 }
00109 outString("\nDoing Write\n");
00110
00111 memWriteLC515(EEPROM,u16_MemAddr, au8_buf);
00112 u16_MemAddr = u16_MemAddr +64;
00113 memWriteLC515(EEPROM,u16_MemAddr,au8_buf);
00114 u16_MemAddr = u16_MemAddr +64;
00115 } else {
00116 memReadLC515(EEPROM,u16_MemAddr,au8_buf);
00117 for (u8_i = 0;u8_i< 64;u8_i++) outChar(au8_buf[u8_i]);
00118 outString("\nAny key continues read...\n");
00119 inChar();
00120 u16_MemAddr = u16_MemAddr + 64;
00121 }
00122 }
00123 }