RXマイコン DMA or DTCを使ったI2C通信

はじめて投稿します。

RXでDMAかDTCを使ったI2C通信を行うことになりました(接続先はEEPROM)。
実装するために参考になるアプリケーションノートやWebサイトがありましたら
お教え頂けないでしょうか。よろしくお願いします。

  • こば さん、こんにちは。NoMaYと申します。

    そのものズバリでは無いですけれども、以下のFITモジュールリストのウェブページを開いてEEPROMの文字列を検索すると、以下の3つのFITモジュールが見付かります。この辺りが、取っ掛かりではないかな、と思いました。(実は、ルネサスドキュメント検索、CS+のスマートブラウザ、e2 studioのスマートブラウザ、と試してはみたのですけど、あまりパッとしない検索結果になりましたので、このFITモジュールリストのウェブページの方が良そうそうです。)

    ただ、取っ掛かり、とは書きましたけれども、初心者の方であれば、FITモジュールを改造することは困難かと思いますので、EEPROMの方をI2C方式のものではなくSPI方式のものに変更した方が得策かも知れない、とも思います。

    FITモジュールリスト
    www.renesas.com/jp/ja/software-tool/fit-modules-list

    EEPROMアクセス クロック同期式制御モジュール    ← SPIですがDMA/DTC対応です、RX23T対応です
    EEPROMアクセス I2Cバスインタフェース(RIIC)モジュール    ← I2CですがDMA/DTCは非対応です(そもそもRIIC操作レイヤが非対応なのです)、RX23T非対応です
    EEPROMアクセス 簡易I2Cモジュール    ← I2CですがDMA/DTCは非対応です(そもそも簡易IIC操作レイヤが非対応なのです)、RX23T非対応です

     
    あと、ルネサス社のEEPROMを採用されるのであれば、以下のウェブページも参考になるかな、と思います。(ただ、こちらもDMAやDTCは非対応です。アプリケーションノートの中でDMAの文字を検索しても見付かりませんでした。)

    I2CシリアルEEPROMドライバ
    www.renesas.com/jp/ja/software-tool/i2c-serial-eeprom-driver

    上級者の方ですと、RXスマートコンフィグレータのCGコンポーネントで、あるいは全て自前の手書きで(例えば、DMAやDTCは未使用だと思いますけど、以下のウェブページなど)、実現することも出来ると思いますが、グーグル検索してみても、初心者向け/上級者向けを問わず、近そうなもの(DMAやDTCを使うもの)は無さそうでした。

    RX23TのIICを使い、EEPROMを制御
    esyokunin.dee.cc/13x_MpuGakusyuu2/241_Rx23tRiic_EepRom/241_Rx23tRiic_EepRom.html

    [関連リンク]

    Google検索: Renesas RX EEPROM IIC
    www.google.com/search?q=Renesas+RX+EEPROM+IIC
     

  • こんにちは。NoMaYです。

    FITモジュールリストのウェブページによると、以下のモジュールはRX110/111/113/65Nのみ対応となっていますが、ソースコードをざっと見た感じでは、それらのデバイスのみに制限されるような記述は無さそうな印象ですね、、、

    EEPROMアクセス I2Cバスインタフェース(RIIC)モジュール    ← I2CですがDMA/DTCは非対応です(そもそもRIIC操作レイヤが非対応なのです)、RX23T非対応です
    EEPROMアクセス 簡易I2Cモジュール    ← I2CですがDMA/DTCは非対応です(そもそも簡易IIC操作レイヤが非対応なのです)、RX23T非対応です

     

  • チョコです。

    RXのIICの割り込みがどうなっているか分かりませんが、IICは1バイト転送ごとに判定を行うのが普通なので、DMAやDTCとかはあまり使わないですね。

    スレーブをEEPROMに限定すれば、データの転送に限定することで、使えないことはないかもしれませんが、EEPROMとの通信を十分に理解していないと実現は難しいでしょうね。

    EEPROMへの書き込みでは、その容量によって一度に書き込みができる最大バイト数が異なり、容量が小さいものでは16バイト程度からとなるので、それらにわざわざDMAやDTCを使うかの問題もあります。

    なぜ、DMAやDTCが必要かをよく検討されることをお勧めします。

    以上

  • NoMay様、チョコ様
    様々な情報本当にありがとうございました。
    難しそうな所が色々ありますがお教え頂いた情報を元に実際にプログラムも
    作ってみながら進めたいと思います。
    SPIへの変更やDMA、DTCの必要性についても周りに聞いてみたいと思います。
    ありがとうございました。

  • お世話になります。
    RX23Tでモータ制御を行っています。
    制御中の回転数、電流をi2c接続のLCDに表示させようとしていますが、
    i2cの送信を掛けると、主制御が止まってしまい上手くいきません。
    DTCなどを用いデータ送信をバックグラウンドでできないかと、設定方法などを
    調べて居りましたら、本QAに行きつきました。
    i2c接続では、DTCはあまり使わないとの事ですが、スマートコンフィギュレータでも、
    SCI1のデータ処理を割込かDTCを選べますが、i2cのDTCはどのような用途での使用が
    一般的なのでしょうか?そもそも、私の様な目的では、i2c接続は不向きでしょうか?
    便乗の質問になりますが、ヒントだけでも頂けましたら幸いです。

  • チョコです。

    I2Cの通信は、スタート・コンディションに続けて、送信か受信かで異なるスレーブ・アドレスを送信し、割り込みが発生して、ステータスを確認してスレーブからACK応答があれば、データの通信になります。ACKがなかったときの処理を考えると割り込みで無条件にデータの通信を行っていいわけではありません。送信の場合には、送信したデータごとにACKの確認を行います。ここらをきちんと処理しようとすると、DTCやDMAは使えません。

    以前のスレッドへのコメントで、「RXのI2Cの割り込みがどうなっているか分からないので」と言ったのは、正常終了と異常終了で割り込みが分かれていれば、上のような処理を行って、正常終了の割り込みだけでDTCを起動できれば、可能性はありますが、割り込みが一つだとDTCは使えないと考えられるからです。受信については、受信したい最後のデータに対してはNACK応答(ACK応答しない)とする必要があるので、そのためにケアが必要です。

    もしかすると、I2CによるLCD制御では、送信しかしないかもしれません(私が使ったことがあるI2CのLCDはLCD側から送信することはできませんでした)。その場合には、スレーブ・アドレスへのACK確認だけでいいかもしれません。確実にそのスレーブ・アドレスにLCDがあるなら、ACKが必ず戻るとの前提で、通信ステータス確認を完全に無視して垂れ流し的に送信するだけも考えられないではありません。この場合にはDTCが使える可能性があります。また、LCDに複数の表示データを連続して送信していいかも気になるところです。

    RXは使ったことがないので、スマートコンフィギュレータがどのような処理を行っているか分かりませんし、I2Cでの通信に許されるオーバヘッドがどの程度か分からないので、割り込み処理でどこまで可能かは分かりません。

     

    以上

  • Nさん、こんにちは。NoMaYです。#お久しぶりです。
    チョコさんも、こんにちは。

    チョコさんへ

    実はRXではACK割り込みとNACK割り込みを発生させるモードがあります。(以前に気付いた時に咄嗟に、DMA/DTC向けなのかな、と思った記憶があります。)

    Nさんへ

    考え方としては、キャラクタLCD等の表示装置や温度センサ等の入力デバイスへ繋ぐという用途であれば、通信速度(標準モードだとすればmax 100Kbps)と通信量(ざっくりと想定して100msで数十バイト)の観点からすれば、割り込み処理で充分に対応出来てしまう、ということですね。

    ところで、今回のI2C通信プログラムも以前のスレッドの最後に添付されていたものと同じやり方にて割り込み処理(CGで生成したコードのコールバック処理にて送信カウンタ/受信カウンタをインクリメントする)になっているのでしょうか?

    もしそうであれば、あの割り込み処理量で、そちらのモータ制御の主制御が間に合わなくなるのは、実際に妥当なことなのでしょうか?直感的には、そうであるなら、マイコンの処理負荷(感覚的なものとしてですけど)が100%に近い状況であるということなのかな?、という気がするのですが、そうなのでしょうか?

    その様な状況なのであればDTCやDMAを使う選択肢も考えられますけど、モータの主制御が割り込み処理であれば、多重割り込みを使って、モータの主制御の割り込み優先順位をI2Cの通信割り込みより高くしておけば充分に対応出来る(上に書いた通信速度と通信量の観点からすればですが)、ということはありませんでしょうか?

    ちなみに、私は(もちろんチョコさんも)、意地でもI2C通信でDTCやDMAを使うことを認めない、というわけではないです。でも、私は、咄嗟には、その必要があるのかなぁ?という考えが浮かんでしまう、というところなのです。

    #もしマイコンの処理負荷が100%に近いなら、平行して幾つかの割り込み処理を扱う、という余裕すら無さそうに思えるのでして、マイコンをひとクラス上のものに置き換えることも考えた方が良いのではないかという状況なのだったりするのかなぁ?とも思ったりするのです、、、

  • チョコさん、NoMaYさん
    丁寧なアドバイス、有難うございます。

    私の書き方が中途半端だったたため、いろいろとお手数をお掛けし、申し訳けありませんでした。
    モータ制御はPWMのキャリアの周期毎(100μs)に、電流・回転位置のデータを取込み、演算して、次のデューティ比をMTUに返す制御をしています。
    1回の演算+制御自体は50~60μsで、負荷としては最大60%位です。
    一方、LCDの表示は0.5sに一回で、制御コードを入れても100バイト程度なので、トータル負荷としては全く問題ないレベルと考えています。

    ここからは、うまく動かなかった事にたいする私の考察で、間違っているかもしれませんが・・・
    シリアル通信なので、データを分割したとしても、最低でも、アドレスリンク(約10ビット)+制御文字(2バイト)+データ文字(最低1文字=2バイト)⇒約50ビットは連続して行う必要があると思います。それだと50×400kbps=125μsとなり制御周期に収まりません。
    計算などでしたら中断して上位の割込みを入れることもできると思いますが、シリアル通信だと途中で切るわけにはいかないかと・・・。
    そこで、主制御の割込などの影響を受けないよう、バックグラウンド的に通信ができそうなDTCを使えないか?と思い、こばさんと同様に参考情報をさがしておりました。

    接続されているのはLCD1つのみで、送信だけなので、チョコさんのおっしゃる「垂れ流し的に」で良く、負荷にも余裕があると思いますので、
    もう少し勉強してみたいと思います。

  • Nさん、こんにちは。NoMaYです。

    > シリアル通信なので、データを分割したとしても、最低でも、アドレスリンク(約10ビット)+制御文字(2バイト)+データ文字(最低1文字=2バイト)⇒約50ビットは連続して行う必要があると思います。それだと50×400kbps=125μsとなり制御周期に収まりません。
    > 計算などでしたら中断して上位の割込みを入れることもできると思いますが、シリアル通信だと途中で切るわけにはいかないかと・・・。

    いやいやいや、ものすごくとんでもない誤解を、割り込みを使ったI2C通信処理(というかひょっとしたらシリアル通信処理全般?)に対して、してしまっていると思います。どこから説明すれば良いのか呆然としてしまうぐらい。(独学?だと、まれにそんなことになってしまうこともあろうか、とは思います。)

  • チョコです。

    >シリアル通信なので、データを分割したとしても、最低でも、アドレスリンク(約10ビット)+制御文字(2バイト)+データ文字(最低1文字=2バイト)⇒約50ビットは連続して行う必要があると思います。それだと50×400kbps=125μsとなり制御周期に収まりません。

    要するに、1バイトのデータはASCIIでは2文字になり、1文字は制御コード(データかコマンドかを示す)が追加されるので、トータルで5キャラクタ分必要になる。1キャラクタの通信にはACKが付くので、9ビット×5キャラクタで45ビットだが、キャラクタの間隔を加味するとそれ以上(ここでは50ビット分の時間)かかると言っておられるのですね。

    問題はその後の式で、その式は間違いです。400kpbsは「×400kbps=」ではなく、割るべきです。(結果は125μsで変わりませんが。

    >シリアル通信だと途中で切るわけにはいかないかと・・・。

    I2Cのマスタとしての通信では、別段連続して送信する必要はないはずです。キャラクタとキャラクタの間が長くなるだけです。それで、通信がエラーになることはありません。(これがスレーブだとしてもI2Cには同期化の機能があり、スレーブはデータの準備ができるまでSCL信号をロウに引くことで通信を止めることが可能です。)

    >主制御の割込などの影響を受けないよう、バックグラウンド的に通信ができそうなDTCを使えないか?

    別に割り込みベースでもバックグラウンドで処理できますよ。

    以上