1Mbit EEPROMを便利に使うためのライブラリ

Dependents:   EEPROM_Reset_Program EEPROM_Encode_Program SWAN_IZU2019_v1

Files at this revision

API Documentation at this revision

Comitter:
Sigma884
Date:
Mon Feb 11 15:41:56 2019 +0000
Child:
1:66c2c82f4b34
Commit message:
EEPROM library alpha

Changed in this revision

EEPROM_lib.cpp Show annotated file Show diff for this revision Revisions of this file
EEPROM_lib.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EEPROM_lib.cpp	Mon Feb 11 15:41:56 2019 +0000
@@ -0,0 +1,446 @@
+#include "mbed.h"
+#include "EEPROM_lib.h"
+
+EEPROM_lib::EEPROM_lib(I2C &user_i2c, int num){
+    i2c = &user_i2c;
+    i2c -> frequency(400000);
+    
+    //max_ptr = 1024 * 1024 * num - 1;
+    max_num = num;
+    buff_ptr = 0;
+    //eeprom_ptr = 0;
+    ptr[3] = ptr[2] = ptr[1] = ptr[0] = 0x00;
+}
+
+void EEPROM_lib::writeByte(int num, int block, char ADDR_H, char ADDR_L, char DATA){
+    if(num > max_num){
+        return;
+    }
+    switch(num){
+        case 1:
+        slave = EEPROM_ADDR_00_0;
+        break;
+        
+        case 2:
+        slave = EEPROM_ADDR_01_0;
+        break;
+        
+        case 3:
+        slave = EEPROM_ADDR_10_0;
+        break;
+        
+        case 4:
+        slave = EEPROM_ADDR_11_0;
+        break;
+    }
+    if(block == 1){
+        slave = slave | 0x08;
+    }
+    cmd[0] = ADDR_H;
+    cmd[1] = ADDR_L;
+    cmd[2] = DATA;
+    
+    i2c -> write(slave, cmd, 3);
+    wait_us(EEPROM_WAIT_US);
+}
+
+void EEPROM_lib::writePage(int num, int block, char ADDR_H, char ADDR_L, char *DATA){
+    if(num > max_num){
+        return;
+    }
+    switch(num){
+        case 1:
+        slave = EEPROM_ADDR_00_0;
+        break;
+        
+        case 2:
+        slave = EEPROM_ADDR_01_0;
+        break;
+        
+        case 3:
+        slave = EEPROM_ADDR_10_0;
+        break;
+        
+        case 4:
+        slave = EEPROM_ADDR_11_0;
+        break;
+    }
+    if(block == 1){
+        slave = slave | 0x08;
+    }
+    cmd[0] = ADDR_H;
+    cmd[1] = ADDR_L;
+    for(int i = 2; i < 130; i ++){
+        cmd[i] = DATA[i-2];
+    }
+    
+    i2c -> write(slave, cmd, 130);
+    wait_us(EEPROM_WAIT_US);
+}
+
+void EEPROM_lib::setWriteAddr(int num, int block, char ADDR_H, char ADDR_L){
+    if(num > max_num){
+        return;
+    }
+    switch(num){
+        case 1:
+        slave = EEPROM_ADDR_00_0;
+        break;
+        
+        case 2:
+        slave = EEPROM_ADDR_01_0;
+        break;
+        
+        case 3:
+        slave = EEPROM_ADDR_10_0;
+        break;
+        
+        case 4:
+        slave = EEPROM_ADDR_11_0;
+        break;
+    }
+    if(block == 1){
+        slave = slave | 0x08;
+    }
+    cmd[0] = ADDR_H;
+    cmd[1] = ADDR_L;
+}
+
+int EEPROM_lib::chargeBuff(char DATA){
+    //if(eeprom_ptr < max_ptr && buff_ptr < 128){
+    if(buff_ptr < 128){
+        EEPROM_cast.c = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[0];
+        
+        buff_ptr ++;
+        //eeprom_ptr ++;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(bool DATA){
+    //if(eeprom_ptr < max_ptr && buff_ptr < 128){
+    if(buff_ptr < 128){
+        EEPROM_cast.b = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[0];
+        
+        buff_ptr ++;
+        //eeprom_ptr ++;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(int DATA){
+    //if(eeprom_ptr < max_ptr - 3 && buff_ptr < 128 - 3){
+    if(buff_ptr < 128 - 3){
+        EEPROM_cast.i = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[3];
+        cmd[buff_ptr + 3] = EEPROM_cast.cast[2];
+        cmd[buff_ptr + 4] = EEPROM_cast.cast[1];
+        cmd[buff_ptr + 5] = EEPROM_cast.cast[0];
+        
+        buff_ptr += 4;
+        //eeprom_ptr += 4;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(short DATA){
+    //if(eeprom_ptr < max_ptr - 1 && buff_ptr < 128 - 1){
+    if(buff_ptr < 128 - 1){
+        EEPROM_cast.s = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[1];
+        cmd[buff_ptr + 3] = EEPROM_cast.cast[0];
+        
+        buff_ptr += 2;
+        //eeprom_ptr += 2;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(long long DATA){
+    //if(eeprom_ptr < max_ptr - 7 && buff_ptr < 128 - 7){
+    if(buff_ptr < 128 - 7){
+        EEPROM_cast.ll = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[7];
+        cmd[buff_ptr + 3] = EEPROM_cast.cast[6];
+        cmd[buff_ptr + 4] = EEPROM_cast.cast[5];
+        cmd[buff_ptr + 5] = EEPROM_cast.cast[4];
+        cmd[buff_ptr + 6] = EEPROM_cast.cast[3];
+        cmd[buff_ptr + 7] = EEPROM_cast.cast[2];
+        cmd[buff_ptr + 8] = EEPROM_cast.cast[1];
+        cmd[buff_ptr + 9] = EEPROM_cast.cast[0];
+        
+        buff_ptr += 8;
+        //eeprom_ptr += 8;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(float DATA){
+    //if(eeprom_ptr < max_ptr - 3 && buff_ptr < 128 - 3){
+    if(buff_ptr < 128 - 3){
+        EEPROM_cast.f = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[3];
+        cmd[buff_ptr + 3] = EEPROM_cast.cast[2];
+        cmd[buff_ptr + 4] = EEPROM_cast.cast[1];
+        cmd[buff_ptr + 5] = EEPROM_cast.cast[0];
+        
+        buff_ptr += 4;
+        //eeprom_ptr += 4;
+    }
+    return buff_ptr;
+}
+
+int EEPROM_lib::chargeBuff(double DATA){
+    //if(eeprom_ptr < max_ptr - 7 && buff_ptr < 128 - 7){
+    if(buff_ptr < 128 - 7){
+        EEPROM_cast.d = DATA;
+        cmd[buff_ptr + 2] = EEPROM_cast.cast[7];
+        cmd[buff_ptr + 3] = EEPROM_cast.cast[6];
+        cmd[buff_ptr + 4] = EEPROM_cast.cast[5];
+        cmd[buff_ptr + 5] = EEPROM_cast.cast[4];
+        cmd[buff_ptr + 6] = EEPROM_cast.cast[3];
+        cmd[buff_ptr + 7] = EEPROM_cast.cast[2];
+        cmd[buff_ptr + 8] = EEPROM_cast.cast[1];
+        cmd[buff_ptr + 9] = EEPROM_cast.cast[0];
+        
+        buff_ptr += 8;
+        //eeprom_ptr += 8;
+    }
+    return buff_ptr;
+}
+
+void EEPROM_lib::writeBuff(){
+    for(int i = buff_ptr+2; i < 130; i ++){
+        cmd[i] = 0x00;
+    }
+    i2c -> write(slave, cmd, 130);
+    wait_us(EEPROM_WAIT_US);
+    
+    buff_ptr = 0;
+}
+
+int EEPROM_lib::setNextPage(){
+    if(cmd[1] == 0x00){
+        cmd[1] = 0x80;
+        ptr[3] = cmd[1];
+    }
+    else{
+        cmd[1] = 0x00;
+        ptr[3] = cmd[1];
+        if(cmd[0] == 0xFF){
+            cmd[0] = 0x00;
+            ptr[2] = cmd[0];
+            switch(slave){
+                case EEPROM_ADDR_00_0:
+                slave = EEPROM_ADDR_00_1;
+                ptr[0] = 0x00;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_00_1:
+                slave = EEPROM_ADDR_01_0;
+                ptr[0] = 0x01;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_01_0:
+                slave = EEPROM_ADDR_01_1;
+                ptr[0] = 0x01;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_01_1:
+                slave = EEPROM_ADDR_10_0;
+                ptr[0] = 0x02;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_10_0:
+                slave = EEPROM_ADDR_10_1;
+                ptr[0] = 0x02;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_10_1:
+                slave = EEPROM_ADDR_11_0;
+                ptr[0] = 0x03;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_11_0:
+                slave = EEPROM_ADDR_11_1;
+                ptr[0] = 0x03;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_11_1:
+                slave = 0x00;
+                ptr[0] = 0x04;
+                ptr[1] = 0x00;
+            }
+        }
+        else{
+            cmd[0] ++;
+            ptr[2] = cmd[0];
+            switch(slave){
+                case EEPROM_ADDR_00_0:
+                ptr[0] = 0x00;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_00_1:
+                ptr[0] = 0x00;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_01_0:
+                ptr[0] = 0x01;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_01_1:
+                ptr[0] = 0x01;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_10_0:
+                ptr[0] = 0x02;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_10_1:
+                ptr[0] = 0x02;
+                ptr[1] = 0x01;
+                break;
+                
+                case EEPROM_ADDR_11_0:
+                ptr[0] = 0x03;
+                ptr[1] = 0x00;
+                break;
+                
+                case EEPROM_ADDR_11_1:
+                ptr[0] = 0x03;
+                ptr[1] = 0x01;
+                break;
+            }
+        }
+    }
+    
+    switch(max_num){
+        case 1:
+        if(ptr[0] > 0x00){
+            slave = 0x00;
+            cmd[0] = 0x00;
+            cmd[1] = 0x00;
+            ptr[0] = 0x01;
+            ptr[1] = 0x00;
+            ptr[2] = 0x00;
+            ptr[3] = 0x00;
+        }
+        break;
+        
+        case 2:
+        if(ptr[0] > 0x01){
+            slave = 0x00;
+            cmd[0] = 0x00;
+            cmd[1] = 0x00;
+            ptr[0] = 0x02;
+            ptr[1] = 0x00;
+            ptr[2] = 0x00;
+            ptr[3] = 0x00;
+        }
+        break;
+        
+        case 3:
+        if(ptr[0] > 0x02){
+            slave = 0x00;
+            cmd[0] = 0x00;
+            cmd[1] = 0x00;
+            ptr[0] = 0x03;
+            ptr[1] = 0x00;
+            ptr[2] = 0x00;
+            ptr[3] = 0x00;
+        }
+        break;
+        
+        case 4:
+        if(ptr[0] > 0x03){
+            slave = 0x00;
+            cmd[0] = 0x00;
+            cmd[1] = 0x00;
+            ptr[0] = 0x04;
+            ptr[1] = 0x00;
+            ptr[2] = 0x00;
+            ptr[3] = 0x00;
+        }
+        break;
+    }
+    
+    return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
+}
+
+char EEPROM_lib::readByte(int num, int block, char ADDR_H, char ADDR_L){
+    if(num > max_num){
+        return 0x00;
+    }
+    switch(num){
+        case 1:
+        slave = EEPROM_ADDR_00_0;
+        break;
+        
+        case 2:
+        slave = EEPROM_ADDR_01_0;
+        break;
+        
+        case 3:
+        slave = EEPROM_ADDR_10_0;
+        break;
+        
+        case 4:
+        slave = EEPROM_ADDR_11_0;
+        break;
+    }
+    if(block == 1){
+        slave = slave | 0x08;
+    }
+    cmd[0] = ADDR_H;
+    cmd[1] = ADDR_L;
+    
+    i2c -> write(slave, cmd, 2);
+    i2c -> read(slave | 1, cmd, 1);
+    
+    return cmd[0];
+}
+
+void EEPROM_lib::readMultiByte(int num, int block, char ADDR_H, char ADDR_L, char *DATA, int size){
+    if(num > max_num){
+        return;
+    }
+    switch(num){
+        case 1:
+        slave = EEPROM_ADDR_00_0;
+        break;
+        
+        case 2:
+        slave = EEPROM_ADDR_01_0;
+        break;
+        
+        case 3:
+        slave = EEPROM_ADDR_10_0;
+        break;
+        
+        case 4:
+        slave = EEPROM_ADDR_11_0;
+        break;
+    }
+    if(block == 1){
+        slave = slave | 0x08;
+    }
+    cmd[0] = ADDR_H;
+    cmd[1] = ADDR_L;
+    
+    i2c -> write(slave, cmd, 2);
+    i2c -> read(slave | 1, DATA, size);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EEPROM_lib.h	Mon Feb 11 15:41:56 2019 +0000
@@ -0,0 +1,71 @@
+#ifndef EEPROM_LIB_H_
+#define EEPROM_LIB_H_
+
+#define EEPROM_ADDR_00_0 0xA0
+#define EEPROM_ADDR_00_1 0xA8
+
+#define EEPROM_ADDR_01_0 0xA2
+#define EEPROM_ADDR_01_1 0xAA
+
+#define EEPROM_ADDR_10_0 0xA4
+#define EEPROM_ADDR_10_1 0xAC
+
+#define EEPROM_ADDR_11_0 0xA6
+#define EEPROM_ADDR_11_1 0xAE
+
+#define EEPROM_WAIT_US 2500
+
+
+class EEPROM_lib{
+    public:
+    
+    EEPROM_lib(I2C &user_i2c, int num);
+    
+    void writeByte(int num, int block, char ADDR_H, char ADDR_L, char DATA);
+    void writePage(int num, int block, char ADDR_H, char ADDR_L, char *DATA);
+    
+    void setWriteAddr(int num, int block, char ADDR_H, char ADDR_L);
+    
+    int chargeBuff(char DATA);
+    int chargeBuff(bool DATA);
+    int chargeBuff(int DATA);
+    int chargeBuff(short DATA);
+    int chargeBuff(long long DATA);
+    int chargeBuff(float DATA);
+    int chargeBuff(double DATA);
+    
+    void writeBuff();
+    
+    int setNextPage();
+    
+    char readByte(int num, int block, char ADDR_H, char ADDR_L);
+    void readMultiByte(int num, int block, char ADDR_H, char ADDR_L, char *DATA, int size);
+    
+    
+    private:
+    I2C *i2c;
+    char slave;
+    
+    union EEPROM_CAST{
+        long long ll;
+        int i;
+        short s;
+        float f;
+        double d;
+        char c;
+        bool b;
+        char cast[8];
+    };
+    union EEPROM_CAST EEPROM_cast;
+    
+    char cmd[130]; //I2C通信用コマンド配列
+    //int max_ptr; //最大どこまで書き込めるか
+    int max_num;
+    
+    int buff_ptr; //バッファの何個目まで入っているか
+    //int eeprom_ptr; //いまどこまで書き込んでいるか
+    
+    char ptr[4];
+};
+
+#endif
\ No newline at end of file