ろくに基本を確認しないから、EEPROMの書き込みサイクルなんて気にもしていなかったが、AT24C256Bのデータ・シートには以下のように書いてある。
書き込みのサイクルは最大で5msらしい。
というか、
Self-timed Write Cycle (5 ms Max)
と書いてあって他にそれらしきことが書いてないので、これのことかと思っただけだが。
なぜ、ガラにも無く仕様を確認したかというと、
1 2 3 4 5 |
for(c=0; c<255; c++){ d = rand()%0xFF; int_EEPROM_putc(c, d); I2C_snd_char(EE_P0_0, 0x00, c, d); } |
とやっていたときにはちゃんと書き込めていたのに、
1 2 3 4 5 |
for(e=0; e<0x80; e++){ for(c=0; c<255; c++){ I2C_snd_char(EE_P0_0, e, c, c); } } |
とやるとうまくない。
上のコードのように、間に
int_EEPROM_putc(c, d);
をはさめば問題無いのだが、下のコードのように他に何の処理も入れずにそのままループをぶん回すと以下のように、
明らかに、1つおきにしかデータを書き込まなくなるので、ハタと気づいたわけだ。
上の例は、まずちゃんと十分なdelayをはさんでゆっくりと0xFFで埋めた後、delayを外して0x00~0xFFを順に書き込んだ場合で、きれいに1個飛ばしになっている。
実際には、いま想定している使い方では5msより短いサイクルで連続してデータを書き込む場面はないので、問題になるのはテスト段階だけのことだが、EEPROMの書き込み速度は意外に遅いということがわかって勉強にはなった。
あと、あえて書けば、
Endurance: One Million Write Cycles
も気になるところだ。
100万回の読み書きに耐えるというのはいいが、斜め読みなので何をもってWrite Cycleと称するかが不明だ。
仮に容量が32kバイトのAT24C256Bに先頭から最後まで1バイトずつ書き込むと、それだけで32768回書き込むわけで、これをここで言う書き込み回数と考えるなら、このループ操作を30回繰り返せばもう書き込み回数の上限になってしまうわけだ(1000000 ÷ 32768 = 30.518)。
そこでデータ・シートをもう少し読むと、
64-byte Page Write Mode (Partial Page Writes Allowed)
というやつが目に留まる。
The 256K is internally organized as 512 pages of 64 bytes each.
と書いてあったりもする。
100万回というのはPage Modeでのことですよと言いたいらしいので、当初私が考えていたような書き込み回数の数え方より、1ページ64バイトのページが512ページあって、たとえ1バイトでもいずれかのページに書き込むと1回と考えるという感覚の方がいいのかもしれない。
そうすると、仮にPage writeでなく、1バイトずつByte writeで先頭から最後まで1通り書き込んで埋めると、あるページには64回書き込まれたということになるわけで、この書き込み方では書き込みループを15625回実行すると寿命になる計算だ(1000000 ÷ 64 = 15625)。
データ・ロガーとして2バイトのデータを連続して書き込んでいくと1分のインターバルなら約11.4日分の測定が可能(32 × 1024 ÷ 2 ÷ 60 ÷ 24 = 11.378)だが、それを15625回行うと487年。
何か計算おかしいかなあ。
1か所にだけ集中して書き込むとかしない限りは全然気にすること無いってことかなあ。
大事を取って、データを連続して書き込む際に64バイトごとにまとめて書き込むつもりのコードにするのもさほど手間ではないようだけど。