質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

5217閲覧

Arduinoから外付けEEPROMの特定のアドレスへデータを書くと目的のアドレス以外に書き込まれる

fenri

総合スコア11

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/05/01 11:14

編集2018/05/01 11:15

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の使い方で勘違いしているところがあるのでしょうか。
ここを調べて見ろ等のヒントでもよいので、どなたかご教授願いますでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのEEPROMのデータシートを見てみましょう
容量ごとに、アドレス指定のバイト数が変わりますんで、そこらへんあっているかチェックしてみてください


EEPROMのデータシートを見ると、アドレス指定は2バイトであってるようですが、

• Page Write Time 5 ms max.
• 128-Byte Page Write Buffer

という記述が見えます
ページ書き込みモードでの書き込み時間は5ms必要となります。
また、そのページサイズは128バイト区切りとなります。
ということで、0x7fをまたぐとき、5ms待たなければならない、ということになりますね

ということで、正確には、別のアドレスに書き込まれる、ではなく、0x7f以降のアドレスの書き込みは無視されている、ということですねー

ページ書き込みモードではページ内で繰り返されるので、0x7f の次のアドレスは 0x00 に書き込まれるよーですね

投稿2018/05/01 11:37

編集2018/05/01 12:06
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fenri

2018/05/01 13:40

該当の箇所を見つけました。 ページという概念を理解せずにいた為、よく読めばわかるように書いてありますね。 大変失礼しました。 ページの境界を超えそうであればその分だけバイト書き込みを行い、 超えたらまたページ書き込みをするようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問