OSDN Git Service

[UI][Help][v2.0] Add version string and copyright.
[openi2cradio/OpenI2CRadio.git] / i2c_eeprom.c
index c91c654..cace0ba 100644 (file)
 
 #include "i2c_eeprom.h"
 
-static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned char page_hi, unsigned char page_lo, unsigned char *data)
+static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int size)
 {
     unsigned char i;
     unsigned char *p = data;
+    unsigned char page_hi = addr >> 8;
+    unsigned char page_lo = addr & 0xff;
 
 #ifdef __SDCC
     i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
@@ -45,31 +47,43 @@ static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned cha
     I2C_STOP();
     i2c_close();
 #else
+    if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
     OpenI2C(MASTER, SLEW_ON);
     SSPADD = 0x5;
     IdleI2C();
     StartI2C();
- //   while (SSPCON2bits.SEN);
+    while(SSPCON2bits.SEN);
+
     WriteI2C(i2caddr & 0xfe);
-//    while(SSPCON2bits.SEN);
+    while(SSPCON2bits.ACKSTAT);
+
     WriteI2C(page_hi);
-//    while(SSPCON2bits.SEN);
+    while(SSPCON2bits.ACKSTAT);
+
     WriteI2C(page_lo);
+    while(SSPCON2bits.ACKSTAT);
 
-//   IdleI2C();
-   for(i = 0; i < 32; i++){
-        WriteI2C(*p);
-        IdleI2C();
-        p++;
+    if(!SSPCON2bits.ACKSTAT){
+        for(i = 0; i < size ; i++){
+            if(SSPCON1bits.SSPM3) {
+                WriteI2C(*p);
+                while(SSPCON2bits.ACKSTAT);
+            IdleI2C();
+            p++;
+            }
+        }
     }
     StopI2C();
+    while (SSPCON2bits.PEN);
+    idle_time_ms(2);
     do {
         StartI2C();
         WriteI2C(i2caddr & 0xfe);
         idle_time_ms(1);
     } while(SSPCON2bits.ACKSTAT);
-//    StopI2C();
-//    while (SSPCON2bits.PEN);
+    StopI2C();
+    while (SSPCON2bits.PEN);
+
     CloseI2C();
 #endif  //    i2c_idle();
     return 0xff;
@@ -94,23 +108,30 @@ unsigned char i2c_eeprom_bytewrite(unsigned char i2caddr, unsigned int addr, uns
     OpenI2C(MASTER, SLEW_ON);
     SSPADD = 5; // 100KHz
     IdleI2C();
-//    StartI2C();
-//    do {
-//        idle_time_ms(1);
-        StartI2C();
-        while(SSPCON2bits.SEN);
-        WriteI2C(i2caddr & 0xfe);
-        while(SSPCON2bits.ACKSTAT);
-//    WriteI2C(i2caddr & 0xfe);
+    StartI2C();
+    while(SSPCON2bits.SEN);
+
+    WriteI2C(i2caddr & 0xfe);
+    while(SSPCON2bits.ACKSTAT);
+
     WriteI2C(page_hi);
     while(SSPCON2bits.ACKSTAT);
+
     WriteI2C(page_lo);
     while(SSPCON2bits.ACKSTAT);
+
     WriteI2C(data);
     while(SSPCON2bits.ACKSTAT);
+
     StopI2C();
     while(SSPCON2bits.PEN);
-   // idle_time_ms(1);
+    do {
+        StartI2C();
+        WriteI2C(i2caddr & 0xfe);
+        idle_time_ms(1);
+    } while(SSPCON2bits.ACKSTAT);
+    StopI2C();
+    while (SSPCON2bits.PEN);
     CloseI2C();
 #endif  //    i2c_idle();
     return 0xff;
@@ -119,29 +140,41 @@ unsigned char i2c_eeprom_bytewrite(unsigned char i2caddr, unsigned int addr, uns
 
 unsigned char i2c_eeprom_burstwrite(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int bytes)
 {
-    unsigned char page_hi;
-    unsigned char page_lo;
-    int b = bytes;
-
-    while(b > 0){
-//        page_hi = addr >> 8;
-//        page_lo = addr & 0xff;
-//        i2c_eeprom_write_1block(i2caddr,  page_hi, page_lo, data);
-        i2c_eeprom_bytewrite(i2caddr,  addr, *data);
-        idle_time_ms(15);
-
-        addr += 1;
-        data += 1;
-        b -= 1;
+    unsigned int b = bytes;
+    unsigned int bb;
+    unsigned char sts;
+
+    if((addr % I2C_ROM_PAGE_SIZE) != 0) {
+        bb = I2C_ROM_PAGE_SIZE - (addr % I2C_ROM_PAGE_SIZE);
+        if(b <= bb) bb = b;
+        sts = i2c_eeprom_write_1block(i2caddr, addr, data, bb);
+        if(sts == 0) return 0;
+        b -= bb;
+        addr += bb;
+        data += bb;
+    }
+
+    while(b >= I2C_ROM_PAGE_SIZE){
+        sts = i2c_eeprom_write_1block(i2caddr,  addr, data, I2C_ROM_PAGE_SIZE);
+//        idle_time_ms(15);
+        if(sts == 0) return 0;
+        addr += I2C_ROM_PAGE_SIZE;
+        data += I2C_ROM_PAGE_SIZE;
+        b -= I2C_ROM_PAGE_SIZE;
     }
+
+    if(b != 0){
+        sts = i2c_eeprom_write_1block(i2caddr,  addr, data, b);
+    }
+    return sts;
 }
 
 
-static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char page_hi, unsigned char page_lo, unsigned char *data)
+static unsigned char i2c_eeprom_read_1block(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int size)
 {
-    unsigned char c;
     unsigned char i;
-    unsigned char *p = data;
+    unsigned char page_hi = addr >> 8;
+    unsigned char page_lo = addr & 0xff;
 
   #ifdef __SDCC
     i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
@@ -153,41 +186,55 @@ static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char pa
 //   delay100tcy(2);
     I2C_START();
     i2c_writechar(addr | 0x01);
-    for(i = 0; i < 64; i++){
+    for(i = 0; i < I2C_ROM_PAGE_SIZE - 1 ; i++){
         *p = i2c_readchar();
         p++;
         I2C_ACK();
     }
+    *p = i2c_readchar();
+    I2C_NACK();
     I2C_STOP();
     i2c_close();
 #else
+    if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
     OpenI2C(MASTER, SLEW_ON);
     SSPADD = 0x5;
     StartI2C();
-    WriteI2C(addr & 0xfe);
+    while(SSPCON2bits.SEN);
+    WriteI2C(i2caddr & 0xfe);
   //  delay1ktcy(8);
+    while(SSPCON2bits.SEN);
     WriteI2C(page_hi);
+    while(SSPCON2bits.SEN);
     WriteI2C(page_lo);
+  //  delay1ktcy(8);
+    StopI2C();
+
     IdleI2C();
-    RestartI2C();
-    WriteI2C(addr | 0x01);
-//    IdleI2C();
-    for(i = 0; i < 32; i++){
-        if(!SSPCON2bits.ACKSTAT){
-              SSPCON2bits.RCEN = 1;
-              while(SSPCON2bits.RCEN);
-               NotAckI2C();
-               while (SSPCON2bits.ACKEN);
-               StopI2C();
-               while (SSPCON2bits.PEN);
-          }
-        *p = SSPBUF;
-        p++;
-        if(i < 31) AckI2C();
+    StartI2C();
+    WriteI2C(i2caddr | 1);
+
+    for(i = 0; i < size - 1 ;i++){
+       if (!SSPCON2bits.ACKSTAT){
+        SSPCON2bits.RCEN = 1;
+        while(SSPCON2bits.RCEN);
+         AckI2C();
+//          while (!SSPCON2bits.ACKEN);
+        *data = SSPBUF;
+         data++;
+        }
     }
-    NotAckI2C();
-//    IdleI2C();
-    StopI2C();
+
+    if (!SSPCON2bits.ACKSTAT){
+      SSPCON2bits.RCEN = 1;
+      while(SSPCON2bits.RCEN);
+      NotAckI2C();
+      while (SSPCON2bits.ACKEN);
+      StopI2C();
+      while (SSPCON2bits.PEN);
+    }
+    *data = SSPBUF;
+
     CloseI2C();
 #endif
     //    CLOSEASMASTER();
@@ -223,16 +270,16 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr)
     StartI2C();
     while(SSPCON2bits.SEN);
     WriteI2C(i2caddr);
-  //  delay1ktcy(8);
     while(SSPCON2bits.SEN);
     WriteI2C(page_hi);
     while(SSPCON2bits.SEN);
     WriteI2C(page_lo);
-  //  delay1ktcy(8);
     StopI2C();
+
     IdleI2C();
     StartI2C();
     WriteI2C(i2caddr | 1);
+
     if (!SSPCON2bits.ACKSTAT){
       SSPCON2bits.RCEN = 1;
       while(SSPCON2bits.RCEN);
@@ -242,8 +289,6 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr)
       while (SSPCON2bits.PEN);
     }
     c = SSPBUF;
-  //  delay1ktcy(8);
- //   delay1ktcy(8);
     CloseI2C();
 #endif
     //    CLOSEASMASTER();
@@ -253,21 +298,31 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr)
 
 unsigned char i2c_eeprom_burstread(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int bytes)
 {
-    unsigned char page_hi;
-    unsigned char page_lo;
-    int b = bytes;
-
-    while(b > 0){
- //       page_hi = addr >> 8;
- //       page_lo = addr & 0xff;
-        *data = i2c_eeprom_byteread(i2caddr,  addr);
-//        i2c_eeprom_read_1block(i2caddr, page_hi, page_lo, data);
-        idle_time_ms(1);
+    unsigned char sts;
+    unsigned int b = bytes;
+    unsigned int bb;
 
-        addr += 1;
-        data += 1;
-        b -= 1;
+    if((addr % I2C_ROM_PAGE_SIZE) != 0) {
+        bb = I2C_ROM_PAGE_SIZE - (addr % I2C_ROM_PAGE_SIZE);
+        if(b <= bb) bb = b;
+        sts = i2c_eeprom_read_1block(i2caddr, addr, data, bb);
+        b -= bb;
+        addr += bb;
+        data += bb;
+        if(sts == 0) return 0;
     }
 
-    return 0xff;
+    while(b >= I2C_ROM_PAGE_SIZE){
+        sts = i2c_eeprom_read_1block(i2caddr,  addr, data, I2C_ROM_PAGE_SIZE);
+//        idle_time_ms(15);
+        if(sts == 0) return 0;
+        addr += I2C_ROM_PAGE_SIZE;
+        data += I2C_ROM_PAGE_SIZE;
+        b -= I2C_ROM_PAGE_SIZE;
+    }
+
+    if(b != 0){
+        sts = i2c_eeprom_read_1block(i2caddr,  addr, data, b);
+    }
+    return sts;
 }