Arduino pro mini にてRTCや外付けのEEPROMを使ったプログラムを書いているのですが
EEPROMにデータを書く際に、0x7F(127)から16バイトのデータを書こうとすると
何故か先頭(0x00)にデータが書かれてしまいます。
実際に書こうとしているデータは"201805011830,00,"
ですが、実行後EEPROMの0x00からデータを読んでみると
0x00:'0'
0x01:'1'
0x02:'8'
0x03:'0'
0x04:'5'
0x05:'0'
略
と書かれてしまっています。
アドレス:0x7Fをまたがない書込の際は問題なくかけています。
オシロスコープを使用し、I2Cを拾ってみたのですが自分が見る限り間違っていないように見えました。
開発環境:Windows10 ArduinoIDE
Arduino pro mini 3.3V 8MHz
EEPROM:24LC512
Arduinoのソース上はライブラリを使用しています。
c
1/******************************************************************************* 2* ans = Write(adrs,*data,num) * 3* EEPROMに指定個数だけデータを書き込む処理 * 4* * 5* adrs : 書き込み開始のデータアドレス位置を指定します * 6* *data: 書き込むデータを保存した配列変数を指定します * 7* num : 書き込むデータの個数を指定します * 8* デバイスのページサイズ以上は連続書き込みは出来ません * 9* 24xx32/64は32byte 24xx128/256は64byte 24xx512は128byte * 10* (WireライブラリのバッファがMAX32byteまでと制限あり) * 11* ans : 戻り値、0=正常終了 それ以外I2C通信エラー下記 * 12* 1=送ろうとしたデータが送信バッファのサイズを超えた * 13* 2=スレーブ・アドレスを送信し、NACKを受信した * 14* 3=データ・バイトを送信し、NACKを受信した * 15* 4=その他のエラー * 16* 5=データ受信エラー * 17*******************************************************************************/ 18int skMC24xxx::Write(long adrs,char *data,int num) 19{ 20 byte x ; 21 int i , ans ; 22 23 Wire.beginTransmission(slave_adrs) ; // 通信の開始処理 24 x = (byte)(adrs >> 8) ; 25 Wire.write(x) ; // メモリのHigh側アドレスを指定する 26 x = (byte)(adrs & 0x00ff) ; 27 Wire.write(x) ; // メモリのLow 側アドレスを指定する 28 for (i=0 ; i<num ; i++ ) { 29 Wire.write(*data) ; // 指定個数分書き込む 30 data++ ; 31 } 32 ans = Wire.endTransmission() ; // データの送信と通信の終了処理 33 return ans ; 34} 35 36
何が起きているのかわからない状況です。
EEPROMの使い方で勘違いしているところがあるのでしょうか。
ここを調べて見ろ等のヒントでもよいので、どなたかご教授願いますでしょうか。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/01 13:40