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
吉光屋の次男坊様、鈴木と申します。
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をトリガとして、波形取得してみてください。
以上、よろしくお願いします。
チョコです。
鈴木さん,認識が甘いです。
このチェックを外しても,リスタートはできませんよ。Master_Sendの最初で,以下のようにIICBSY0ビットをチェックしているので,自分自身がバスを使っているのに変にエラーを検出してしまうので先に進めません。ここのif文を削除すれば,リスタートは可能になりますが。
どうしてもIICBSY0ビットをチェックしいなら,私が公開しているライブラリのように,自分自身がマスタとしてバスを使用中でないという条件とのANDにすべきです。