ちょっと細かい質問になりますが、ICの不具合かどうか最終判断を下そうと
思っておりまして、その前にこのサイトで別の角度からアドバイスを受けられたら
と思い投稿させて頂きました。
本来、製造メーカに聞くべき問題かもしれませんがよろしくお願い致します。
PIC16F887でI2Cバスを経由しI/OエクスパンダPCA9539(以降9539)を制御しています。
9539については http://www.jp.nxp.com/products/interface_and_con …
をご参照ください。
9539の動作のうち、ポートの出力はうまくいっていますが、ポートへの入力を読みだそうとするとおかしな動作をしています。SCL,SDAの駆動波形自体をみて期待と異なる動作をしているように見えます。なお、PICのコードはCCS社Cコンパイラの専用組み込み関数を用いています。
添付画像をご参照ください。
まず、最初の2バイトで9539への読みだしコマンドの書き込みを行っています。書き込んだコマンドはポート0からの入力を意味する"0x00"です。ここまでは後続の3バイト(下に時間域を拡大)で問題が起きており、R="1"と矢印で示したbitでREADを意味する1を立てていますが、その直後9539からACKが返っていません(ACK=highになっている)。当然、その後に読みだされた2つの"FF"も実際の状態とは異なっています。
ちなみに、このICはNXP社の物ですが、同じコードをTI社の同じ型番のコンパチ品で試すとこのACKは返しますが、読みだす値は常に"FF"になってしまいます。
【質問】
・上記の読みだし動作で駆動の仕方を間違えておりますでしょうか?
・同様のおかしな振る舞いをご経験された方いらっしゃいますか?
No.1
- 回答日時:
詳しくないですが。
>その直後9539からACKが返っていません(ACK=highになっている)。
PCA9539データシートの Fig.9 がリードコマンドを与えてデータを読み出す動作の概要図です。
PCA9539 は読み出しコマンドを受取ると、ACK 応答の直後から受けたクロックに同期して
データ出力する必要があります。
多分ですが、ここに時間がかかるのですぐにはACK応答せずマスタに待ってもらいたいのに、マスタが待たず(待ってればSCL=H期間が伸びるはず)
PCA9539はデータ出力準備ができないうちに置きざりになってるんだと思います。
>その後に読みだされた2つの"FF"も
結果、スレーブは正しいデータを出す事ができず、オープンドレインなSDAは誰もドライブしない→Highレベルのまま、マスタはデータのつもりで取り込んでいるのでしょう。
そういう目で見ると、PIC16F887 のレジスタで
REGISTER 13-3: SSPCON2: SSP CONTROL REGISTER 2
の bit5,6あたり、(英語で意味を正確に理解できておらず誤解かも知れませんが)
「マスターモードの時、自動的にACKを生成する」つまりスレーブからのACKを待たず進行する、
という機能があるようで、これによる現象なのではないかという気がします。
あと、今は波形で確認してるので不要ですが、同レジスタ bit 6 ACKSTAT を見れば
スレーブが ACK 応答したかわかりますね。
No.2ベストアンサー
- 回答日時:
訂正です。
誤>の bit5,6 あたり、
正>の bit5,4,3 あたり、
少ない情報の中、丁寧なご回答いただきありがとうございました。
確かに波形からそのような状態も起きえそうです。
そこで、追加でいくつか確認してみましたが、PICがAckを待っている時間は1.25usあります。
(このときSCLは2.5us周期でしたので)
一方、9539のデータシート(p20及びFig22)のセットアップ、ホールド時間のオーダーや
400kbpsで動くことを謳っていることから、上記の時間は十分かと思います。
ちなみに100kbps(パルス幅5us)に落としてやってみましたが、状況は変わりませんでした。
PCA9539(NXP製)をTCA9539(TI製、同社PCA9539が非推奨となったことによる代替え品)を
同じPICのプログラムで試すと、今度はきちんとAckは返ってきます。ただしデータはでたらめの
ままです。
このTIのエンジニアフォーラムを見ますと
http://e2e.ti.com/support/logic/f/151/t/52803.aspx
http://e2e.ti.com/support/interface/etc_interfac …
あたり[2010年ごろの記事]に読みだし時の不具合の報告がありますが、TI側からの
サポートも途中で切れているようです。
私としては、TI社の別のICを試してみて様子を見ようかと考えています。
有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイコンからSDカード内のテキ...
-
printf文で変数のアドレスを表...
-
PLCとPCの通信
-
Macターミナルで実行中のプログ...
-
3のつく数字と3の倍数のみを表...
-
VBSの処理中一旦処理を止めて再...
-
vba listviewにおけるtextのAli...
-
緯度、経度の 10進法と 60進法...
-
C# シリアル通信でデータ受信...
-
「ヒープサイズの設定」て何?
-
VBSで応答不要のメッセージボッ...
-
VB6で10進数を32進数に変換する...
-
TCP/IP通信時のサーバーからの受信
-
DoEvents関数って何?
-
VB6のwinsockでconnectできない
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
Excelでのセル内容の高速消去方法
-
一次元IFFTとFFTにおけ...
-
VBA kernel32 の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PLCとPCの通信
-
レジスタマップって何ですか?
-
機械語のレジスタペアについて
-
シリアル通信でのデータ取りこぼし
-
2つのアナログ信号が一致して...
-
組み込みマイコンでのソフトウ...
-
SH7144でパルス幅を測定したい。
-
フラッシュメモリへの書き込み
-
PICマイコンのCLRWDT動作について
-
マイコンSPI入門
-
PIC12F683でLEDをスイッチで点...
-
I2C I/OエクスパンダPCA9539動...
-
arduinoを使って重さ計測
-
マイコンからSDカード内のテキ...
-
デジタルマルチメータの自動計...
-
古い計量機器からのrs232cを使...
-
マイクロ秒で精度が出るタイマー
-
USBハブの自作について
-
TCNTとTIFRの意味
-
C言語プログラミングの問題な...
おすすめ情報