stlと申します。
RA2E1マイコンで簡易I2Cの機能を使用しています。デバッグを実行してみると、送信用のAPI関数の戻り値としては「成功」となりますが、オシロスコープでピンの出力を確認すると、SDAとSCLKの出力波形が確認できず、関数の実行タイミングで5Vから0Vに変化するだけでした。 この問題について何かわかることがありますでしょうか?
チョコです。
RL78は日頃使っていますが、RAは使ったことがありませんので、想像になりますが、コメントさせてもらいます。
おそらく、SCを使ってコード生成されていると思いますが、送信用のAPIは送信処理を起動するだけで戻ってきている
のではないでしょうか。
また、「SDAとSCLKの出力波形が確認できず、関数の実行タイミングで5Vから0Vに変化するだけでした。」は、
スタート・コンディションが発行された状態ではないかと思います。
つまり、通信が開始した時点までの波形しか確認していないのではないでしょうか。
通信が完了したことを確認して、そこまでの波形を確認されることをお勧めします。
以上
ご回答ありがとうございます。
>>通信が完了したことを確認して、そこまでの波形を確認されることをお勧めします。
送信用のAPIが、通信が完了までいかなくても起動した段階で「成功」を返してきている可能性があるということでしょうか?
>送信用のAPIが、通信が完了までいかなくても起動した段階で「成功」を返してきている可能性があるということでしょうか?
はい、そうです。通信関係のAPIのこのことがかふぇルネでも結構問題になっていました。
RAのSCは見たことはありませんが、RL78やRXのSCの通信関係のAPIは通信完了まで待たずに戻ります。
RL78のSCAPIマニュアルをダウンロードしたところ、いつの間にか戻り値がなくなっていました。
これだけでは、判らないので、RL78/G15で実際にIIC00で送信APIを生成してみました。
下のように、スレーブアドレスをIIC00に書き込んだところで戻っています。また、APIマニュアルの記述のように戻り値はなくなっています。
SCは少なくともベアメタルでのマルチタスクをサポートしているので、通信完了を待つことはありません。
これは、RAでも同じだと思われます。(出ている症状からも送信完了を待たないのは明らかです。)
APIの戻り値が送信完了を示しているわけではないとしたら、送信が完了していることの確認は、オシロスコープでそこまでの波形を見る以外方法はないということになるのでしょうか?
あくまで、RL78/G15のケースですが、以下に示すIIC00の割り込み処理(Config_IIC00_user.cの「r_Config_IIC00_interrupt関数)の中で、指定した数のデータの送信が完了すると、147行目で r_Config_IIC00_callback_master_sendend関数を呼び出しています。
このr_Config_IIC00_callback_master_sendend関数で完了したことを示すフラグをセットするような処理を書き込むことができるようになっています。この、74行目と75行目の間にそのような処理を追加することになります。
ここまで、きちんとサポートするようにずっと訴えているのですが、いまだに対応してもらっていません。
RAで類似のコールバック関数を探してそこでフラグをセットして、そのフラグがセットされるのを待つようにしてください。
RAの場合だと、コールバック関数の引数に送信完了を示す値が代入されるようになっていました。そちらを確認してみると、そもそも送信が完了しませんでした。原因を探してみます。
R_IIC_MASTER_Open
R_IIC_MASTER_CallbackSet
R_IIC_MASTER_SlaveAddressSet
SDAとSCLがLowに落ちると書いてあるのでスタートコンディションには入っていそうですが、上の3つはR_IIC_MASTER_Writeの前に実行していますよね?
OpenはAPI関数で実行しています。コールバックとスレーブアドレスセットはプロパティで設定を行っています。