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

Dependents:   EEPROM_Reset_Program EEPROM_Encode_Program

Committer:
Sigma884
Date:
Tue Feb 12 15:47:01 2019 +0000
Revision:
4:d9de12f32978
Parent:
1:66c2c82f4b34
3000 -> 2500 -> 3000

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 1:66c2c82f4b34 1 /*******************************************************************************
Sigma884 1:66c2c82f4b34 2 EEPROM Library
Sigma884 1:66c2c82f4b34 3 made by T.Hayashi @PLANET-Q
Sigma884 1:66c2c82f4b34 4
Sigma884 1:66c2c82f4b34 5 1Mbit EEPROMを使うためのライブラリ
Sigma884 1:66c2c82f4b34 6 最大4素子接続でき,それをシームレスに使うためのライブラリ
Sigma884 1:66c2c82f4b34 7
Sigma884 1:66c2c82f4b34 8 使用例は一番下にあり
Sigma884 1:66c2c82f4b34 9 *******************************************************************************/
Sigma884 0:a945081a4a9e 10 #ifndef EEPROM_LIB_H_
Sigma884 0:a945081a4a9e 11 #define EEPROM_LIB_H_
Sigma884 0:a945081a4a9e 12
Sigma884 0:a945081a4a9e 13 #define EEPROM_ADDR_00_0 0xA0
Sigma884 0:a945081a4a9e 14 #define EEPROM_ADDR_00_1 0xA8
Sigma884 0:a945081a4a9e 15
Sigma884 0:a945081a4a9e 16 #define EEPROM_ADDR_01_0 0xA2
Sigma884 0:a945081a4a9e 17 #define EEPROM_ADDR_01_1 0xAA
Sigma884 0:a945081a4a9e 18
Sigma884 0:a945081a4a9e 19 #define EEPROM_ADDR_10_0 0xA4
Sigma884 0:a945081a4a9e 20 #define EEPROM_ADDR_10_1 0xAC
Sigma884 0:a945081a4a9e 21
Sigma884 0:a945081a4a9e 22 #define EEPROM_ADDR_11_0 0xA6
Sigma884 0:a945081a4a9e 23 #define EEPROM_ADDR_11_1 0xAE
Sigma884 0:a945081a4a9e 24
Sigma884 4:d9de12f32978 25 #define EEPROM_WAIT_US 3000 /* EEPROMにデータを書き込むための待機時間(us) */
Sigma884 0:a945081a4a9e 26
Sigma884 0:a945081a4a9e 27
Sigma884 0:a945081a4a9e 28 class EEPROM_lib{
Sigma884 0:a945081a4a9e 29 public:
Sigma884 0:a945081a4a9e 30
Sigma884 1:66c2c82f4b34 31 /***************************************************************************
Sigma884 1:66c2c82f4b34 32 コンストラクタ
Sigma884 1:66c2c82f4b34 33 引数
Sigma884 1:66c2c82f4b34 34 ・i2c
Sigma884 1:66c2c82f4b34 35 ・使用する素子数(1~4)
Sigma884 1:66c2c82f4b34 36
Sigma884 1:66c2c82f4b34 37 I2C i2c_bus(p9, p10);
Sigma884 1:66c2c82f4b34 38 EEPROM_lib EEPROM(i2c_bus, 4);
Sigma884 1:66c2c82f4b34 39 ***************************************************************************/
Sigma884 0:a945081a4a9e 40 EEPROM_lib(I2C &user_i2c, int num);
Sigma884 0:a945081a4a9e 41
Sigma884 1:66c2c82f4b34 42 /***************************************************************************
Sigma884 1:66c2c82f4b34 43 バイト書き込み関数:writebuff
Sigma884 1:66c2c82f4b34 44 引数
Sigma884 1:66c2c82f4b34 45 ・書き込む素子番号(1~4)
Sigma884 1:66c2c82f4b34 46 ・書き込むブロック(0 or 1)
Sigma884 1:66c2c82f4b34 47 ・書き込むアドレスの上位1バイト
Sigma884 1:66c2c82f4b34 48 ・書き込むアドレスの下位1バイト
Sigma884 1:66c2c82f4b34 49 ・書き込むデータ(1バイト)
Sigma884 1:66c2c82f4b34 50
Sigma884 1:66c2c82f4b34 51 EEPROM.writeBuff(1, 0, 0x00, 0x00, 0xFF);
Sigma884 1:66c2c82f4b34 52 ***************************************************************************/
Sigma884 0:a945081a4a9e 53 void writeByte(int num, int block, char ADDR_H, char ADDR_L, char DATA);
Sigma884 1:66c2c82f4b34 54
Sigma884 1:66c2c82f4b34 55 /***************************************************************************
Sigma884 1:66c2c82f4b34 56 ページ書き込み関数:writePage
Sigma884 1:66c2c82f4b34 57 引数
Sigma884 1:66c2c82f4b34 58 ・書き込み素子番号(1~4)
Sigma884 1:66c2c82f4b34 59 ・書き込むブロック(0 or 1)
Sigma884 1:66c2c82f4b34 60 ・書き込むアドレスの上位1バイト
Sigma884 1:66c2c82f4b34 61 ・書き込むアドレスの下位1バイト
Sigma884 1:66c2c82f4b34 62 ・書き込むデータのポインタ(データの配列)(配列はchar型でサイズは128)
Sigma884 1:66c2c82f4b34 63
Sigma884 1:66c2c82f4b34 64 char DATA[128];
Sigma884 1:66c2c82f4b34 65 EEPROM.writePage(1, 0, 0x00, 0x00, DATA);
Sigma884 1:66c2c82f4b34 66 ***************************************************************************/
Sigma884 0:a945081a4a9e 67 void writePage(int num, int block, char ADDR_H, char ADDR_L, char *DATA);
Sigma884 0:a945081a4a9e 68
Sigma884 1:66c2c82f4b34 69
Sigma884 1:66c2c82f4b34 70 /***************************************************************************
Sigma884 1:66c2c82f4b34 71 連続書き込みの最初のアドレス指定関数:setWriteAddr
Sigma884 1:66c2c82f4b34 72 引数
Sigma884 1:66c2c82f4b34 73 ・開始素子番号(1~4)
Sigma884 1:66c2c82f4b34 74 ・開始ブロック(0 or 1)
Sigma884 1:66c2c82f4b34 75 ・開始アドレスの上位1バイト
Sigma884 1:66c2c82f4b34 76 ・開始アドレスの下位1バイト
Sigma884 1:66c2c82f4b34 77
Sigma884 1:66c2c82f4b34 78 EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
Sigma884 1:66c2c82f4b34 79 ***************************************************************************/
Sigma884 0:a945081a4a9e 80 void setWriteAddr(int num, int block, char ADDR_H, char ADDR_L);
Sigma884 0:a945081a4a9e 81
Sigma884 1:66c2c82f4b34 82
Sigma884 1:66c2c82f4b34 83 /***************************************************************************
Sigma884 1:66c2c82f4b34 84 後でまとめて書き込むためのバッファに値を溜める関数:chargeBuff
Sigma884 1:66c2c82f4b34 85 返り値
Sigma884 1:66c2c82f4b34 86 バッファ内で何バイト目まで埋まっているか(1~128)
Sigma884 1:66c2c82f4b34 87 引数
Sigma884 1:66c2c82f4b34 88 各型のデータ
Sigma884 1:66c2c82f4b34 89
Sigma884 1:66c2c82f4b34 90 int ptr;
Sigma884 1:66c2c82f4b34 91 ptr = EEPROM.chargeBuff((char)0x32);
Sigma884 1:66c2c82f4b34 92 ptr = EEPROM.chargeBuff((bool)true);
Sigma884 1:66c2c82f4b34 93 ptr = EEPROM.chargeBuff((int)12);
Sigma884 1:66c2c82f4b34 94 ptr = EEPROM.chargeBuff((short)23);
Sigma884 1:66c2c82f4b34 95 ptr = EEPROM.chargeBuff((long long)99999999999);
Sigma884 1:66c2c82f4b34 96 ptr = EEPROM.chargeBuff((float)12.3);
Sigma884 1:66c2c82f4b34 97 ptr = EEPROM.chargeBuff((double)12.3456);
Sigma884 1:66c2c82f4b34 98 ※変数も可
Sigma884 1:66c2c82f4b34 99 ※型名を記述すること
Sigma884 1:66c2c82f4b34 100 ***************************************************************************/
Sigma884 0:a945081a4a9e 101 int chargeBuff(char DATA);
Sigma884 0:a945081a4a9e 102 int chargeBuff(bool DATA);
Sigma884 0:a945081a4a9e 103 int chargeBuff(int DATA);
Sigma884 0:a945081a4a9e 104 int chargeBuff(short DATA);
Sigma884 0:a945081a4a9e 105 int chargeBuff(long long DATA);
Sigma884 0:a945081a4a9e 106 int chargeBuff(float DATA);
Sigma884 0:a945081a4a9e 107 int chargeBuff(double DATA);
Sigma884 0:a945081a4a9e 108
Sigma884 1:66c2c82f4b34 109 /***************************************************************************
Sigma884 1:66c2c82f4b34 110 バッファの内容を実際に書き込む関数:writeBuff
Sigma884 1:66c2c82f4b34 111
Sigma884 1:66c2c82f4b34 112 EEPROM.writeBuff();
Sigma884 1:66c2c82f4b34 113 ***************************************************************************/
Sigma884 0:a945081a4a9e 114 void writeBuff();
Sigma884 0:a945081a4a9e 115
Sigma884 1:66c2c82f4b34 116 /***************************************************************************
Sigma884 1:66c2c82f4b34 117 書き込むアドレスを次のページに移動する関数:setNextPage
Sigma884 1:66c2c82f4b34 118 返り値
Sigma884 1:66c2c82f4b34 119 次のぺージの開始アドレス
Sigma884 1:66c2c82f4b34 120 ※(上位から)1バイト目:素子番号(0x00 0x01 0x02 0x03)
Sigma884 1:66c2c82f4b34 121 ※2バイト目:ブロック(0x00 0x01)
Sigma884 1:66c2c82f4b34 122 ※3,4バイト目:アドレス
Sigma884 1:66c2c82f4b34 123 ※例えば,0x01001280だった場合,
Sigma884 1:66c2c82f4b34 124 素子番号2,ブロック0,アドレス0x1280が次に書き込むアドレス
Sigma884 1:66c2c82f4b34 125
Sigma884 1:66c2c82f4b34 126 int ptr = EEPROM.setNextPage();
Sigma884 1:66c2c82f4b34 127 ***************************************************************************/
Sigma884 0:a945081a4a9e 128 int setNextPage();
Sigma884 0:a945081a4a9e 129
Sigma884 1:66c2c82f4b34 130 /***************************************************************************
Sigma884 1:66c2c82f4b34 131 バイト読み取り関数:readByte
Sigma884 1:66c2c82f4b34 132 返り値
Sigma884 1:66c2c82f4b34 133 読み取ったデータ
Sigma884 1:66c2c82f4b34 134 引数
Sigma884 1:66c2c82f4b34 135 ・読み取る素子番号(1~4)
Sigma884 1:66c2c82f4b34 136 ・読み取るブロック(0 or 1)
Sigma884 1:66c2c82f4b34 137 ・読み取るアドレスの上位1バイト
Sigma884 1:66c2c82f4b34 138 ・読み取るアドレスの下位1バイト
Sigma884 1:66c2c82f4b34 139
Sigma884 1:66c2c82f4b34 140 char data = EEPROM.readByte(1, 0, 0x00, 0x00);
Sigma884 1:66c2c82f4b34 141 ***************************************************************************/
Sigma884 0:a945081a4a9e 142 char readByte(int num, int block, char ADDR_H, char ADDR_L);
Sigma884 1:66c2c82f4b34 143
Sigma884 1:66c2c82f4b34 144 /***************************************************************************
Sigma884 1:66c2c82f4b34 145 複数バイト読み取り関数:readMultiByte
Sigma884 1:66c2c82f4b34 146 引数
Sigma884 1:66c2c82f4b34 147 ・読み取る素子番号(1~4)
Sigma884 1:66c2c82f4b34 148 ・読み取るブロック(0 or 1)
Sigma884 1:66c2c82f4b34 149 ・読み取るアドレスの上位1バイト
Sigma884 1:66c2c82f4b34 150 ・読み取るアドレスの下位1バイト
Sigma884 1:66c2c82f4b34 151 ・読み取ったデータを格納する配列のポインタ
Sigma884 1:66c2c82f4b34 152 ・読み取るデータのサイズ
Sigma884 1:66c2c82f4b34 153
Sigma884 1:66c2c82f4b34 154 char DATA[128];
Sigma884 1:66c2c82f4b34 155 EEPROM.readMultiByte(1, 0, 0x00, 0x00, DATA, 128);
Sigma884 1:66c2c82f4b34 156 ***************************************************************************/
Sigma884 0:a945081a4a9e 157 void readMultiByte(int num, int block, char ADDR_H, char ADDR_L, char *DATA, int size);
Sigma884 0:a945081a4a9e 158
Sigma884 0:a945081a4a9e 159
Sigma884 0:a945081a4a9e 160 private:
Sigma884 0:a945081a4a9e 161 I2C *i2c;
Sigma884 0:a945081a4a9e 162 char slave;
Sigma884 0:a945081a4a9e 163
Sigma884 0:a945081a4a9e 164 union EEPROM_CAST{
Sigma884 0:a945081a4a9e 165 long long ll;
Sigma884 0:a945081a4a9e 166 int i;
Sigma884 0:a945081a4a9e 167 short s;
Sigma884 0:a945081a4a9e 168 float f;
Sigma884 0:a945081a4a9e 169 double d;
Sigma884 0:a945081a4a9e 170 char c;
Sigma884 0:a945081a4a9e 171 bool b;
Sigma884 0:a945081a4a9e 172 char cast[8];
Sigma884 0:a945081a4a9e 173 };
Sigma884 0:a945081a4a9e 174 union EEPROM_CAST EEPROM_cast;
Sigma884 0:a945081a4a9e 175
Sigma884 0:a945081a4a9e 176 char cmd[130]; //I2C通信用コマンド配列
Sigma884 0:a945081a4a9e 177 int max_num;
Sigma884 0:a945081a4a9e 178
Sigma884 0:a945081a4a9e 179 int buff_ptr; //バッファの何個目まで入っているか
Sigma884 0:a945081a4a9e 180
Sigma884 0:a945081a4a9e 181 char ptr[4];
Sigma884 0:a945081a4a9e 182 };
Sigma884 0:a945081a4a9e 183
Sigma884 1:66c2c82f4b34 184 #endif
Sigma884 1:66c2c82f4b34 185
Sigma884 1:66c2c82f4b34 186 /*******************************************************************************
Sigma884 1:66c2c82f4b34 187 example
Sigma884 1:66c2c82f4b34 188
Sigma884 1:66c2c82f4b34 189 #include "EEPROM_lib.h"
Sigma884 1:66c2c82f4b34 190
Sigma884 1:66c2c82f4b34 191 Serial PC(USBTX, USBRX, 115200);
Sigma884 1:66c2c82f4b34 192 I2C i2c_bus(p9, p10);
Sigma884 1:66c2c82f4b34 193
Sigma884 1:66c2c82f4b34 194 EEPROM_lib EEPROM(i2c_bus, 4);
Sigma884 1:66c2c82f4b34 195
Sigma884 1:66c2c82f4b34 196 int main(){
Sigma884 1:66c2c82f4b34 197 //////////////////////////////////////////write
Sigma884 1:66c2c82f4b34 198 EEPROM.setWriteAddr(1, 0, 0x00, 0x00);
Sigma884 1:66c2c82f4b34 199 int ptr, n = 0;
Sigma884 1:66c2c82f4b34 200 while(1){
Sigma884 1:66c2c82f4b34 201 while(1){
Sigma884 1:66c2c82f4b34 202 ptr = EEPROM.writeBuff((int)n++);
Sigma884 1:66c2c82f4b34 203 if(ptr == 128){
Sigma884 1:66c2c82f4b34 204 EEPROM.writeBuff();
Sigma884 1:66c2c82f4b34 205 ptr = EEPROM.setNextPage();
Sigma884 1:66c2c82f4b34 206 break;
Sigma884 1:66c2c82f4b34 207 }
Sigma884 1:66c2c82f4b34 208 }
Sigma884 1:66c2c82f4b34 209 if(ptr == 0x04000000){
Sigma884 1:66c2c82f4b34 210 break;
Sigma884 1:66c2c82f4b34 211 }
Sigma884 1:66c2c82f4b34 212 }
Sigma884 1:66c2c82f4b34 213
Sigma884 1:66c2c82f4b34 214 ///////////////////////////////////////read
Sigma884 1:66c2c82f4b34 215 char data[128];
Sigma884 1:66c2c82f4b34 216 int num, block;
Sigma884 1:66c2c82f4b34 217 char ADDR_H, ADDR_L;
Sigma884 1:66c2c82f4b34 218
Sigma884 1:66c2c82f4b34 219 num = 1;
Sigma884 1:66c2c82f4b34 220 block = 0;
Sigma884 1:66c2c82f4b34 221 ADDR_H = ADDR_L = 0x00;
Sigma884 1:66c2c82f4b34 222
Sigma884 1:66c2c82f4b34 223 for(int i = 0; i < 4096; i ++){
Sigma884 1:66c2c82f4b34 224 switch(i){
Sigma884 1:66c2c82f4b34 225 case 512:
Sigma884 1:66c2c82f4b34 226 num = 1;
Sigma884 1:66c2c82f4b34 227 block = 1;
Sigma884 1:66c2c82f4b34 228 break;
Sigma884 1:66c2c82f4b34 229
Sigma884 1:66c2c82f4b34 230 case 1024:
Sigma884 1:66c2c82f4b34 231 num = 2;
Sigma884 1:66c2c82f4b34 232 block = 0;
Sigma884 1:66c2c82f4b34 233 break;
Sigma884 1:66c2c82f4b34 234
Sigma884 1:66c2c82f4b34 235 case 1536:
Sigma884 1:66c2c82f4b34 236 num = 2;
Sigma884 1:66c2c82f4b34 237 block = 1;
Sigma884 1:66c2c82f4b34 238 break;
Sigma884 1:66c2c82f4b34 239
Sigma884 1:66c2c82f4b34 240 case 2048:
Sigma884 1:66c2c82f4b34 241 num = 3;
Sigma884 1:66c2c82f4b34 242 block = 0;
Sigma884 1:66c2c82f4b34 243 break;
Sigma884 1:66c2c82f4b34 244
Sigma884 1:66c2c82f4b34 245 case 2560:
Sigma884 1:66c2c82f4b34 246 num = 3;
Sigma884 1:66c2c82f4b34 247 block = 1;
Sigma884 1:66c2c82f4b34 248 break;
Sigma884 1:66c2c82f4b34 249
Sigma884 1:66c2c82f4b34 250 case 3072:
Sigma884 1:66c2c82f4b34 251 num = 4;
Sigma884 1:66c2c82f4b34 252 block = 0;
Sigma884 1:66c2c82f4b34 253 break;
Sigma884 1:66c2c82f4b34 254
Sigma884 1:66c2c82f4b34 255 case 3584:
Sigma884 1:66c2c82f4b34 256 num = 4;
Sigma884 1:66c2c82f4b34 257 block = 1;
Sigma884 1:66c2c82f4b34 258 break;
Sigma884 1:66c2c82f4b34 259 }
Sigma884 1:66c2c82f4b34 260
Sigma884 1:66c2c82f4b34 261 EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data, 128);
Sigma884 1:66c2c82f4b34 262 for(int x = 0; x < 128; x ++){
Sigma884 1:66c2c82f4b34 263 pc.printf("%02x ", data[x]);
Sigma884 1:66c2c82f4b34 264 }
Sigma884 1:66c2c82f4b34 265 pc.printf("\r\n");
Sigma884 1:66c2c82f4b34 266
Sigma884 1:66c2c82f4b34 267 if(ADDR_L == 0x00){
Sigma884 1:66c2c82f4b34 268 ADDR_L = 0x80;
Sigma884 1:66c2c82f4b34 269 }
Sigma884 1:66c2c82f4b34 270 else{
Sigma884 1:66c2c82f4b34 271 ADDR_L = 0x00;
Sigma884 1:66c2c82f4b34 272 ADDR_H ++;
Sigma884 1:66c2c82f4b34 273 }
Sigma884 1:66c2c82f4b34 274 }
Sigma884 1:66c2c82f4b34 275
Sigma884 1:66c2c82f4b34 276 }
Sigma884 1:66c2c82f4b34 277
Sigma884 1:66c2c82f4b34 278 *******************************************************************************/