IICAでスタート・ストップコンディションが生成されない

16ピンのRL78/G10(R5F10Y47)を使い、UARTとI2Cの通信させようとしています。

RL78は初めてなので、コード生成プラグインを利用しています(UARTはSAU、I2CはIICAを使用)。

UARTの方は問題ないのですが、I2Cの方は全く動作しません。
オシロでI2Cバス見たところ、SCLAとSDAAの両端子とも、Hに貼り付いたままでスタートを生成していない事が判りました。

更に原因をたどると、
 「R_IICA0_Master_Send() でスタートが生成しない」
 →「SPD0が0のままなので、STT0をセットしても動作しない」
 →「リセット時にSPD0がクリアされている」
と判明しました。

SPD0に1をセットするためには、今度はストップコンディションを生成しないといけないのですが、
R_IICA0_StopCondition() を実行してもストップを生成しません。

現状のプログラムは、コード生成プラグインで生成されたコード上に、
① main()のループ内にて、条件成立でR_IICA0_Master_Send() を実行。
②  R_MAIN_UserInit() にて、EI() の後にR_IICA0_StopCondition() を実行。
となっています。

スタートやストップコンディションを生成させるために、何かもう一処理必要でしょうか?

開発環境はCS+ for CC:V5.00.00、CC-RL:V1.04.00です。

よろしくお願いします。

  • 吉光屋の次男坊 さん、こんにちは。NoMaYと申します。

    以下に関してですが、R_RIICA0_Start()を(R_IICA0_Master_Send()を呼ぶ前に)呼んでいないのではありませんか?

    > オシロでI2Cバス見たところ、SCLAとSDAAの両端子とも、Hに貼り付いたままでスタートを生成していない事が判りました。
    > 更に原因をたどると、
    >  「R_IICA0_Master_Send() でスタートが生成しない」

  • 吉光屋の次男坊 さん、こんにちは。NoMaYです。

    ごめんなさい。横着して自分でRL78でコード生成せず、RXスマートコンフィグレータで生成したソースから推測で、ものを言ってしまいました。自分でRL78でコード生成させたところ、R_RIICA0_Start()という関数はRL78コード生成機能で生成したソースには存在しないことに気付きました。申し訳ありませんでした。

  • 吉光屋の次男坊 さん、こんにちは。NoMaYです。

    少し思い出したことがあります。以前に、チョコさんという人がRL78/G10でIICA0で動作するライブラリを作成されていたのですが、それを試してみてはどうでしょうか?(また、この時、コード生成機能のとあるバージョンでIICA0に関して致命的不具合が発覚したことも思い出しました。)

    シリアルインターフェイスIICAでデータを取得できません
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/4081/iica
     

  • NoMaYさん、情報ありがとうございます。
    リンク先の内容を確認します。

    >(コード生成機能のとあるバージョンでIICA0に関して致命的不具合が発覚したことも思い出しました。)

    開発環境のバージョンアップで改善される可能性も有りますね。
    こちらの方も試してみます。
  • チョコです。

    対策は進んでいるようですが,参考までに一言コメントしておきます。

    > 「R_IICA0_Master_Send() でスタートが生成しない」
    > →「SPD0が0のままなので、STT0をセットしても動作しない」
    > →「リセット時にSPD0がクリアされている」
    これは,勘違いですね。手元には,最新の環境しかないのですが,
    コード生成のR_IICA0_Create関数には,"STCEN0 = 1U;"の設定があり,
    IICAフラグ・レジスタ0(IICF0)のSTCEN0ビットをセットしています。
    これは,「ストップ・コンディションを検出しなくてもスタート・コン
    ディションを生成許可」にします。
    つまり,単純にスタート・コンディションを出すことができます。
    今回の問題は,NoMaYさんもコメントしているように,ある特定の版の
    コード生成の問題と思われますので,最新版に変更すれば回避できます。
    この問題かは,main関数が始まるときに,P07とP06がともに1になって
    いることで確認できます(ともに0が正しい設定です)。
  • チョコさん、鈴木さん、コメントありがとうございます。

    古いバージョンでは、P07とP06がともに1になっていました(R_IICA0_Create() にて P0 |= 0xC0U; と記載)。
    最新版に上げたところ、0になるように修正されました( P0 &= 0x3FU; に修正)。
    これで動作すると思うのですが、バージョンアップ後、E2 Lite でのデバッグ時に
    CS+ が応答しなくなる状況で、まだ試せていません・・・

    手元にはオシロしかないので、動く状況になりましたら、SDA の立ち下りエッジをトリガにして、
    波形取得してみます。
  • チョコです。
    鈴木さん,問題になっているのは,IICA0で,これはRL78/G10では16pinにしか内蔵されていません。
    R5F10Y16にはIICA0はなく,試されたIIC00は簡易I2Cであり,ここでは,無関係ですよ。
  • 吉光屋の次男坊様、鈴木と申します。

    CS+ for CC V5.0 + RL78/G10(R5F10Y16)で試してみましたところ動作するようです。

    R_IIC00_Master_Send( 0x80,  gData, 2 ); // uint8_t gData[2] = { 0x2, 0x3 };

    上記の図は、送信したあとに時間待ちを行っております。

    I2Cの通信は割り込みで処理されますので、R_IIC00_Master_Send後に

    時間待ちを行うか、送信完了割り込みを待つか、どちらかの処理が必要です。

     

    また、R_MAIN_UserInit()は最初に呼ばれるコードです。

    プログラムスタート時に一度だけ呼ばれます。

    そこでR_IICA0_StopCondition() を行えば、SDAのみが変化します。

    SDAをトリガとして、波形取得してみてください。

     

    以上、よろしくお願いします。

     

  • チョコ様、すみません、R5F10Y47で確かめます。しばらくお待ちください
  • チョコです。

    鈴木さん,認識が甘いです。

    このチェックを外しても,リスタートはできませんよ。Master_Sendの最初で,以下のようにIICBSY0ビットをチェックしているので,自分自身がバスを使っているのに変にエラーを検出してしまうので先に進めません。ここのif文を削除すれば,リスタートは可能になりますが。

    どうしてもIICBSY0ビットをチェックしいなら,私が公開しているライブラリのように,自分自身がマスタとしてバスを使用中でないという条件とのANDにすべきです。