簡易I2Cについて

stlと申します。

RA2E1マイコンで簡易I2Cの機能を使用しています。デバッグを実行してみると、送信用のAPI関数の戻り値としては「成功」となりますが、オシロスコープでピンの出力を確認すると、SDAとSCLKの出力波形が確認できず、関数の実行タイミングで5Vから0Vに変化するだけでした。 この問題について何かわかることがありますでしょうか?

  • チョコです。

    性懲りもなく、また書き込んでいます。

    このFSPのようなフラグをコード生成の時代からずっと要求していたんですヨ。

    >SCL, SDAのラインに外部でプルアップ抵抗は付けていますか?

    これは、オリジナルのスレッドに「関数の実行タイミングで5Vから0Vに変化するだけでした。」とあるので、問題ないはずです。

    以上

  • チョコです。

    >>SCL, SDAのラインに外部でプルアップ抵抗は付けていますか?

    >これは、オリジナルのスレッドに「関数の実行タイミングで5Vから0Vに変化するだけでした。」とあるので、問題ないはずです。

    問題は抵抗値が大きすぎないかもありますね。過去には、数十kΩでプルアップしていて動かないなんて例もありましたね。

    以上

  • 実際に、動作して確認していただいてありがとうございます。おしゃるとおり、SCIインタフェースを使用したI2Cを使っています。添付いただいたプログラムと同じようにプログラムを書いているのですが、p_args->event == I2C_MASTER_EVENT_TX_COMPLETEとはならないですね。

    EEPROMに接続しているのですが、EEPROMの仕様書を見ると、SDASCLはプルアップ抵抗を介して、Vccに接続されていると記載してあるので、プルアップ抵抗は接続されているはずです。

    FSPの端子設定も行っています。

  • プルアップ抵抗はEEPROMに備え付けられているものなので、具体的な抵抗値は分からないですが、そこまで大きなものではないとは思っています。

  • プルアップ抵抗が内蔵されたチップがあるんですね。
    それなら、おそらくデータシートの電気特性の項目に抵抗値の範囲が書いてあると思います。


    測るのは簡単です。装置の電源を落としてSCLとVcc(EEPROMの電源)、SDAとVccの抵抗値ですね。

  • 仕様書を改めて確認すると、プルアップ抵抗は自分で接続する必要があるということのようでした。

    英語だったのでニュアンスが読み取れていなく、「プルアップ抵抗が接続されています」ということだと思っていたのですが、そのように接続してくださいと意味なんだと理解しました。

    通信が上手くいかない原因の一つは、プルアップ抵抗を接続していなかったからだと思います。ただ、tfさんによると、デバイスに接続していなくても波形は出るみたいですので、プルアップ抵抗を接続していなくても波形は出るのでないかと思ったのですが、それ以前にも原因があるのではとも思いました。

    実際にプルアップ抵抗を接続して、動作を確認してみます。

    「The I2C bus consists of two ‘wires’, SCL and SDA. The
    two wires are connected to the VCC supply via pull−up
    resistors. Master and Slave devices connect to the 2−wire
    bus via their respective SCL and SDA pins.」

  • まぁ、普通は内臓しないですよね。基板になってるモジュールでも、実装されてると逆に使いにくく感じますから。


    関数の実行タイミングで5Vから0Vに変化したってのは、マイコンのポートがもしかしたら内部プルアップが有効だったとかあるかもしれませんし、SCLはシングルマスタならPush-Pull設定になっている場合もあります。

  • チョコです。

    >マイコンのポート、もしかしたら内部プルアップが有効だったとかあるかもしれませんし、

    データシートを見ると10kΩ(MIN)~20kΩ(TYP)~100kΩ(MAX)となっているので、I2Cバスのプルアップ抵抗としては大き過ぎて使わない方がいいでしょうね。

    以上

  • 昨日のメールでSLAVEデバイス未接続時波形が出る事を確認したと書きましたが、マイコンが搭載されているボードに、プルアップ抵抗は付いてます。

    (テストでは、SCI9を使いましたが、SCI9はRAでは書き込みに使用する端子です。ボード上には、10kΩのプルアップがあります。I2Cのプルアップとしては、多少大きめですが波形を出すだけなら十分です。)

    一般的にEEPROM側のデバイスに内蔵されているプルアップは、50kΩ程度でしょうか。バスに多数のデバイスがつながっていない場合、容量としてはざっくり多めに考えても、30pF程度。時定数(振幅の63%に達する時間)は50kΩ×30pF=1.5usなので、100kbps(半サイクル5us)では、抵抗が大きすぎます。が、波形が出るか出ないかといえば、オシロで見るとrise側の波形も観測はできるでしょう(fall側はバッチリ出ます)。(オシロのプローブ容量10pF程度が加算されるので、かなり鈍った波形にはなりますが。)データ転送には問題が出そうな感じがします。

    (2~4.7kΩ程度のプルアップ抵抗を外付けすると良いでしょう。)

    なお、スレーブアドレスですが、7bitアドレスのデバイスだとして、

    0b1001111

    →0x4F(7bitアドレスの先頭にR/Wビットを付与、右詰で表記)

    →0x9E(末尾に0を付与して、左詰で表記)

    RAのFSPのGUIで設定するのは、0x4Fの方(右詰フォーマット)だったと思います。

    EEPROM側のデータシートが左詰で書かれている。

    EEPROM側にアドレス設定端子があり、オープンにしていて、Lだと思い込んでいるが、実はプルアップ内蔵端子である。

    といった様に、スレーブアレスが間違えている、という事はないでしょうか。

  • 本筋とは無関係ですが、コメントします。

    デバイス内蔵のプルアップですが、pMOS FETで構成されているケースが多いのではないかと思います。その場合、

    ・デバイスの電源を入れる

    ・SCL(SDA)に47kΩの抵抗を対GNDに接続する

    ・SCL(SDA)端子の電圧を測る(VCCが5Vで、端子電圧が2.5Vだったらデバイス内蔵プルアップは47kΩ)

    の様な測り方が良いかと思います。

    (FETの場合、抵抗素子とは異なりV/Iカーブが直線にはならないので、厳密に測ろうとすると、複数の抵抗値で電圧を測るとか、電流源と電圧計を使って、V/Iカーブを取得してという話になりますが)