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

Dependents:   EEPROM_Reset_Program EEPROM_Encode_Program

Files at this revision

API Documentation at this revision

Comitter:
Sigma884
Date:
Mon Feb 11 16:59:46 2019 +0000
Parent:
0:a945081a4a9e
Child:
2:096ff58b3f5c
Child:
3:d040fa9b5bb9
Commit message:
EEPROM Library ver1

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
--- a/EEPROM_lib.cpp	Mon Feb 11 15:41:56 2019 +0000
+++ b/EEPROM_lib.cpp	Mon Feb 11 16:59:46 2019 +0000
@@ -5,10 +5,8 @@
     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;
 }
 
@@ -107,31 +105,26 @@
 }
 
 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];
@@ -140,26 +133,22 @@
         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];
@@ -172,13 +161,11 @@
         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];
@@ -187,13 +174,11 @@
         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];
@@ -206,7 +191,6 @@
         cmd[buff_ptr + 9] = EEPROM_cast.cast[0];
         
         buff_ptr += 8;
-        //eeprom_ptr += 8;
     }
     return buff_ptr;
 }
--- a/EEPROM_lib.h	Mon Feb 11 15:41:56 2019 +0000
+++ b/EEPROM_lib.h	Mon Feb 11 16:59:46 2019 +0000
@@ -1,3 +1,12 @@
+/*******************************************************************************
+EEPROM Library
+made by T.Hayashi @PLANET-Q
+
+1Mbit EEPROMを使うためのライブラリ
+最大4素子接続でき,それをシームレスに使うためのライブラリ
+
+使用例は一番下にあり
+*******************************************************************************/
 #ifndef EEPROM_LIB_H_
 #define EEPROM_LIB_H_
 
@@ -13,19 +22,82 @@
 #define EEPROM_ADDR_11_0 0xA6
 #define EEPROM_ADDR_11_1 0xAE
 
-#define EEPROM_WAIT_US 2500
+#define EEPROM_WAIT_US 2500 /* EEPROMにデータを書き込むための待機時間(us) */
 
 
 class EEPROM_lib{
     public:
     
+    /***************************************************************************
+    コンストラクタ
+    引数
+        ・i2c
+        ・使用する素子数(1~4)
+    例
+        I2C i2c_bus(p9, p10);
+        EEPROM_lib EEPROM(i2c_bus, 4);
+    ***************************************************************************/
     EEPROM_lib(I2C &user_i2c, int num);
     
+    /***************************************************************************
+    バイト書き込み関数:writebuff
+    引数
+        ・書き込む素子番号(1~4)
+        ・書き込むブロック(0 or 1)
+        ・書き込むアドレスの上位1バイト
+        ・書き込むアドレスの下位1バイト
+        ・書き込むデータ(1バイト)
+    例
+        EEPROM.writeBuff(1, 0, 0x00, 0x00, 0xFF);
+    ***************************************************************************/
     void writeByte(int num, int block, char ADDR_H, char ADDR_L, char DATA);
+    
+    /***************************************************************************
+    ページ書き込み関数:writePage
+    引数
+        ・書き込み素子番号(1~4)
+        ・書き込むブロック(0 or 1)
+        ・書き込むアドレスの上位1バイト
+        ・書き込むアドレスの下位1バイト
+        ・書き込むデータのポインタ(データの配列)(配列はchar型でサイズは128)
+    例
+        char DATA[128];
+        EEPROM.writePage(1, 0, 0x00, 0x00, DATA);
+    ***************************************************************************/
     void writePage(int num, int block, char ADDR_H, char ADDR_L, char *DATA);
     
+    
+    /***************************************************************************
+    連続書き込みの最初のアドレス指定関数:setWriteAddr
+    引数
+        ・開始素子番号(1~4)
+        ・開始ブロック(0 or 1)
+        ・開始アドレスの上位1バイト
+        ・開始アドレスの下位1バイト
+    例
+        EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
+    ***************************************************************************/
     void setWriteAddr(int num, int block, char ADDR_H, char ADDR_L);
     
+    
+    /***************************************************************************
+    後でまとめて書き込むためのバッファに値を溜める関数:chargeBuff
+    返り値
+        バッファ内で何バイト目まで埋まっているか(1~128)
+    引数
+        各型のデータ
+    例
+        int ptr;
+        ptr = EEPROM.chargeBuff((char)0x32);
+        ptr = EEPROM.chargeBuff((bool)true);
+        ptr = EEPROM.chargeBuff((int)12);
+        ptr = EEPROM.chargeBuff((short)23);
+        ptr = EEPROM.chargeBuff((long long)99999999999);
+        ptr = EEPROM.chargeBuff((float)12.3);
+        ptr = EEPROM.chargeBuff((double)12.3456);
+        ※変数も可
+        ※型名を記述すること
+    ***************************************************************************/
     int chargeBuff(char DATA);
     int chargeBuff(bool DATA);
     int chargeBuff(int DATA);
@@ -34,11 +106,54 @@
     int chargeBuff(float DATA);
     int chargeBuff(double DATA);
     
+    /***************************************************************************
+    バッファの内容を実際に書き込む関数:writeBuff
+    例
+        EEPROM.writeBuff();
+    ***************************************************************************/
     void writeBuff();
     
+    /***************************************************************************
+    書き込むアドレスを次のページに移動する関数:setNextPage
+    返り値
+        次のぺージの開始アドレス
+        ※(上位から)1バイト目:素子番号(0x00 0x01 0x02 0x03)
+        ※2バイト目:ブロック(0x00 0x01)
+        ※3,4バイト目:アドレス
+        ※例えば,0x01001280だった場合,
+            素子番号2,ブロック0,アドレス0x1280が次に書き込むアドレス
+    例
+        int ptr = EEPROM.setNextPage();
+    ***************************************************************************/
     int setNextPage();
     
+    /***************************************************************************
+    バイト読み取り関数:readByte
+    返り値
+        読み取ったデータ
+    引数
+        ・読み取る素子番号(1~4)
+        ・読み取るブロック(0 or 1)
+        ・読み取るアドレスの上位1バイト
+        ・読み取るアドレスの下位1バイト
+    例
+        char data = EEPROM.readByte(1, 0, 0x00, 0x00);
+    ***************************************************************************/
     char readByte(int num, int block, char ADDR_H, char ADDR_L);
+    
+    /***************************************************************************
+    複数バイト読み取り関数:readMultiByte
+    引数
+        ・読み取る素子番号(1~4)
+        ・読み取るブロック(0 or 1)
+        ・読み取るアドレスの上位1バイト
+        ・読み取るアドレスの下位1バイト
+        ・読み取ったデータを格納する配列のポインタ
+        ・読み取るデータのサイズ
+    例
+        char DATA[128];
+        EEPROM.readMultiByte(1, 0, 0x00, 0x00, DATA, 128);
+    ***************************************************************************/
     void readMultiByte(int num, int block, char ADDR_H, char ADDR_L, char *DATA, int size);
     
     
@@ -59,13 +174,105 @@
     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
+#endif
+
+/*******************************************************************************
+example
+
+#include "EEPROM_lib.h"
+
+Serial PC(USBTX, USBRX, 115200);
+I2C i2c_bus(p9, p10);
+
+EEPROM_lib EEPROM(i2c_bus, 4);
+
+int main(){
+    //////////////////////////////////////////write
+    EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
+    int ptr, n = 0;
+    while(1){
+        while(1){
+            ptr = EEPROM.writeBuff((int)n++);
+            if(ptr == 128){
+                EEPROM.writeBuff();
+                ptr = EEPROM.setNextPage();
+                break;
+            }
+        }
+        if(ptr == 0x04000000){
+            break;
+        }
+    }
+    
+    ///////////////////////////////////////read
+    char data[128];
+    int num, block;
+    char ADDR_H, ADDR_L;
+    
+    num = 1;
+    block = 0;
+    ADDR_H = ADDR_L = 0x00;
+    
+    for(int i = 0; i < 4096; i ++){
+        switch(i){
+            case 512:
+            num = 1;
+            block = 1;
+            break;
+            
+            case 1024:
+            num = 2;
+            block = 0;
+            break;
+            
+            case 1536:
+            num = 2;
+            block = 1;
+            break;
+            
+            case 2048:
+            num = 3;
+            block = 0;
+            break;
+            
+            case 2560:
+            num = 3;
+            block = 1;
+            break;
+            
+            case 3072:
+            num = 4;
+            block = 0;
+            break;
+            
+            case 3584:
+            num = 4;
+            block = 1;
+            break;
+        }
+        
+        EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data, 128);
+        for(int x = 0; x < 128; x ++){
+            pc.printf("%02x ", data[x]);
+        }
+        pc.printf("\r\n");
+        
+        if(ADDR_L == 0x00){
+            ADDR_L = 0x80;
+        }
+        else{
+            ADDR_L = 0x00;
+            ADDR_H ++;
+        }
+    }
+    
+}
+
+*******************************************************************************/
\ No newline at end of file