はじめまして、しんと申します。
現在I2C(簡易版ではない)を利用してのEEPROMのRandom Readを行い、EEPROMの先頭アドレスからReadするプログラムを作成しているのですがうまく行かず困っています。
iica0_master_handler()をデバッグする限り、IICA0にEEPROMアドレスを書く→ACK0割り込み受信→先頭アドレス0x00を書く→ACK0割り込み受信→正常終了(r_iica0_callback_master_sendend())となっているのですが、ウォッチでは読めていないのか0x00となっており(ただ読むと0xFFです)困っています。
よろしければアドバイスをお願い致します。
使用統合開発環境 CS+ for CC
使用製品 RL78/G13
使用EEPROM型名 R1EX24016ASAS0I#S0
Random Readについては、下記データシートのP.13になります。
R1EX24016ASAS0I/R1EX24016ATAS0I データシート (renesas.com)
作成している処理は以下です。
unsigned char eeprom_adr = 0xA0;
unsigned char dummy_write = 0x00; //先頭アドレスから読みたい
nsigned char g_buff[256]={0x00};
//ダミーwrite
i2c_access_end_flag = 0; R_IICA0_Master_Send(eeprom_adr, &dummy_write[0], 1, 1000); while (i2c_access_end_flag == 0) ;
//256バイトRead
i2c_access_end_flag = 0; R_IICA0_Master_Receive(eeprom_adr, &g_buff[0], 256, 1000); while (i2c_access_end_flag == 0); R_IICA0_StopCondition();
※ダミーWrite後、STOPコンディションを発生しないようにするため、自動生成コード(r_iica0_callback_master_sendend)のSPT0 = 1U;はマスクしています。
※i2c_access_end_flagは自動生成コード(r_iica0_callback_master_sendend)で1セットしており、処理完了まで待っています。
チョコです。
シリアル関係のコード生成されたコードには問題があり過ぎてもう何年も自前のライブラリしか使っていません。
Renesasのサンプルコード「RL78/G13 シリアル・インタフェースIICA(マスタ送受信)(R01AN2759JJ0201 Rev. 2.01)」でもコード生成されたAPI関数ではなく、以下のような独自のライブラリで処理していますよ。
さて、問い合わせの中身についてみていきます。
>//ダミーwrite
これは正しくありません。ここは、「EEPROMへのアクセスするアドレスの設定」が正しい表現です。
>iica0_master_handler()をデバッグする限り、IICA0にEEPROMアドレスを書く→ACK0割り込み受信→先頭アドレス0x00を書く→ACK0割り込み受信→正常終了(r_iica0_callback_master_sendend())となっているのですが、ウォッチでは読めていないのか0x00となっており(ただ読むと0xFFです)困っています。
この段階では、単にEEPROMに対して、EEPROMのアドレスを送信しただけです。何もEEPROMからは読み出していません。何をウォッチしているのでしょうか。
データが受信できているとすると、「//256バイトRead」の処理の後になります。
ご確認ください。
以上
チョコ様
ご回答ありがとうございます。
質問内容に不備があり申し訳ございません。以下訂正いたします。
①ダミーWriteについて
チョコ様に記載いただいた認識はあります。
EEPROMデータシートでそのような記載だったのでそう書いておりました。
②ウォッチ内容
質問の記述が紛らわしくすみません。
256バイトRead後のg_buff[]をウォッチしています。
256バイトRead処理のみですと0xFFを読み出せているのですが、EEPROMへのアクセスするアドレスの設定後だと、変数の初期値のままになります。
ご紹介いただいたr_iic_libはどこでダウンロードできるかご教示いただけないでしょうか。ルネサスのホームから検索等しましたが見つけられませんでした。
>①ダミーWriteについて チョコ様に記載いただいた認識はあります。
IICA0での受信動作で、次のデータの受信の時に、IICA0に0xFFを書き込むことでクロック・ストレッチを解除することをダミー・データ書き込みとよんでいます。ここで、書き込んでいるデータはその値自体に意味はありません。だからこそ、ダミー・データと呼んでいます。
今回の「dummy_writeの書き込み」は全く別の動作で、これはきちんとしたデータの送信で、より具体的には、EEPROMのメモリ・セルのアドレスの指定です。決して、ダミーなんかではありません。
>256バイトRead処理のみですと0xFFを読み出せているのですが、EEPROMへのアクセスするアドレスの設定後だと、変数の初期値のままになります。
それは、EEPROMに書き込まれているデータがそのようになっているのではないでしょうか。g_buff[256]の初期値を0x00以外のデータ(例えば、0x00~0xFFのようなインクリメントデータ)にしておけば、書き換わったことは分かります。
>ご紹介いただいたr_iic_libはどこでダウンロードできるかご教示いただけないでしょうか。
RenesasのHPで、前回の書き込みで紹介した「R01AN2759JJ0201」をキーワードにして検索すれば、以下のようなアプリケーション・ノートが出てきます。そのサンプル・コードのプロジェクトの中にあります。
ダウンロードしたzipファイルを解凍してください。
アプリケーション・ノートに説明が記載されているので、参考にしてください。
本件、自己解決しました。デバッグ環境が変な状態になっていたようで、全て再起動することで所望の動作ができました。ダミーデータの定義の件、勉強になりました。ありがとうございます。サンプルコードはこの後見てみます。ありがとうございました。
解決してよかったですね。