皆様
はじめまして、Kaminari です。
RL78G13 (R5FR5F100LE)とCS+ (V8.05.00)でI2Cデバイスの設定と、読み出しを行うセットを製作しようとしております。
内容は、次のようなものです。
チョコ様のIIC通信のマスタ側のプログラムや書籍も参考にさせていただいて作成していたのですが、C言語も初心者のため、おはずかしながら生成されたAPI関数を用いるためにはどう直せばいいのかわからず滞っております。
周囲も詳しい者がおらず、また上記構成を起点として機能を追加する予定のため生成されたIICA関数でIICアクセスを行いたいと思っております。恐れ入りますがIICA用API関数を用いたI2Cアクセスのサンプルプログラムがありましたら、(または場所をご存知でしたら)ご教示いただけませんでしょうか?
チョコです。
>「環境に合わせた修正」は、あの分厚いユーザーズマニュアルをちゃんと理解しないと
その必要はないはずです。アプリケーション・ノートにはそこで使用している関数の説明が書かれています。しかも、main関数はそれらの関数(API関数)の使用例になります。つまり、RL78のマニュアルは読まなくても、使えるはずです。少なくとも、コード生成APIの役に立たないマニュアルよりは、実際に使っている例なので簡単なはずです…
チョコ様
お世話になっております。kaminariです。
ありがとうございました。おかげさまで動きました。ブレッドボードを使っていたのですが、接触不良でデバイスが浮いておりました。波形をホスト端で見ていましたので気が付くのが遅くなってしまいました。
これから必要なコマンドを追加して展開していきたいと思います。ありがとうございました。
動作してよかったですね。まずは1歩前進ですね。
波形を見ていると、RL78/G13のロウレベルがRTCのロウレベルより浮いているので、まだ接触不良が残っているようですね。
この波形はRTCのAddress00(Control1)を読み出そうとしているようですね。
本当にありがとうございました。ようやく先に進めそうです。
ご指摘いただきましたところ、触ったら直りました。
仰る通りで、一回テスト設定を解除し、その後読み出しを行う部分と思います。実は意図したのは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ターミネートのやりかたです。ここらあたり(データ形式)を明確にすべきです。
ご説明いただき、ありがとうございました。読み出しでも0xA2となるのが正しいことが理解できました。
おかげさまでご指摘いただきました箇所の修正にも取り掛かれるようになりましたので、これから修正してきたいと思います。
ありがとうございました。
RL78/G12のI2C通信ではまり、こちらにたどり着きました。
チョコさんが書いていた「初心者は、R_IICA0_Master_Send関数から戻ってきたら、送信は完了していると勘違いしてトラブっています。」
まさにこれでした。
通信完了していると思い、次の処理(別のI2C通信)に進んでいたため、送信が途中で止まっていました。
「API呼び出し時」にフラグをセットし、「INTIICA0割り込み処理で送信が終わった時の処理部」でフラグをクリアするようにし、メイン関数内でこのフラグを見て送信完了を確認してから、次のI2C通信を行うようにした所うまく行きました。
貴重なアドバイスありがとうございます。