I2Cについて

初めましてachtと申します。

今更ながらI2Cに関してご存じの方いらっしゃいましたらご教授願います。

現在、EEPROMやFRAMの接続にI2Cを使用しています。
(簡易I2C等の機能は使わず、ドライバは自作しています)

通信ラインはいずれも汎用I/Oに接続しプルアップしているのですが、
先日FRAMのデータシートを見ていたら気になる記述がありました。
内容としては、
「スレーブがack中(Low)にマイコン側からSDAに対して
 強制出力'H'をおこなうと壊れる場合があるから、気をつけろ」
 といった内容でした。

これは、間違って出力状態同士になってしまった時の事も
考慮すると、マイコンからのSDAコントロールにも
オープンコレクタを使ってコントロールするのが
良いという事なのでしょうか。

今まで、通常出力にてSDAを'H''L'切り替えて
操作していたのですが、ポートの方向を
入力に切り替えてあげる事でHi-Z(吊ってあるので'H'となる)
としてSDAをコントロールするというのが正解とか
あるのでしょうか。

このあたり、皆様はどうやっているのでしょうか。
どなたか情報頂けましたら宜しくお願いします。

Parents
  • チョコです。

    基本的に、IICバスのSDA信号は通信状態で方向が切り替わるので

    必ずN-chオープン・ドレイン出力でドライブします。(SCL信号も

    スレーブが同期をとるためにウエイトをかけるためにLを出力する

    可能性がある場合には、N-chオープン・ドレイン出力を選択する

    必要があります。)

    入出力ポートを使ってIICバスを制御するときには、出力ポートの

    出力ラッチ(データ)は0にしておき、Lを出力するときのみ、

    出力バッファをオンし、それ以外では出力バッファをオフする

    ような制御を行います。

    (元々、IICバスでは信号を抵抗でプルアップしてあるので、出力

    していない状態では、Hi-Z=Hとなります。)

    > スレーブがack中(Low)にマイコン側からSDAに対して

     強制出力'H'をおこなうと

    これは、9クロック目のSCLがHの状態でストップ・コンディション

    を強引に発行しようとしている状態と考えられます。

    まともな動作は期待できないので、こんな使い方はやるべきでは

    ありません。

    9クロック目を完了させて(SCLをLにすることで、ACK応答を

    完了させて)、その後で、ストップ・コンディションを発行させる

    べきです。

    以上

Reply
  • チョコです。

    基本的に、IICバスのSDA信号は通信状態で方向が切り替わるので

    必ずN-chオープン・ドレイン出力でドライブします。(SCL信号も

    スレーブが同期をとるためにウエイトをかけるためにLを出力する

    可能性がある場合には、N-chオープン・ドレイン出力を選択する

    必要があります。)

    入出力ポートを使ってIICバスを制御するときには、出力ポートの

    出力ラッチ(データ)は0にしておき、Lを出力するときのみ、

    出力バッファをオンし、それ以外では出力バッファをオフする

    ような制御を行います。

    (元々、IICバスでは信号を抵抗でプルアップしてあるので、出力

    していない状態では、Hi-Z=Hとなります。)

    > スレーブがack中(Low)にマイコン側からSDAに対して

     強制出力'H'をおこなうと

    これは、9クロック目のSCLがHの状態でストップ・コンディション

    を強引に発行しようとしている状態と考えられます。

    まともな動作は期待できないので、こんな使い方はやるべきでは

    ありません。

    9クロック目を完了させて(SCLをLにすることで、ACK応答を

    完了させて)、その後で、ストップ・コンディションを発行させる

    べきです。

    以上

Children
No Data