RX231 IIC通信 API関数について

はじめまして、KANと申します。

現在、RX231マイコンとEEPROM BR24G256(ROHM製)とでIIC通信を行い、データをやり取りしようとしています。

その際にスマートコンフィグレータから生成されるAPI関数にてデータの受信をしようとするために下記コードを実行したのですが、バッファとしている配列の先頭となるDATA[0]~DATA[3]の3byteにデータが受信されず、DATA[4]~DATA[34]には正常にデータが受信される結果となりました。データ読み取りの際のデータ数を減らしても先頭のデータが受信できない状態となっていました。

先頭のデータが受信できない原因としては何が考えられるでしょうか?それともAPI関数のR_Config_RIIC0_Master_Receiveがそういった仕様になっているのでしょうか?

尚、スレーブアドレス(SLAVE_ADDRESS)は0x50と設定しています。

初歩的な質問かもしれませんが、ご教授願います。

//TEMP_eep配列初期化
TEMP_eep[0] = 0x00;
TEMP_eep[1] = 0x20;

F_eep = 1;
R_Config_RIIC0_Master_Send_Without_Stop(SLAVE_ADDRESS, &TEMP_eep[0], 2);//読み込みアドレス指定

while (F_eep == 1) {//コールバック待ち
nop();
}
F_eep = 1;
T_INI = 2;

R_Config_RIIC0_Master_Receive(SLAVE_ADDRESS, &DATA[0],35);//データ読み込み

while (F_eep == 1 && T_INI != 0) {
nop();
}

  • 私は以前RX72MでRIICのマスターモードでEEPROM読み書きを試したことがあります。ただ、動きがおかしかったのでSCIのI2Cモードで実装しました。オシロスコープで波形を確認してRIICの動きがおかしいので何か条件や仕様制限があるかもしれません。そもそもRIICは「簡易」という接頭語がつくペリフェラルですし、SCIで思った通り動くのでRIICの調査は深く行っていませんがSCIのI2Cモードなら確実に動きます。もし、GPIOピンの割り当てでSCIが使えるならSCIのI2Cモードを使うことを検討されるのがいいです。

  • Yamamoto様ありがとうございました。

    SCIのIICモードを使うとのことでしたがハードウェアマニュアルを確認したところ、現在使用しているピンの端子機能がSCL、SDAのみとなっており、SCIへの変更ができなさそうでした。現状ハードの変更ができませんのでとりあえず今の接続にて改善を試みてみます。

  • 私はSCIで動かせたので早々にRIICをあきらめましたが、アプリケーションノートが出ているのでちゃんと動くとは思います(スマートコンフィギュレータではわかりません)

    https://www.renesas.com/jp/ja/document/apn/rx62t-group-communication-eeprom-using-renesas-i2c-bus-module-riic-rev100

    https://www.renesas.com/jp/ja/document/apn/rx600-rx200-series-i-c-bus-single-master-control-software-using-riic-serial-interface-rev103

    ※マスタなら最悪でもGPIOをソフトウェアで直接駆動という方法もあります。

  • 全く的外れかも知れませんが、

    static unsined char DATA[35];

    の様に、受信データが格納される変数の定義に、staticを付けて読み出しを試してみてもらえないでしょうか。

    (DATA[]がグローバル変数の場合は試す意味がありません、関数内でDATA[]を定義している場合)

    昔、I2CのAPI関数を使用した際、変数の記憶寿命と割り込みで変数にデータが格納されるタイミングの関係で、

    思った様にデータが格納されない事があった様な無かった様な…(と思い込んだだけかも知れません)。

    曖昧な記憶で申し訳ないですが。

  • DATA[]をグローバル変数で定義しています。

    その為意味ないかと思われますが、回答いただきありがとうございます。

  • こんにちは。動きそうに見えますが不思議ですね。ウチでRX231のテストに使っていたコードを貼り付けます。参考になるでしょうか?

    
    MD_STATUS IIC_Restart(uint16_t addr, void *sp, uint16_t sbytes, void *rp, uint16_t rbytes)
    {
        MD_STATUS stat;
        g_iica0_txEnd = g_iica0_rxErr = 0;
        R_Config_RIIC0_Start();
        if ((stat = R_Config_RIIC0_Master_Send_Without_Stop (addr, sp, sbytes)) == MD_OK)
        {
            while ((g_iica0_txEnd == 0) && (g_iica0_rxErr == 0))
            {
                __nop();
            }
            if (g_iica0_rxErr == 0)
            {
                if ((stat = R_Config_RIIC0_Master_Receive (addr, rp, rbytes)) == MD_OK)
                {
                    while ((g_iica0_rxEnd == 0) && (g_iica0_rxErr == 0))
                    {
                        __nop();
                    }
                }
            }
        }
        R_Config_RIIC0_Stop();
        return ((g_iica0_rxErr == 0) ? stat : g_iica0_ErrStat);
    }