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

Dependents:   EEPROM_Reset_Program EEPROM_Encode_Program SWAN_IZU2019_v1 Hybrid_OB2021_eeprom ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EEPROM_lib.h Source File

EEPROM_lib.h

00001 /*******************************************************************************
00002 EEPROM Library
00003 made by T.Hayashi @PLANET-Q
00004 
00005 1Mbit EEPROMを使うためのライブラリ
00006 最大4素子接続でき,それをシームレスに使うためのライブラリ
00007 
00008 使用例は一番下にあり
00009 *******************************************************************************/
00010 #ifndef EEPROM_LIB_H_
00011 #define EEPROM_LIB_H_
00012 
00013 #define EEPROM_ADDR_00_0 0xA0
00014 #define EEPROM_ADDR_00_1 0xA8
00015 
00016 #define EEPROM_ADDR_01_0 0xA2
00017 #define EEPROM_ADDR_01_1 0xAA
00018 
00019 #define EEPROM_ADDR_10_0 0xA4
00020 #define EEPROM_ADDR_10_1 0xAC
00021 
00022 #define EEPROM_ADDR_11_0 0xA6
00023 #define EEPROM_ADDR_11_1 0xAE
00024 
00025 #define EEPROM_WAIT_US 3000 /* EEPROMにデータを書き込むための待機時間(us) */
00026 
00027 
00028 class EEPROM_lib{
00029     public:
00030     
00031     /***************************************************************************
00032     コンストラクタ
00033     引数
00034         ・i2c
00035         ・使用する素子数(1~4)
00036 
00037         I2C i2c_bus(p9, p10);
00038         EEPROM_lib EEPROM(i2c_bus, 4);
00039     ***************************************************************************/
00040     EEPROM_lib(I2C &user_i2c, int num);
00041     
00042     /***************************************************************************
00043     バイト書き込み関数:writebuff
00044     引数
00045         ・書き込む素子番号(1~4)
00046         ・書き込むブロック(0 or 1)
00047         ・書き込むアドレスの上位1バイト
00048         ・書き込むアドレスの下位1バイト
00049         ・書き込むデータ(1バイト)
00050 
00051         EEPROM.writeBuff(1, 0, 0x00, 0x00, 0xFF);
00052     ***************************************************************************/
00053     void writeByte(int num, int block, char ADDR_H, char ADDR_L, char DATA);
00054     
00055     /***************************************************************************
00056     ページ書き込み関数:writePage
00057     引数
00058         ・書き込み素子番号(1~4)
00059         ・書き込むブロック(0 or 1)
00060         ・書き込むアドレスの上位1バイト
00061         ・書き込むアドレスの下位1バイト
00062         ・書き込むデータのポインタ(データの配列)(配列はchar型でサイズは128)
00063 
00064         char DATA[128];
00065         EEPROM.writePage(1, 0, 0x00, 0x00, DATA);
00066     ***************************************************************************/
00067     void writePage(int num, int block, char ADDR_H, char ADDR_L, char *DATA);
00068     
00069     
00070     /***************************************************************************
00071     連続書き込みの最初のアドレス指定関数:setWriteAddr
00072     引数
00073         ・開始素子番号(1~4)
00074         ・開始ブロック(0 or 1)
00075         ・開始アドレスの上位1バイト
00076         ・開始アドレスの下位1バイト
00077 
00078         EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
00079     ***************************************************************************/
00080     void setWriteAddr(int num, int block, char ADDR_H, char ADDR_L);
00081     
00082     
00083     /***************************************************************************
00084     後でまとめて書き込むためのバッファに値を溜める関数:chargeBuff
00085     返り値
00086         バッファ内で何バイト目まで埋まっているか(1~128)
00087     引数
00088         各型のデータ
00089 
00090         int ptr;
00091         ptr = EEPROM.chargeBuff((char)0x32);
00092         ptr = EEPROM.chargeBuff((bool)true);
00093         ptr = EEPROM.chargeBuff((int)12);
00094         ptr = EEPROM.chargeBuff((short)23);
00095         ptr = EEPROM.chargeBuff((long long)99999999999);
00096         ptr = EEPROM.chargeBuff((float)12.3);
00097         ptr = EEPROM.chargeBuff((double)12.3456);
00098         ※変数も可
00099         ※型名を記述すること
00100     ***************************************************************************/
00101     int chargeBuff(char DATA);
00102     int chargeBuff(bool DATA);
00103     int chargeBuff(int DATA);
00104     int chargeBuff(short DATA);
00105     int chargeBuff(long long DATA);
00106     int chargeBuff(float DATA);
00107     int chargeBuff(double DATA);
00108     
00109     /***************************************************************************
00110     バッファの内容を実際に書き込む関数:writeBuff
00111 
00112         EEPROM.writeBuff();
00113     ***************************************************************************/
00114     void writeBuff();
00115     
00116     /***************************************************************************
00117     書き込むアドレスを次のページに移動する関数:setNextPage
00118     返り値
00119         次のぺージの開始アドレス
00120         ※(上位から)1バイト目:素子番号(0x00 0x01 0x02 0x03)
00121         ※2バイト目:ブロック(0x00 0x01)
00122         ※3,4バイト目:アドレス
00123         ※例えば,0x01001280だった場合,
00124             素子番号2,ブロック0,アドレス0x1280が次に書き込むアドレス
00125 
00126         int ptr = EEPROM.setNextPage();
00127     ***************************************************************************/
00128     int setNextPage();
00129     
00130     /***************************************************************************
00131     バイト読み取り関数:readByte
00132     返り値
00133         読み取ったデータ
00134     引数
00135         ・読み取る素子番号(1~4)
00136         ・読み取るブロック(0 or 1)
00137         ・読み取るアドレスの上位1バイト
00138         ・読み取るアドレスの下位1バイト
00139 
00140         char data = EEPROM.readByte(1, 0, 0x00, 0x00);
00141     ***************************************************************************/
00142     char readByte(int num, int block, char ADDR_H, char ADDR_L);
00143     
00144     /***************************************************************************
00145     複数バイト読み取り関数:readMultiByte
00146     引数
00147         ・読み取る素子番号(1~4)
00148         ・読み取るブロック(0 or 1)
00149         ・読み取るアドレスの上位1バイト
00150         ・読み取るアドレスの下位1バイト
00151         ・読み取ったデータを格納する配列のポインタ
00152         ・読み取るデータのサイズ
00153 
00154         char DATA[128];
00155         EEPROM.readMultiByte(1, 0, 0x00, 0x00, DATA, 128);
00156     ***************************************************************************/
00157     void readMultiByte(int num, int block, char ADDR_H, char ADDR_L, char *DATA, int size);
00158     
00159     
00160     private:
00161     I2C *i2c;
00162     char slave;
00163     
00164     union EEPROM_CAST{
00165         long long ll;
00166         int i;
00167         short s;
00168         float f;
00169         double d;
00170         char c;
00171         bool b;
00172         char cast[8];
00173     };
00174     union EEPROM_CAST EEPROM_cast;
00175     
00176     char cmd[130]; //I2C通信用コマンド配列
00177     int max_num;
00178     
00179     int buff_ptr; //バッファの何個目まで入っているか
00180     
00181     char ptr[4];
00182 };
00183 
00184 #endif
00185 
00186 /*******************************************************************************
00187 example
00188 
00189 #include "EEPROM_lib.h"
00190 
00191 Serial PC(USBTX, USBRX, 115200);
00192 I2C i2c_bus(p9, p10);
00193 
00194 EEPROM_lib EEPROM(i2c_bus, 4);
00195 
00196 int main(){
00197     //////////////////////////////////////////write
00198     EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
00199     int ptr, n = 0;
00200     while(1){
00201         while(1){
00202             ptr = EEPROM.writeBuff((int)n++);
00203             if(ptr == 128){
00204                 EEPROM.writeBuff();
00205                 ptr = EEPROM.setNextPage();
00206                 break;
00207             }
00208         }
00209         if(ptr == 0x04000000){
00210             break;
00211         }
00212     }
00213     
00214     ///////////////////////////////////////read
00215     char data[128];
00216     int num, block;
00217     char ADDR_H, ADDR_L;
00218     
00219     num = 1;
00220     block = 0;
00221     ADDR_H = ADDR_L = 0x00;
00222     
00223     for(int i = 0; i < 4096; i ++){
00224         switch(i){
00225             case 512:
00226             num = 1;
00227             block = 1;
00228             break;
00229             
00230             case 1024:
00231             num = 2;
00232             block = 0;
00233             break;
00234             
00235             case 1536:
00236             num = 2;
00237             block = 1;
00238             break;
00239             
00240             case 2048:
00241             num = 3;
00242             block = 0;
00243             break;
00244             
00245             case 2560:
00246             num = 3;
00247             block = 1;
00248             break;
00249             
00250             case 3072:
00251             num = 4;
00252             block = 0;
00253             break;
00254             
00255             case 3584:
00256             num = 4;
00257             block = 1;
00258             break;
00259         }
00260         
00261         EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data, 128);
00262         for(int x = 0; x < 128; x ++){
00263             pc.printf("%02x ", data[x]);
00264         }
00265         pc.printf("\r\n");
00266         
00267         if(ADDR_L == 0x00){
00268             ADDR_L = 0x80;
00269         }
00270         else{
00271             ADDR_L = 0x00;
00272             ADDR_H ++;
00273         }
00274     }
00275     
00276 }
00277 
00278 *******************************************************************************/