IICA用API 関数を用いたサンプルコードを探しております

皆様

はじめまして、Kaminari です。

RL78G13 (R5FR5F100LE)とCS+ (V8.05.00)でI2Cデバイスの設定と、読み出しを行うセットを製作しようとしております。

内容は、次のようなものです。

チョコ様のIIC通信のマスタ側のプログラムや書籍も参考にさせていただいて作成していたのですが、C言語も初心者のため、おはずかしながら生成されたAPI関数を用いるためにはどう直せばいいのかわからず滞っております。

周囲も詳しい者がおらず、また上記構成を起点として機能を追加する予定のため生成されたIICA関数でIICアクセスを行いたいと思っております。恐れ入りますがIICA用API関数を用いたI2Cアクセスのサンプルプログラムがありましたら、(または場所をご存知でしたら)ご教示いただけませんでしょうか?

  • チョコです。

    RL78/G13のIICA0のマスタ処理のアプリケーションノートの第2版は、私のAPIに類似したライブラリを用いた使用例になっています。

    コード生成のAPIは使っていませんが、ライブラリ(r_iic_lib.c)とその使い方の例がmain関数になっており、API関数の説明やフローチャートも記述されているので、参考になるかと思います。

    RL78/G13の「アプリケーションノート、ホワイトペーパー」の欄で、「show 61 more...」をクリックすると見れるようになります。

    RL78/G13 シリアル・インタフェースIICA(マスタ送受信)CC-RL

    以上

  • チョコ様

    Kaminari です。

    ご教示いただき、ありがとうございました。

    早速読んでみます。

  • お世話になっております。Kaminariです。

    ご教示いただいたアプリケーションノートを手元の環境に合わせて修正中なのですが、動作に至っておりません…。代理店にも問い合わせてシンプルなI2Cのサンプルコードが無いかを質問してみたのですが、見当たらないとの回答で行き詰まっております。また、代理店からはコード生成ツールの使用を勧められましたが、私のレベルで生成されたコードを使いこなせておらず、今に至っております

    プロジェクトの都合、Cで記述する必要がありまして、恐れ入りますが、初心者向けにできるだけシンプルに記述されたRL78/G13のI2Cのサンプルコードがありましたらご教示いただけませんでしょうか?

    よろしくお願いいたします。

  • こんにちは。imudakです。

    考えてみたのですが、コード生成ツールを使わない場合
    様々なレジスタの設定を手元のマイコン環境に合わせて自分で書かないといけないので、
    サンプルコードはどうやってもシンプルにはなりませんね…

    結局、コード生成ツールで吐き出したコードを使ったサンプルが一番シンプルかと。

    コード生成プラグイン
    www.renesas.com/.../code-generator-plug

    コード生成ツール ユーザーズマニュアル RL78 APIリファレンス編
    www.renesas.com/.../code-generator-users-manual-rl78-api-reference

    3.3.32 シリアル・インターフェースIICA
    使用例(マスタ送信) P488
    からサンプルコードが載っています。ご参考まで。

  • チョコです。

    >様々なレジスタの設定を手元のマイコン環境に合わせて自分で書かないといけないので、
    >サンプルコードはどうやってもシンプルにはなりませんね…

    コード生成には、初期設定部とAPI部に分けることができます。基本的に、初期設定は使い方が決まれば、設定はほぼ決まってしまうので、初期設定は使うべきです(ですから私は初期設定だけにして使用しています)。

    コード生成の問題はAPI部です。imudakさんが参照されているマニュアルのP488で見ると、以下のように、「マスタ・エラー(コール バック機能設定)」は使用しないとなっていますが、これは問題です。データを送信することだけに注目しすぎて、それ以外のことが見えなくなっています(スレーブ・アドレスに対してACK応答がなかった時にどうするかが抜けている)。しかも、このように設定してしまうと受信機能は全く使えなくなります。

    さらに問題なのは、次のページの内容です。印をつけた行で送信のためのAPIを呼び出していますが、その後どうすればいいのか全くケアされていません。「R_IICA0_Master_Send(SLAVE_ADDR, (uint8_t *)g_iica0_tx_buf, 4U, 128U);」で呼ばれているAPI関数は単純に送信処理を起動するだけのものです。決して送信が完了して戻ってくるわけではありません(コード生成のシリアル通信のAPIは共通して起動だけで戻ってきます)。ここらは、今まで何度もかふぇルネで問題になったところです。

    初心者は、R_IICA0_Master_Send関数から戻ってきたら、送信は完了していると勘違いしてトラブっています。

    しかも、その下にあるINTIICA0割り込み処理で送信が終わった時の処理部ですが、

    やっていることは単にIICA0の動作を停止しているだけです。これはまりにひどすぎます。通信が完了したことは、ここでしかわかりません。なのに、他の処理部(R_IICA0_Master_Send関数を呼び出した処理部)になんの通知もしないで終わるなんて言うのは問題外です。

    ここらに対応しようとすると、INTIICA0の割り込み処理に手を加える必要があります。具体的にはIICA0の通信状態を示すフラグを準備し、通信を起動するときにそのフラグをクリアし、通信完了のコール バック機能のところでフラグをセットするだけです。そのためのフラグをコード生成側で準備しておけば、初心者でも使いやすくなるのですが。

    これができていないから、最新のRL78/G13のIICAのAPNのサンプルコードでコード生成は初期化だけになってしまっています。

    長々と書いてきましたが、これが、コード生成のAPIの問題点で、数年前から問題点を指摘していますが、改善されないので、独自のライブラリを作って対応しています。

    新しいG23用のSmart Configuratorでは改善されていることを期待します。

    以上

  • チョコさんこんにちは。


    > 長々と書いてきましたが、これが、コード生成のAPIの問題点で、数年前から問題点を指摘していますが、
    > 改善されないので、独自のライブラリを作って対応しています。

    ご指摘の問題点について全く異論ありませんし、そのように改善すべきかと思います。

    ただ、私が気になっているのは、この

    > ご教示いただいたアプリケーションノートを手元の環境に合わせて修正中なのですが、動作に至っておりません…。

    「手元の環境に合わせて修正中」の部分です。
    この壁はひたすら高くて、下手すると乗り越えられないのではないかと思っています。

    個人的には、

    「環境に合わせた修正」 >>>>> 「チョコさんご指摘の問題点」

    くらいのイメージですね…

    チョコさんの話は、抽象化したロジックの話で、
    組み込み知らない別プログラマでも理解できる余地がありますが、
    「環境に合わせた修正」は、あの分厚いユーザーズマニュアルをちゃんと理解しないと
    どうにもなりません…

    だったら、GUIポチポチしたら環境に合わせたAPI作ってくれるコード生成ツール使って
    不十分でも動くものをまず作って、不足分はそこから考えたら良いのでは無いかと思います。

    そして余裕ができたら、コード生成ツールの生成コードの中読んだり、自分で独自API作ったりすれば
    良いかと。

  • チョコです。

    >「環境に合わせた修正」は、あの分厚いユーザーズマニュアルをちゃんと理解しないと

    その必要はないはずです。アプリケーション・ノートにはそこで使用している関数の説明が書かれています。しかも、main関数はそれらの関数(API関数)の使用例になります。つまり、RL78のマニュアルは読まなくても、使えるはずです。少なくとも、コード生成APIの役に立たないマニュアルよりは、実際に使っている例なので簡単なはずです。

    それでわかるかどうかは、また別問題だと思いますが。

    業務関係で公開できないことがあるのかもしれませんが、提示されている情報が漠然としすぎているので、具体的なコメントができません。

  • こんにちは。NoMaYです。

    思ったのですが、チョコさんは十年以上も、コード生成されたコードでは不十分である、コード生成されたコードは初学者には勘違いされ易い、と言い続けていて、でも、それをルネサスさんが十年以上も、無視し続けている、という実情かと私は思うのです、、、

  • チョコ様、imudak様、NoMaY様、皆様

    皆様コメントありがとうございます。kaminariです。

    見ていただけるように今のコードの書き替えと、仕様を書いておりますので、恐れ入りますが少々おまちいただけますでしょうか?

    ところで皆さん、どうやってI2C(だけではないと思いますが)の書き方を習得されたのでしょう・・・?

  • こんにちは。NoMaYです。

    > ところで皆さん、どうやってI2C(だけではないと思いますが)の書き方を習得されたのでしょう・・・?

    I2Cであれば、きっと、こんな感じかと思うのです。

    (1) 年配の方はハードウェアマニュアル読んで
    (1') 身近に親切な年配の方がいて、その人に教わりつつ、ハードウェアマニュアルを読んで
    (2) 若い人(?)はコード生成されたソースを読み解きながら
    (2') コード生成されたコードは不十分(ちょっと危なかったり)とはいえ全く動作しない訳ではない、ので動いたのなら使い続ける
    (3) チョコさんが十年以上かふぇルネで活動されているので、グーグル検索にヒットした過去のリプライを見て動くようにした
    (3') 過去のリプライには、コード生成されたコードに関するものもあれば、チョコさんが作成されたライブラリのものもあります

    あと、どういうふうに動作しないのか書かれていませんでしたけれど、話の顛末としてたまにあるのが、動作しない原因はプルアップを忘れていたことでした、とかもありますよ、、、