• 締切済み

PCA9564の使用方法

 PCA9564を用いて、PCのパラレルポートでI2Cのコントロールを行おうと考えています。PCA9564にスレーブとして、アドレスが0101111のICを接続して、SDA,SCLラインに接続しています。START CONDITIONを制御して、SDAがLowになり、SCLもLowになることを確認してから、SLA+W(アドレス指定と書き込み指定)を送るために、01011110(8bit目はWriteを示す0)を添付のように送っています。最後の9bit目にはACKがスレーブの端末から帰ってくるため、本来は0が返ってくるはずですが、1が返ってきておりNACKを示し、正しく制御できていません。以下に制御方法を記載しますので、ご存じある方はご指導のほどよろしくお願いします。 1.17番端子のResetを1⇒0⇒1にして実行 2.A1A0を11にして、I2CCON状態にして、ENSIOとSTAを1にする(01100100)。 WRを1⇒0⇒1にして実行。このときにSCLとSDAはLowになる 3.A1A0を01にして、I2CDATにして、D7:D0を01011110にして、WRを1⇒0⇒1にして実行。 このときは何も出力されない 4.A1A0を11にして、I2CCON状態にして、STAを0にする(01000100)。 WRを1⇒0⇒1にして実行。このときに添付のクロックが見える。最後の9bit目のSDAが Highになるため、おかしい。  疑問点として、3の時に実行してもSDAとSCLラインには何も出力されませんが、 これは正しい動作なのでしょうか?

みんなの回答

noname#199976
noname#199976
回答No.2

>3の時に実行してもSDAとSCLラインには何も出力されませんが、 これは正しい動作なのでしょうか? PCA9564が動き出す条件から外れてるのだから当然。 複数のPCA9564 を異アドレスに配置する設計で、 あるデバイスへの書き込みに他のデバイスが反応したらまずいでしょ。 3 の例はそういうことです。

noname#199976
noname#199976
回答No.1

昔I2Cバスの勉強を少しだけした者です。 PCA9564 を使った事はありません。 Start Condition は波形に現れてないし、SCL がパタパタ変化する前の Low な時間が 長いようですね、 普通は直前あたりに Start Condision があると思いますが何故こんなに長いのでしょう。 もしかしたら SCL =Low が長くてバスエラーとかタイムアウトが発生し、 以後の動作をおかしくしてるんじゃないでしょうか。 PCA9564 データシート http://www.nxp.com/documents/data_sheet/PCA9564.pdf

関連するQ&A

  • PCA9306使用時のLレベル上昇現象について

    現在NXP Semiconductor製PCA9306を使用したI2Cレベルシフタを試作しているのですが、通信中にLレベルが1.3V程度まで持ち上がる現象が発生しています。 構成は2つの機器を1対1で結ぶ形で、それぞれの機器にこのレベルシフタを取り付け、500mm程度のケーブルで相互接続しています。 機器側(VREF1)が3.3V系、ケーブル側(VREF2)が5.0Vです、GNDは共通です。回路図はPCA9306データシートに記載してあるものと同様ですが、SCL/SDAにサージ対策としてTVSダイオードをぶら下げています。 各機器は1kΩ程度の内蔵プルアップ抵抗を持っていますので、双方のSCL1/SDA1のプルアップ抵抗は未実装としてあり、SCL2/SDA2に560Ωを実装しています。約10mAのドライブ電流です。 添付画像が機器側(3.3V側)の波形です。ケーブル側(5.0V側)も電圧が違うだけで全く同じ波形をしています。 Lレベルが2段階に分かれており、高い方で1.3V程度、低い方で0.3V程度となっています。特にシンク能力不足という訳ではないと考えているのですが……。 なお波形画像ありませんが、電源電圧に特に揺れなどは確認出来ませんでした。 ほぼリファレンス構成にも関わらずこのような不具合が出て困っています。どなたか解決法などご存じないでしょうか。

  • Arduino INA219 I2C通信できない

    Arduinoのsda, sclにINA219のsda, sclを接続すると出力が止まってしまいます。 確認のためLCDを使ってI2C通信を試してみましたが問題なく動作しました。

  • I2C I/OエクスパンダPCA9539動作不具合

    ちょっと細かい質問になりますが、ICの不具合かどうか最終判断を下そうと 思っておりまして、その前にこのサイトで別の角度からアドバイスを受けられたら と思い投稿させて頂きました。 本来、製造メーカに聞くべき問題かもしれませんがよろしくお願い致します。 PIC16F887でI2Cバスを経由しI/OエクスパンダPCA9539(以降9539)を制御しています。 9539については http://www.jp.nxp.com/products/interface_and_connectivity/i2c/i2c_general_purpose_i_o/series/PCA9539_PCA9539R.html をご参照ください。 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"になってしまいます。 【質問】  ・上記の読みだし動作で駆動の仕方を間違えておりますでしょうか?  ・同様のおかしな振る舞いをご経験された方いらっしゃいますか?

  • H8/SX で I2C通信

    H8/SX 1655 を使ってI2C通信を試みています。 マニュアルには、送信レジスタ(ICDRT)にデータを書き込めば 自動的にシフトレジスタ(ICDRS)に転送されて、SCL SDA 端子から クロックパルスが出力されると書かれています。 とすると、パルスの出力だけなら Reset 後 MSTP.CRB.BIT._IIC0 = 0;  /* 寝ているI2C0を叩き起こす */ IIC20.ICDRT = 0x90;  /* [Start byte] Slave Address + Write */ この2行で事足りると思うのですが、実際にはクロックパルスは 出力されません。きっと必要な何かが不足しているのだと 思うのですが、当方、初心者にて皆目見当がつきません。 どなたかご教示いただけないでしょうか。 因みに動作モードは、モード6とモード7で試してみました。 よろしくお願いいたします。

  • I2Cについて

    現在、DALLASセミコンダクター社のDS1307というリアルタイムクロックICを制御しようとしています。 仕様書を見ると、I2Cという言葉が出てきたので、自分なりに調べて制御を試みています。 今は、SDA,SCLに与える信号をタイミングが合うように1bit毎に出力していますが、うまくいきません。 具体的には、DS1307からACK信号が帰って来ないためタイムアウトエラーなります。 何かアドバイスがある方がいましたらお願いします。

  • I2C通信のスレーブアドレスについて

    電子回路初学者です。 I2C通信は、まず自分が (例としてマイコンが) マスターになる宣言をし、バスの所有権を得て、次に通信相手となるスレーブアドレスを指定し、データを送受信するものだと理解しています。そこで質問があります。 このスレーブアドレスとは製品固有のものなのでしょうか。 例えば、X社製のXというセンサーはスレーブアドレスが0x74である、といった具合です。 それとも、マイコンのポートxのyビット目 (SDAまたはSCL) にぶら下がっているスレーブにスレーブアドレス0x74を持たせる、といった具合に任意に決定できるのでしょうか。 実際に使用する場合の解説が見当たらず悩んでおりました。 よろしくお願い致します。

  • PIC I2C について

    8ビットのデータを送り、そのままスレーブのLEDに反映させるプログラムを組んでいます。 マスターからはリピートして何度もデータを送ります。 このとき、なぜか一瞬アドレスのビットデータをLEDに反映させてから本来のデータを表示します。 つまり、アドレスとデータを交互にLEDに表示する状況です。 たとえば、アドレスが 0b1111111 データが 0b00000000 だとします。 本来LEDは消灯状態にならなくてはいけないのですが、なぜか一瞬アドレスデータの内容で光ります 原因がお分かりの方はいらっしゃいますか? 使用PIC PIC16F873A //master #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { i2c_start(); i2c_write(AddData << 1); i2c_write(sBitData); i2c_stop(); delay_ms(50); } //slave #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0x00, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { if (i2c_poll()) { indata = i2c_read(); output_b(indata); } }

  • kt0911と24LC××の関連に付いて。

    ラジオIC、kt0911のその後ですが、確かに仰る通りでしたのでeepromに格納してみました。 読み出しも、一旦電源をoffにして読みだすと、アドレスを二つに渡ってちゃんと書き込まれたのを確認して、kt0911に装着しました。 所がラジオは、全く梨のつぶてで、Keyを押してもウンともスンとも言いません。 GPIOの0~3を01にGPIO:4を11に設定しています。 他の設定はデフォルト値に即したデーターを書き込んでいます。 実際は24LC02と言う2Kのeepromに対して、24LC512と言う512kのeepromを使いました。 電源のON時に、SDAの端子をシンクロで観察するとActiv-Lowの信号が出ています、ロジアナでは無いので、どんな信号かは分かりません。 eepromの24LC512のSDAとSCLは、I2Cの通信をしている時以外のI/Oは、Hiインピーダンス成るのでしょうか。 Netを調べたのですが、それらしき答えに行きつきませんでした。 そこで、SDAとSCLの信号の入力に2回路2接点のトグルSWを入れて、電源ON後間を置いてSDAとSCLの信号をoffして見ましたが、LCDの周波数表示らしきものがインクリかデクリが分かりませんが グルグルと変化し表示するだけで、key-swは全く効きません。 取りあえず、eepromのI/O端子がハイインピーダンスに成る時と、またハイインピーダンスにするには どの様にしたら良いのでしょうか。 同じ24LCの2Kと512KのEEPROMですが、何もしなくても同じ様に使えますか。 使えなければ、回路を変更して使えますか。

  • PIC24FでI2C

    PIC24FでRTCを制御するためのI2C通信がうまくいかず困っています。 そこでSDA/SCLから信号が出ているかのみを確認するため 下記のようなプログラムをPICに書込みました。 (STARTの出力のみ) 当方オシロを持っていませんので汎用のテスタでSDA/SCL電圧の一時的な変化を読み取ろうと試みましたが全く電圧の変化はありません。 #include "p24FJ64GA002.h" _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) _CONFIG2( IESO_ON & FNOSC_FRC & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_ON & I2C1SEL_SEC & POSCMOD_NONE) int main(void) { AD1PCFG = 0xffff; CLKDIV = 0; TRISA = 0xFFE3; TRISB = 0x006F; LATB = 0x0010; CNPU1 = 0x003C; /// I2Cの初期設定 I2C1BRG = 0x27; I2C1CON = 0x8000; I2C1RCV = 0x00; I2C1TRN = 0x00; while(1){ I2C1CONbits.SEN = 1; while(I2C1CONbits.SEN); } } 心ある方、どなたかご教示お願いいたします。

  • 共有体でfloat型の数値を2進数へ変換

    実行結果が思ったとおりの値を算出しません。 なぜでしょうか? 回答のほどよろしくお願いいたします。 (例) 小数入力 >5.0 0000 0000 0000 0000 0100 0000 1010 0000 小数入力 >-5.0 0000 0000 0000 0000 1100 0000 1010 0000 (下記ソース) #include<stdio.h> void float_binary(float a); void main (void) { float fl; printf("小数入力 >"); scanf("%f",&fl); float_binary(fl); } void float_binary(float a) { struct float_data{ short int high_byte; short int low_byte; }; union data{ float num; struct float_data bit; }DATA; int i; DATA.num = a; for(i = 0; i<16; i++){ if(i != 0 && i % 4 == 0){ printf(" "); } if(DATA.bit.high_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.high_byte = DATA.bit.high_byte << 1; } for(i = 0; i<16; i++){ if(i % 4 == 0){ printf(" "); } if(DATA.bit.low_byte < 0){ printf("1"); } else{ printf("0"); } DATA.bit.low_byte = DATA.bit.low_byte << 1; } }