setSoftWire 関数について

マイコン歴半年の初心者で初めて投稿させていただきます。

ルネサスのホームページを見ながらROSEの勉強をしています。

Wire 関数を説明しているページ内に

setSoftWire関数が記載されていますが、

どのように使用するもの

*目的(どのような時に)

*使用方法

について教えていただけないでしょうか?

解説ページなどあるのでしたら、そちらも教えていただけるとありがたいです。

よろしくお願いします。

<記載ページ>

https://www.renesas.com/jp/ja/products/gadget-renesas/reference/gr-rose/library-wire

<抜粋内容>

setSoftWire

概要
指定されたピンにソフトウェアWireを適用します。
文法
Wire.setSoftWire(int sda, int scl)
パラメータ
sda: SDAピン, scl: SCLピン
戻り値
なし
  • チョコです。

    これは、GR-ROSEで2線式のシリアルバスであるI2Cバスのマスタとして動作させるソフトのようで、I2Cのハードウェアではなく、ソフトでポートを制御してI2C制御を実現しているようです。

    I2Cバスを使って、スレーブと通信するためのAPIで、この関数をArduinoのsetup関数で呼び出すことで、SDA信号用と指定した端子とSCL信号用と指定した端子を使ってスレーブと通信できるようにするためのものです。

    使い方はArduinoのwire関数と同じだと思われます。

    実際の送受信はArduinoのwire関数(Wire.requestFrom関数やWire.beginTransmission関数)などを使って受信したり、送信したりすることになります。ここらは、Arduino関係の情報を探してください。

  • さっそくの回答ありがとうございます。

    I2Cのハードウェア(PIN20(CL)/PIN21(DA)を使用)

    で使用していた機器を

    Wire.setSoftWire(11, 10) 仮:PIN10(CL)/PIN11(DA) としてソフトウェアI2Cに振り替えて通信できました。

    ただ、わたしの想像していた使用方法は

    既設のWire, Wire2 が足りなくなったときに

    Wire3~ など

    追加して機器を増設できるとすごく便利だと考えていましたが

    そのような使用方法は無理なのでしょうか?

    (もしPIN20, PIN21を空けるためだけの目的だとしたら、その理由もわかりません・・・)

    ご存じの方がいらっしゃいましたらご教授いただけるとありがたいです。

  • ご返信遅くなりすみません。

    以下のスレッドの通りSerial2とWireは同一の周辺機能を使っているため、同時使用できません。Serial2を使う際にsoftWireを適用することで、Wireを使えるようになります。

    ですので、Witeを複数使うために用意されたものではありません。

    japan.renesasrulz.com/.../wire-serial2

  • ありがとうございます。Serial2を使う場合にWireがつかえなくなってしまう。→

  • softWireで使えるように補う。ということですね。ちなみにWireとsoftWireで機能・能力的に何が異なるのでしょうか?softWireのほうが速度が落ちるとか、なのでしょうか?

  • kommyさん、

    Wireとしての機能や性能(100kbps)との差分はありませんが、I2C通信をしている間は割り込み禁止でCPUのリソースが占有されます。I2C通信が正常にできても他の通信や割り込み処理の応答性に影響を及ぼす可能性が出てきます。

  • 丁寧な説明ありがとうございます。

    もう少しご教授をお願いします。

    通常のWire使用時:割り込み可能(ハードで通信処理)

    setSoftWire を使用した場合:割り込み禁止(CPU(ソフトで)が頑張らないといけないため)

    という理解で よろしいでしょうか?

  • kommyさん、

    はい、その理解で合っています。

    ここから余談です。

    実はソースを見ていただけると分かるのですが、ハードI2CもソフトI2CもTwoWireクラスで定義しており、デフォルトで以下のようにオブジェクト生成されています(本来はユーザがオブジェクト生成するのですが、Arduinoに沿ってライブラリ側でオブジェクト生成してます)

    TwoWire WireSoft = TwoWire(0); // software wire
    TwoWire Wire = TwoWire(1); // SCI2
    TwoWire Wire2 = TwoWire(2); //SCI1

    なにが言いたいかと言いますと、I2Cのマスターが足りなくなったら、I2Cマスタを増やすこともできます。

  • チョコです。

    >I2Cのマスターが足りなくなったら、I2Cマスタを増やすこともできます。

    動作させるのに、割り込みを禁止させる必要があるなら、Arduinoのwireでは、受信はバックグラウンドで動くはずなので、処理が間に合わなくなります。複数生成しても使い物にはならないかもしれませんね。

    余談ですが、8ビット・10ピンのRL78/G10(20MHz動作)でソフトでI2Cバスのスレーブ処理を作ったことがあります。

    アセンブラ記述で最優先の割り込みを使い多重割り込みを使うことで、バックグラウンドで動作させて、100kbpsで動作させました。計算上は150kbps程度はできそうでした。

    さらに、余談ですが、マスタなら、受信動作さえ注意すれば、何とかなりそうな気はしますが。

  • okamiya さん

    チョコさん

    ありがとうございます。ソースの見方がわからずに止まっています。初歩的なところでつまづき申し訳ありません。

    「IDE for GR」 を使用しているのですがTwoWire クラスが記載してるソースの見方をご教授いただけないでしょうか?

  • 私の場合 ドライブDの直下にAppフォルダを作成して「IDE for GR」 をいれたので

    D:\App\ide4gr-1.13\hardware\arduino\rx65n\libraries\Wire\Wire.h

    に「Wire.h」ありました。見ているファイルは合っていますでしょうか?

    中身を少し確認しましたが、C++を勉強していないため(C言語も半年の初心者)の

    勘ですが Wire.h でインクルードしている twi_rx.h の中に

    SIMR1 , SIMR2 , SIMR3 (I2Cモードレジスタ?)とあり

    ハードでのI2C はもしや3つまで使える?

    と考えてしまいました。現状3つのハードでのI2C機器が接続できると実現したいことが

    可能になります。おいおいC++も勉強しなければと考えています・・・

    まだまだ根本的に理解するためには知識不足ですので

    ずばり

    <教えていただきたいこと>

    3つ目のハードでのI2Cマスタを増やしたい!

    <お聞きしたいこと>

    *GR-ROSEのどのピンを使用

    *どのようなコードを作成し定義

    *どのようなコードで使用

    し3つ目のI2Cマスタを使えるようになるか教えていただけないでしょうか?

  • kommyさん、

    >「Wire.h」ありました。見ているファイルは合っていますでしょうか?

    はい、合っています。IDE for GRはコンパイル時間を省くためにヘッダのみ残し、ソースを削除しています。がじぇるねWebで提供しているe2studio用プロジェクトや、Webコンパイラにはソースもありますので、ご確認いただければと思います。

    三つ目のI2Cについてですが、確かなかったと思います。GR-ROSEはシリアルサーボを制御できるようにするため、1線UARTをするために3ステートバッファを入れてます(Serial1~Serial4)。あとSerial7もRS485のトランシーバを入れてます。結果としてハードウェアI2Cは最大で2チャネルしか出せないと思います。

  • ハードでのI2C は二つということですね。

    okamiya さん

    チョコさん

    いろいろと有益な情報をいただきありがとうございました。

    引き続き勉強をしていきますので今後ともよろしくお願いします。