OSDN Git Service

[I2C_ROM] Block Write/Block Read even unaligned address and size.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 26 Aug 2013 13:01:41 +0000 (22:01 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 26 Aug 2013 13:01:41 +0000 (22:01 +0900)
i2c_eeprom.c
menu_memoryfreq.c

index e1cd425..9046628 100644 (file)
 #define I2C_ROM_PAGE_SIZE 32
 
 
-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);
@@ -48,6 +50,7 @@ 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();
@@ -64,25 +67,25 @@ static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned cha
     while(SSPCON2bits.ACKSTAT);
 
     if(!SSPCON2bits.ACKSTAT){
-        for(i = 0; i < I2C_ROM_PAGE_SIZE; i++){
+        for(i = 0; i < size ; i++){
             if(SSPCON1bits.SSPM3) {
                 WriteI2C(*p);
                 while(SSPCON2bits.ACKSTAT);
-//            IdleI2C();
+            IdleI2C();
             p++;
             }
         }
     }
     StopI2C();
     while (SSPCON2bits.PEN);
-//    idle_time_ms(10);
-//    do {
-//        StartI2C();
-//        WriteI2C(i2caddr & 0xfe);
-//        idle_time_ms(1);
-//    } while(SSPCON2bits.ACKSTAT);
-//    StopI2C();
-//    while (SSPCON2bits.PEN);
+    idle_time_ms(2);
+    do {
+        StartI2C();
+        WriteI2C(i2caddr & 0xfe);
+        idle_time_ms(1);
+    } while(SSPCON2bits.ACKSTAT);
+    StopI2C();
+    while (SSPCON2bits.PEN);
 
     CloseI2C();
 #endif  //    i2c_idle();
@@ -140,29 +143,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);
+    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);
+        b -= bb;
+        addr += bb;
+        data += bb;
+    }
+    if(sts == 0) return 0;
+
+    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;
+    }
 
-        addr += 1;
-        data += 1;
-        b -= 1;
+    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);
@@ -184,11 +199,12 @@ static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char pa
     I2C_STOP();
     i2c_close();
 #else
+    if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
     OpenI2C(MASTER, SLEW_ON);
     SSPADD = 0x5;
     StartI2C();
     while(SSPCON2bits.SEN);
-    WriteI2C(addr & 0xfe);
+    WriteI2C(i2caddr & 0xfe);
   //  delay1ktcy(8);
     while(SSPCON2bits.SEN);
     WriteI2C(page_hi);
@@ -199,16 +215,17 @@ static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char pa
 
     IdleI2C();
     StartI2C();
-    WriteI2C(addr | 1);
-    for(i = 0; i < I2C_ROM_PAGE_SIZE - 1 ;i++){
-        if (!SSPCON2bits.ACKSTAT){
-          SSPCON2bits.RCEN = 1;
-          while(SSPCON2bits.RCEN);
-          AckI2C();
+    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++;
-       }
+        *data = SSPBUF;
+         data++;
+        }
     }
 
     if (!SSPCON2bits.ACKSTAT){
@@ -261,9 +278,11 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr)
     while(SSPCON2bits.SEN);
     WriteI2C(page_lo);
     StopI2C();
+
     IdleI2C();
     StartI2C();
     WriteI2C(i2caddr | 1);
+
     if (!SSPCON2bits.ACKSTAT){
       SSPCON2bits.RCEN = 1;
       while(SSPCON2bits.RCEN);
@@ -282,21 +301,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;
+
+    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;
+    }
 
+    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;
     }
 
-    return 0xff;
+    if(b != 0){
+        sts = i2c_eeprom_read_1block(i2caddr,  addr, data, b);
+    }
+    return sts;
 }
index 0cadf42..af5f527 100644 (file)
@@ -184,14 +184,14 @@ void on_updown_userfreq(void)
                }
                call_freqbank(setup.memorynum);
                break;
-           case charcode_8: // Up CH FAST
+           case charcode_8: // Up CH MID
                setup.memorynum += USER_MEMORY_NUM;
                if(setup.memorynum >= (USER_MEMORY_NUM * USER_MEMORY_BANKS)) {
                     setup.memorynum = setup.memorynum - USER_MEMORY_NUM * USER_MEMORY_BANKS;
                }
                call_freqbank(setup.memorynum);
                break;
-           case charcode_2: // Down CH FAST
+           case charcode_2: // Down CH MID
                if(setup.memorynum < USER_MEMORY_NUM) {
                     setup.memorynum = (USER_MEMORY_NUM * USER_MEMORY_BANKS) - USER_MEMORY_NUM + setup.memorynum;
                } else {