
ちょっと細かい質問になりますが、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.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を試してみて様子を見ようかと考えています。
有難うございました。
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 応答したかわかりますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ SSDを追加したら昔のHDDがおかしくなった 4 2023/03/23 13:25
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- LINE LINEアプリ内のQRコードリーダーがカメラのピントが合わず読み込めません。 2 2022/08/26 15:39
- JavaScript 読み込んだQRコードをフォームに受け渡したい 1 2023/05/18 11:18
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- Windows 10 再起動後 Pinが使用できず、PC(windows11)にサインインできない 3 2022/08/30 20:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レジスタマップって何ですか?
-
組み込みマイコンでのソフトウ...
-
機械語のレジスタペアについて
-
TCNTとTIFRの意味
-
PLCとPCの通信
-
Macターミナルで実行中のプログ...
-
C言語で、メモリを解放しないで...
-
C言語で途中までしか、プログラ...
-
TCP/IP通信時のサーバーからの受信
-
メモリのセグメント違反の解決...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
10進ベーシックで質問です。
-
VBSの処理中一旦処理を止めて再...
-
3のつく数字と3の倍数のみを表...
-
VB.NETをJavaに変換するツール...
-
バックグラウンドのプロセスの...
-
Excel VBAにて、2GB超の点群デ...
-
ウインドウズのシステムにおけ...
-
ACCESS側からEXCELの書式を設定...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レジスタマップって何ですか?
-
PLCとPCの通信
-
組み込みマイコンでのソフトウ...
-
USBハブの自作について
-
H8マイコンのプロテクト方法
-
機械語のレジスタペアについて
-
TCNTとTIFRの意味
-
シリアル通信でのデータ取りこぼし
-
スプレッとの制御
-
PIC12F683でLEDをスイッチで点...
-
FATの故障? 1ファイル内の文字化け
-
古い計量機器からのrs232cを使...
-
マイクロ秒で精度が出るタイマー
-
デジタルマルチメータの自動計...
-
フラッシュメモリへの書き込み
-
プリンタポートの制御
-
無限ループを使う意味
-
geko201とマイコンのシリアル通...
-
C言語 マイコン
-
PICマイコンのCLRWDT動作について
おすすめ情報