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

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

ただいまの
回答率

90.61%

  • Arduino

    515questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 239

fenri

score 3

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のソース上はライブラリを使用しています。

/*******************************************************************************
*  ans = Write(adrs,*data,num)                                                 *
*    EEPROMに指定個数だけデータを書き込む処理                                  *
*                                                                              *
*    adrs : 書き込み開始のデータアドレス位置を指定します                       *
*    *data: 書き込むデータを保存した配列変数を指定します                       *
*    num  : 書き込むデータの個数を指定します                                   *
*           デバイスのページサイズ以上は連続書き込みは出来ません               *
*           24xx32/64は32byte   24xx128/256は64byte  24xx512は128byte          *
*           (WireライブラリのバッファがMAX32byteまでと制限あり)                *
*    ans  : 戻り値、0=正常終了 それ以外I2C通信エラー下記                      *
*                   1=送ろうとしたデータが送信バッファのサイズを超えた         *
*                   2=スレーブ・アドレスを送信し、NACKを受信した               *
*                   3=データ・バイトを送信し、NACKを受信した                   *
*                   4=その他のエラー                                           *
*                   5=データ受信エラー                                         *
*******************************************************************************/
int skMC24xxx::Write(long adrs,char *data,int num)
{
     byte x ;
     int i , ans ;

     Wire.beginTransmission(slave_adrs) ;    // 通信の開始処理
     x = (byte)(adrs >> 8) ;
     Wire.write(x) ;                         // メモリのHigh側アドレスを指定する
     x = (byte)(adrs & 0x00ff) ;
     Wire.write(x) ;                         // メモリのLow 側アドレスを指定する
     for (i=0 ; i<num ; i++ ) {
          Wire.write(*data) ;                // 指定個数分書き込む
          data++ ;
     }
     ans = Wire.endTransmission() ;          // データの送信と通信の終了処理
     return ans ;
}

何が起きているのかわからない状況です。
EEPROMの使い方で勘違いしているところがあるのでしょうか。
ここを調べて見ろ等のヒントでもよいので、どなたかご教授願いますでしょうか。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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


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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/01 22:40

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    515questions

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