RL78G13 STARTER KIT サンプルコード動かない。I2C-MASTER

こんにちは、ソフトは趣味レベルのfultonpapaといいます。
会社に余っていたRL78/G13StarterKit(以下RSK)があるので、持ち帰って
勉強してます。CS+ forCA,Cx

Tutorialプロジェクトに多くのサンプルがあり、いろいろ試せて良いですが
IIC MASTER(サブプロジェクト)のサンプルが動きません。
スターターキットのコードが動かない時、どこから手をつけたらよいでしょうか?

ジャンパやプルアップ等はI2C用に設定してあり、ダミーのスレーブをつけてます。
オシロはあるので、波形は見られます。

※状況
  キー割込みで通信開始しますが、始にSCLA0にLoがでてそのままLoレベルのまま。
  リセットするとまた5Vに復帰。SDAはずっとHiです。
  StartConditionが出ないので、通信のつの字の前で躓いてます。
  ボードは購入状態と変わらない状態で(ジャンパとかは設定)
  スレーブはArduinoでは標準ライブラリで正常に動作してます。
  
 1)デバッグの勉強になるので、レジスタや主要関数を追跡する。
   マニュアルのフローとサンプルのr_serial.cを解読していく。
   現在取り組み中ですが、先が見えず、挫折するかもしれない。
 2)もしかしてコード生成サンプルコードが違ってると疑う。
   以前、RSKのLINのサンプルコードは違ってた。
 3)RSKで動いている人のコードを入手して彼我解析。
 4)CS+ CA,CX用の別のサンプル、事例を探す。(見つかってない)
 5)IICAを使わず、GPIOで動作する最小限のライブラリを自作する。
 6)本フォーラムにCC-RLのサンプル等あるのですが、CACXとの違いが
   わからない。好きなほうを使えるのでしょうか?

乱筆ですいません。
趣味なので楽はするつもりは無いので、なにか
初心者向けに情報があればご提供下さい。

 

 

Parents
  • チョコです。

    fultonpapaさん,今更CS+CA78K0Rで始めるのはお勧めできません。これから始めるならCS+CC-RLをお勧めします。

    RL78/G13StarterKitに付属しているプログラムはサブプロジェクトが複数含まれたような形式になっていますが,通常はこのような使い方をするのはそれほど大くないとかと思います。特に,I2C関係はスレーブの制御手順に従った通信手順が必要で,RL78/G13StarterKitに付属しているプログラムを少し変更したくらいで制御できるとは思わないでください。

    RL78のI2C関係は,かふぇルネのサンプルプログラム等にかなり多くの情報をアップしています。そこにはエクセルファイルがあり,登録してある情報の一覧がリンク付きでリストされています。リストの上の方にかなりI2C関係の情報やプロジェクトがあるので,そちらを参照してみてください。

  • IKUZOさん、チョコさん ありがとうございます。
    RSK導入当時、CS+のアップデート情報で
    RL78はCACXとあったため、CACXを使ってました。
    カフェルネのサンプルはCC用なので。CCもインストールしたので、試してみます。
    CACXのプロジェクトを改造して、次のプロジェクトにしてきたので
    CCと分ける必要があるので注意しないといけないですね。
  • チョコです。
    RL78/G13RSKの回路が分からないので,IICバスのプルアップ抵抗がどうなっているかわかりませんが,きちんとプルアップされているとしてコメントします。
    スイッチサイエンスのHPを見ると,Arduino用のサンプルコードがあったので,それを眺めてみました。
    気になったのは,そこでPCA9632のスレーブアドレスが0x62と7bitでのアドレスが書かれています。RL78では,スレーブアドレスは8bitで表現するので,0xC4に置き換える必要があります。それ以外は,コード生成の結果を使えば十分アクセスできるような内容でした。コード生成のAPIで,送信用のR_IICA0_Master_Send関数だけで済みそうです。注意する必要があるのは,コード生成は割り込みで処理するようになっており,送信を起動しただけで関数から戻ってしまうことです。(ここらは,過去のスレッドにもあるので,探してみてください。それで,分からなければ,かふぇルネで再度書き込んでください。)
  • チョコです。

    初心者はこちらの方が使いやすいかと思います。

    同じく,サンプルプログラム等にあるプロジェクトですが,「IICA0基本制御(ポーリング処理)」の方がArduinoの例に近いかもしれません。

    https://japan.renesasrulz.com/cafe_rene/m/sample_program/244

     

    プログラムとしてはRL78/G14でRTCのデータをI2Cバス用のLCDに表示しているものです。コード生成は初期設定のみ使用しています。

    r_main.cの中にIICA関係の関数があります。ここでは,割り込みはスタンバイの解除で使用しているだけで,I2Cはポーリングで処理しています。

    Wire.beginTransmission関数に相当するのが,R_IICA0_start_condition関数です。ただし,スレーブアドレスは65行目で#defineで0xA0と宣言しているので,ここを0xC4に変更してください。

    Wire.write関数に相当するのが,R_IICA0_transmit関数です。

    Wire.endTransmission関数に相当するのが,R_IICA0_StopCondition関数です。

     

    これらの関数を使うだけですが,必ず割り込み禁止(DI)状態で動作させてください。

     

     

  • 皆さんありがとうございます。
    カフェルネでダウンロードしたCCRL2、G10、I2Cまとめなどなど、参考になってます。
    ばらばらだった情報が少しづつ繋がってくる。ここら辺が、楽しいところですね。

    1)調査状況
     R_IICA_Create()はCACXのCGと同等でした。
     ポートの設定、アドレス等OKです。
     初期設定は良いと思い、I2C関数の追跡に入ってます。
     STCENn=1として、ストップコンディション待たずに
     STTn=1とするのですが、SDAレベルは変わりません。
     
    2)状況2
     CS+ for CCをインストールしたので、
     ダウンロードしたCCRL2.zipのプロジェクトをLED用に加工して試しました。
     悔しいことに見事に動いてます。
     CCRLであればRSKもQB-R5F100LE等でも開発はできることがわかりました。
     WEBでもCACXがなくなるように書いてあったので
     新しいテーマはCCRLを利用したいと思います。

    ただ、過去のCACXプロジェクトをいくつか引用したいので、
    r_iic_libを使わず、コード生成のr_cg_serial.cを利用して出来るように
    したく、状況1の解析と対応を進めたいと思います。
    むりだったら、r_iic_libをCACXに移植を試みます。

    質問です。
    1)先のREで関数を使う時DIするとなってます。
      main全体は割込み許可なので、
      I2C関数の中でDI,EIでくくるというのは駄目ですか?
Reply
  • 皆さんありがとうございます。
    カフェルネでダウンロードしたCCRL2、G10、I2Cまとめなどなど、参考になってます。
    ばらばらだった情報が少しづつ繋がってくる。ここら辺が、楽しいところですね。

    1)調査状況
     R_IICA_Create()はCACXのCGと同等でした。
     ポートの設定、アドレス等OKです。
     初期設定は良いと思い、I2C関数の追跡に入ってます。
     STCENn=1として、ストップコンディション待たずに
     STTn=1とするのですが、SDAレベルは変わりません。
     
    2)状況2
     CS+ for CCをインストールしたので、
     ダウンロードしたCCRL2.zipのプロジェクトをLED用に加工して試しました。
     悔しいことに見事に動いてます。
     CCRLであればRSKもQB-R5F100LE等でも開発はできることがわかりました。
     WEBでもCACXがなくなるように書いてあったので
     新しいテーマはCCRLを利用したいと思います。

    ただ、過去のCACXプロジェクトをいくつか引用したいので、
    r_iic_libを使わず、コード生成のr_cg_serial.cを利用して出来るように
    したく、状況1の解析と対応を進めたいと思います。
    むりだったら、r_iic_libをCACXに移植を試みます。

    質問です。
    1)先のREで関数を使う時DIするとなってます。
      main全体は割込み許可なので、
      I2C関数の中でDI,EIでくくるというのは駄目ですか?
Children
  • チョコです。
    ポーリングによる制御では,IICA0の制御ではIICA0と60us待ちで使うTM03がともに割り込みを禁止しておく必要がありますが,EI();とDI();で制御するよりは,R_MAIN_UserInit関数でRTCの初期化の後でTM03を起動しています。そこに「TMMK03 = 1;」と「IICAMK0 = 1;」を追加してください。これで,割り込み許可(EI状態)でもIICA0とTM03の割り込みはマスクされたままなので,動作は変わらないはずです。
    おそらくRTCは使わないと思うので,RTC関係を削除すれば,割り込み許可で動作させることは可能です。
  • fultonpapaです。
    我流で、すごく初歩的ですが「あッそーか!」がありました。
    >>ポーリングによる制御では,IICA0の制御ではIICA0と60us待ちで使う
    TM03がともに割り込みを禁止しておく必要がありますが,

    とあったのに、サンプルG14_IIC_POLL.mtpjでメインの最初に割り込み禁止して
    タイマーとか使ってるので疑問でした。
    割り込み禁止でも、タイマーは動いているんだと気づきました。
    2日かかりましたが、すごくうれしくて。