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

皆様

はじめまして、Kaminari です。

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

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

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

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

Parents
  • こんにちは。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') 過去のリプライには、コード生成されたコードに関するものもあれば、チョコさんが作成されたライブラリのものもあります

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

  • チョコです。

    NoMaYさん、コード生成と付き合いは、まだ十年にはなっていませんが、もうすぐ十年にはなりますね。

    コード生成は、初期化から公開され、最初は公開されていた初期設定について、文句を言って、それなりに改善はされてきました。APIは後から追加されたもので、それも個々の周辺機能ことに追加されてきました。I2Cでもいくつか改善はされました(今よりひどかったのです)。デバイスの展開が大きく広がったことに対応が手一杯ですでにあるものの改良の優先順位は下がっているとのことでした。最後の修正は、確かリスタート対応でしたが、設定としては追加されたのですが、プログラムに問題があり、使い物になりませんでした。

    ということで、全く無視され続けたわけではありませんが、問題点の改善には至っていないのが、現状ですね。

    今は、新しいSCに期待しています。

  • チョコです。

    私はマニュアル読みです。

    RL78/G10が出て、それを入手してからは、実際にEEPROMを制御し、その後にLCD表示モジュール、センサと動かしてきました。

    2KのG10だったので、最初はアセンブラ記述でのプログラムでしたが、G13やG14の環境(テセラのUSBスティック)を入手したからCに移りました。元がハード屋なので、Cは見よう見まねで作っています。その代わり、できるだけ読みやすいように心がけています(凝ったプログラミングはできません)。

Reply
  • チョコです。

    私はマニュアル読みです。

    RL78/G10が出て、それを入手してからは、実際にEEPROMを制御し、その後にLCD表示モジュール、センサと動かしてきました。

    2KのG10だったので、最初はアセンブラ記述でのプログラムでしたが、G13やG14の環境(テセラのUSBスティック)を入手したからCに移りました。元がハード屋なので、Cは見よう見まねで作っています。その代わり、できるだけ読みやすいように心がけています(凝ったプログラミングはできません)。

Children
  • 皆様

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

    ハードウェア開発では手が足りず、制御ソフトウェアも手掛けることになりました。まだ駆け出しなので皆さんのCの勉強法は参考になりました。ありがとうございます。

    遅くなりましたが、(まだエラーが取り切れえおらず大変恐縮ですが)ソースをUpさせていただきます。fujita様も仰る通り完全に社内で閉じていればArduinoでいいのですが、少々難しい状況があり、Cで開発を進めております。

    自前の環境に修正、といいましてもまだまだ実力が伴わないのでほとんどごきゅおじいただきましたオリジナルで、アドレスを直して使わない処理を省略したようなものです(それでもエラーが残っています…)

    恐れ入りますが、お気づきの点がありましたらご指摘いただけますと幸いです。

    Test_controller_00.zip

  • チョコです。

    zipファイルにSmartManualDocsが入っているので、ファイルが8MBを超えてしまっています。

    ファイルを添付する場合にはこのフォルダ削除してから添付してください。大きすぎて、ダウンロードにすごく時間がかかってしまいました。実際にビルドしてみると以下のエラーが出ているようです。

    最初の「r_iic_lib.c(36):F0520005:ソース・ファイル "r_timer_user.h" を開くことができません。」はオリジナルに存在した "r_timer_user.h" がプロジェクトにないことが原因です。これはiic_lib.cで60マイクロ秒のウエイトを呼び出している処理のためです。r_iic_lib.cの36行目と207行目をコメントアウトすれば、このエラーはなくなります。

    「r_main.c(216):E0520268:ブロック内で実行文の後に宣言を置けません。」と「r_main.c(217):E0520065:";" がありません。」はないか見えない変なコードがあるようです。

    「r_main.c(325):E0520020:識別子 "status" は定義されていません。」と「r_main.c(334):E0520118:void 関数は値を返せません。」はオリジナルでは、以下のように定義されています。このローカル変数が定義されていないのが原因です。

    「r_main.c(492):E0520020:識別子 "FALSE" は定義されていません。」「r_main.c(497):E0520020:識別子 "TRUTH" は定義されていません。」はオリジナルのr_cg_userdefine.hには、以下のように定義されているので、これをr_cg_userdefine.hに追加してください。

    これ以外に実行時に問題になりそうなのが、WDTです。使っていないなら停止してください。

     

    ビルドエラーを中心に眺めましたが、まだ、シリアル関係に注意点があります。それは後程コメントします。

  • Test_controller_00_2.zip

    チョコです。

    >「r_main.c(216):E0520268:ブロック内で実行文の後に宣言を置けません。」と「r_main.c(217):E0520065:";" がありません。」はないか見えない変なコードがあるようです。

    よく確認したら、main関数の"}"が2個不足しているのが原因です。"}"を2個追加しました。

    オリジナルのサンプルプロジェクトの内容をできるだけ再現した格好で作り直してみました。

    その結果以下のワーニングだけになりました。当然ながら、動作確認はしていません。

    コード生成のUARTとIICA0がバッティングするので、IICA0の初期設定(void R_IICA0_Create(void))等を「r_iic_lib.c」に移動させ、コード生成の対象からIICA0を除きました。

    タイマ関係の機能はオリジナルを復活させて、「r_cg_timer_user.c」に持ってきています。r_main.cの最後の方に「delay_ms」がありましたが、そこはコメントアウトしています。「r_cg_timer_user.c」の「delay_ms」はタイマを使って時間計測を行っているので、時間は正確です。

    主に、エラー対応を行いました。main関数の処理については、確認はしていません。

    結果を添付しておきますので参考にしてください。

    以上

  • チョコ様、皆様

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

    ありがとうございます!!こちらの環境で動作テストしてみて、またご報告させていただきます。

    お忙しいところ、誠にありがとうございました。

  • チョコ様

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

    手元の環境で試してみましたが、以下のようにI2Cの通信がまだできていないようです。

    (比較に100kbpsのArduinoを用いています)

    ペリフェラルは400kbpsをサポートしているのですが、何か原因として挙げられそうなものはございますでしょうか?

    また、通信速度の差分があるのかと思いまして修正いただいたプロジェクトを100kbpsで再作成しますと以下のように

    エラーで停止します。

    お忙しいところ恐れ入りますが、修正するべき箇所を教えていただけませんでしょうか?

  • チョコです。

    以下のエラーは、コード生成でIICA0を有効にしようとしたことによるものと考えられます。

    先日提示したプロジェクトでは、コード生成でIICA0は使用しないようにしてください。

    IICA0関係はiic_lib.cの499行目から以下のR_IICA0_Create関数があり、これでIICA0を初期化しています。

    ここで赤で囲んだのが通信速度を設定しているところです。100kbpsにするなら、0x15→0x4C、0x14→0x55に書き換えてください。

    そのうえで、IICA0は使わないに設定しておいてください。

    下の波形を眺めると、100kbpsの方は、(8bit)スレーブアドレス0xA2に対してACK応答がありますが、400kbpsではNACK応答になっています。これは、ノイズがどの程度あるかに依存しますが、SDA 信号の立ち下がる直前にヒゲが見られますがこれが影響してはいないでしょうか。

    以上

  • チョコです。

    追加でコメントしておきます。

    波形から判断すると、RL78/G13以外の信号線の引き回しを含むハードウェアの問題が考えられます。

    また、ビルドでのエラーが出た部分ですが、これは、IICA0を有効にしてコード生成したからで、IICA0の初期化(R_IICA0_Create(void))の中に以下のようなコードが生成されます。

    これは、IICA0を使用すると指定したときにr_cg_serial.hで以下のように定義されているものを参照しようとしたからです。ここで、_4C_IICA0_IICWL_VALUEは先頭の数値(4C)が実際に設定される16進の値であることを示しています。

    先日提示したプロジェクトでは、IICA0はコード生成を使用しないで、初期設定はr_iic_lib.cに移動させていますが、値を生成(定義)してくれるところがないので、即値として0x4Cのような値を使うようにする必要があります。通信速度を変えるには、IICWL0とIICWH0の部分を手動で書き換えます。

  • チョコ様

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

    ありがとうございました。おかげさまで動きました。ブレッドボードを使っていたのですが、接触不良でデバイスが浮いておりました。波形をホスト端で見ていましたので気が付くのが遅くなってしまいました。

    これから必要なコマンドを追加して展開していきたいと思います。ありがとうございました。

  • チョコです。

    動作してよかったですね。まずは1歩前進ですね。

    波形を見ていると、RL78/G13のロウレベルがRTCのロウレベルより浮いているので、まだ接触不良が残っているようですね。

    この波形はRTCのAddress00(Control1)を読み出そうとしているようですね。

  • チョコ様

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

    本当にありがとうございました。ようやく先に進めそうです。

    ご指摘いただきましたところ、触ったら直りました。

    仰る通りで、一回テスト設定を解除し、その後読み出しを行う部分と思います。実は意図したのはmain()内のwhileループを無限に続けるつもりでしたので、I2Cからレジスタを読み出し⇔UARTで出力のループ内にはI2Cの0xA2は現れず、波形観測内では先頭が0xA3になると思っていましたので、少々思っていた動作と違っているようでした。

    恐れ入りますが、先程のプロジェクトでwhileループ内を繰り返す動作の場合、どのように書き直すといいか、教えていただけませんでしょうか?

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