初めましてachtと申します。
今更ながらI2Cに関してご存じの方いらっしゃいましたらご教授願います。
現在、EEPROMやFRAMの接続にI2Cを使用しています。(簡易I2C等の機能は使わず、ドライバは自作しています)
通信ラインはいずれも汎用I/Oに接続しプルアップしているのですが、先日FRAMのデータシートを見ていたら気になる記述がありました。内容としては、「スレーブがack中(Low)にマイコン側からSDAに対して 強制出力'H'をおこなうと壊れる場合があるから、気をつけろ」 といった内容でした。
これは、間違って出力状態同士になってしまった時の事も考慮すると、マイコンからのSDAコントロールにもオープンコレクタを使ってコントロールするのが良いという事なのでしょうか。
今まで、通常出力にてSDAを'H''L'切り替えて操作していたのですが、ポートの方向を入力に切り替えてあげる事でHi-Z(吊ってあるので'H'となる)としてSDAをコントロールするというのが正解とかあるのでしょうか。
このあたり、皆様はどうやっているのでしょうか。どなたか情報頂けましたら宜しくお願いします。
チョコです。
基本的に、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応答を
完了させて)、その後で、ストップ・コンディションを発行させる
べきです。
以上