1Mbit EEPROMを便利に使うためのライブラリ
Dependents: EEPROM_Reset_Program EEPROM_Encode_Program SWAN_IZU2019_v1 Hybrid_OB2021_eeprom ... more
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 *******************************************************************************/
Generated on Wed Jul 20 2022 02:19:31 by 1.7.2