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では改善されていることを期待します。

    以上

  • 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ループ内を繰り返す動作の場合、どのように書き直すといいか、教えていただけませんでしょうか?

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

  • チョコです。

    >波形観測内では先頭が0xA3になると思っていましたので、少々思っていた動作と違っているようでした。

    RTCのスレーブアドレスが0xA3(リード)になると思っていたようですが、基本的な読み出し手順はRTCのレジスタのアドレス設定から始まるので、必ず0xA2で始まり、レジスタアドレスの指定を行い、その後リスタートをかけて0xA3で指定したレジスタアドレスからデータの読み出しを行います。

    つまり、0xA2から始まるのは正常な動作です。

    >先程のプロジェクトでwhileループ内を繰り返す動作の場合、どのように書き直すといいか、

    168行目から始まるwhileループのことかと思いますが、これは、下の反転した"}"(追加した2つの"}"の一つ目)までのループになっているはずです。

    ここで、問題なのは、UART0での送信完了しても、P7_bit.no1に接続したLEDが点灯したままになっていることです。ここのwhileループを抜けたら、LEDを消灯するべきです。これが消灯していないからきちんとループしていないと勘違いしてはいないでしょうか。

    また、133~147行と148~162行目で全く同じことをやっていますがこれは、おかしいのではないでしょうか。RTCのアプリケーションマニュアルの30ページに以下の記述がありますが、これにあっていません。

    まずは、この初期化を行ってから、無限ループに入るべきでしょう。

    また、その下に電源投入時の処理例があります。

    現状は、R_MAIN_UserInitで以下のように250msしか待っていません。

    wait_msの引数は8bitで、1000msの指定はできないので、wait_ms(250);を4回呼び出すようにすべきです。

    また、RTCから読み出したデータはBCD形式の数値です。今は、読み出したデータを世のままUARTで送信していますが、ASCIIコードに変換して送信しなくていいのですか。現状は、R_UART0_Send( (uint8_t *)g_read_ram, sizeof(g_read_ram) );で送信していますが、これは、送信バッファのデータがASCII-Z形式のようにビジブルコード+0x00ターミネートのやりかたです。ここらあたり(データ形式)を明確にすべきです。

  • チョコ様

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

    ご説明いただき、ありがとうございました。読み出しでも0xA2となるのが正しいことが理解できました。

    おかげさまでご指摘いただきました箇所の修正にも取り掛かれるようになりましたので、これから修正してきたいと思います。

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

Reply
  • チョコ様

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

    ご説明いただき、ありがとうございました。読み出しでも0xA2となるのが正しいことが理解できました。

    おかげさまでご指摘いただきました箇所の修正にも取り掛かれるようになりましたので、これから修正してきたいと思います。

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

Children
No Data