初めましてachtと申します。
今更ながらI2Cに関してご存じの方いらっしゃいましたらご教授願います。
現在、EEPROMやFRAMの接続にI2Cを使用しています。(簡易I2C等の機能は使わず、ドライバは自作しています)
通信ラインはいずれも汎用I/Oに接続しプルアップしているのですが、先日FRAMのデータシートを見ていたら気になる記述がありました。内容としては、「スレーブがack中(Low)にマイコン側からSDAに対して 強制出力'H'をおこなうと壊れる場合があるから、気をつけろ」 といった内容でした。
これは、間違って出力状態同士になってしまった時の事も考慮すると、マイコンからのSDAコントロールにもオープンコレクタを使ってコントロールするのが良いという事なのでしょうか。
今まで、通常出力にてSDAを'H''L'切り替えて操作していたのですが、ポートの方向を入力に切り替えてあげる事でHi-Z(吊ってあるので'H'となる)としてSDAをコントロールするというのが正解とかあるのでしょうか。
このあたり、皆様はどうやっているのでしょうか。どなたか情報頂けましたら宜しくお願いします。
achtさん
>ポートの方向を入力に切り替えてあげる事で
>Hi-Z(吊ってあるので'H'となる)として
>SDAをコントロールする
上記は必須と思います。
荒業でマスタ側SCLのみトーテンポール出力することもありますが、
SDAがトーテンポール出力では、I2Cバスが成立しません。
achtさんビシさんも述べましたが、マスタ側からはSCLは出力、SDAは出力と入力をカバーしないといけません、出力と入力の切り替えが不適切ですと信号の衝突が発生します、専用ハードウェアで制御せず、自前ソフトで制御する場合は注意が必要です、場合によっては破壊につながることもあり得ます、SDAは電流制限したオープンコレクタでドライブすれば衝突が発生しても破壊することはありません、オープンコレクタ出力をもっていないマイコンではトランジスタが1個追加が必要ですが自前ソフトで制御する場合はそのようにすれば安全です、これにはポートを3個使用します出力1SCL、2SDA出力ー>TR、3入力、というようにすれば良いでしょう、もし十分自信があればSDAの入力/出力を切り替えてやることも出来ます、その場合SDAは4.7Kぐらいでプルアップが必要です
チョコです。
> 2SDA出力ー>TR、
論理が反転するので、要注意ですね。
ビシ様、チョコ様、IKUZO様
早速ご回答いただきましてありがとうございます。
皆様のご回答を見た上で色々見直してみたのですが、
現状としては、SCLもSDAも特に機能の指定をしていなかったので
CMOS出力でコントロールしていると思われます。
(もちろん入出力を切り替えてスレーブからの応答を見ることも
できています)
N-chオープン・ドレイン出力が選択できるのに
今まで問題なく動作していた為、特に指定していませんでした。
この場合、ビシさんのおっしゃっている
トーテムポールにあたるという事でしょうか。
(トーテムポール=COMS で良いのでしょうか)
ご指摘頂いたのは、これだけではスレーブの応答を見れない
という意味でしょうか?
理解と説明が悪くて申し訳ございません。
現状としては上記の動作となって、一応動いています。
チョコ様やIKUZO様のおっしゃるとおり、N-chオープン・ドレインに
するのが一番良いですね。(というか当たり前なのですね)
今まで当たり前のようにやってきましたが今後改めます。
ちなみに・・
>> スレーブがack中(Low)にマイコン側からSDAに対して
> 強制出力'H'をおこなうと
>これは、9クロック目のSCLがHの状態でストップ・コンディション
>を強引に発行しようとしている状態と考えられます。
>まともな動作は期待できないので、こんな使い方はやるべきでは
>ありません。
>9クロック目を完了させて(SCLをLにすることで、ACK応答を
>完了させて)、その後で、ストップ・コンディションを発行させる
>べきです。
メーカーの意図は単純に気をつけろと言っているものと
思っておりましたが、確かにこういう事例があったのかもしれませんね。
捉え方が楽観的過ぎました。
皆様貴重なお時間ありがとうございました。
大変助かりました。
ちなみにRX210を使用しているのですが、
I/Oポートの説明のブロック図がわかり辛くて混乱しました。
機能が多いので仕方がないと思うのですが、
M16C等で見慣れていたので、オープン・ドレイン等を指定した場合の
電気の流れがイメージできませんでした。
と思ってRL78G14(使った事ないですが)のデータシート見たら
同じような感じでした。
もっと勉強します。。
> (トーテムポール=COMS で良いのでしょうか)
はい、そうです。出力の上側のトランジスタ(P-ch)と下側のトランジスタ(N-ch)が
重なっていることで、トーテムポール出力と呼ぶことがあります。
> (もちろん入出力を切り替えてスレーブからの応答を見ることも
これは、単にスレーブの出力バッファがまだ動作しているからと考えられます。
(出力同士の衝突で入力バッファがおかしくなることは考えにくいです。)
>と思ってRL78G14(使った事ないですが)のデータシート見たら
RL78/G14のIIC(IICA0)はN-chオープンドレイン出力固定の端子に配置
されている(図2 - 22 端子タイプ12-1-2の端子ブロック図参照)ので、特に
設定は意識する必要はありません。
簡易IICについては、「図2 - 8 端子タイプ7-1-4の端子ブロック図」にあるような
構成で、POMレジスタでN-chオープンドレイン出力設定するようになっています。
また、「表4 - 15 P00-P17端子機能使用時のレジスタの設定例」 を見ると、
使い方に応じた設定の一覧があるので、分かりにくいことはないと思いますが。
チョコ様
色々ありがとうございます。
よくよく見直してみたら、私のG14のデータシートが大変古いものでして、
最新版を確認したらガラリと変わっていて全然わかりやすくなってました!
良く確認もせずに申し訳ありませんでした。
改めてRXも確認しましたが、こちらは更新されていませんでした><