NEC ELECTRONICS NEC ELECTRONICS
NEC electronics NEC electronics NEC
ホーム
アプリケーション
製品情報
先端技術
サポート
WEBショップ
ニュース&イベント
会社案内
header
GO
詳細検索機能/特性検索
サイトマップ お問い合わせ

I2Cバス

目次

    
FAQ-ID = 78iic-nnnn
0101: I2Cバスについての概要
0001: I2Cバスのプルアップ抵抗値は?
0003: I2Cバスの初期設定で STT0と SPT0を同時にセットするとうまくゆかない。
0004: 外部の EEPROMに I2Cバスで接続する場合の処理例(マスタ)
0005: I2Cバスが起動できない [78K共通]
0006: I2Cバスの制御がうまくいかない [共通]
0007: I2Cのクロック周波数が設定と異なる [共通]
0008: EEPROMの読み出しはうまくいったが、その後スタート・コンディションがうまくいかない [共通]
0201: 簡易I2Cバスとは? [78K0R共通]
0202: 簡易I2C機能(78K0R)
0301: I2Cバスへの不要な信号出力。[78K0/Kx]
78iic
-0101
I2Cバスについての概要
はじめに
I2Cバスはフィリップス社が提唱しているシリアル・バスで、 2本の信号により複数の機器の間でデータをやり取りをサポートしています。
(フィリップス社の特許は2004年8月で失効しました。)

(2004/12)

この情報はお役にたちましたか?
Q1
I2Cバスの概略仕様は?
A1
I2Cバスは複数の機器をシリアル・クロックとシリアル・データの2本の信号で結んでデータのやり取りを行います。
転送速度としては
 ・標準モード: 〜100Kbit/s
 ・ファースト・モード: 〜400Kbit/s
 ・高速モード: 〜3.4Mbit/s
の3つがあり、速いモードの機器は遅いモードのバスに接続しても使える必要があります。

なお、高速モード・バスは標準モードやファースト・モードのバスとはブリッジを用いて分離する必要があります。
また、通信はシリアル・クロックに同期して行われますが、シリアル・クロックを出力し、 通信相手を指定して通信を制御する機器 (これをマスタと呼ぶ) は1つのバスに複数存在することが許されています (マルチ・マスタ)。
このため、データのやり取りだけではなく、 アドレスの指定やバス・アービトレーション等プロトコルも含んで規定されています。

(1) 接続機器

I2Cバスに接続される機器には
 ・マスタ専用: マイコンは通常マスタとしての使い方が主です。
 ・スレーブ専用: EEPROMや A/D、D/A等があります。
 ・マスタ/スレーブ共用: マルチ・マスタ・システムで両方の機能を持たせる場合です。
があります。

通常マイコンで使用することが多いのはマスタ専用の機能で、この機能を使ってEEPROMと接続します。 アプリケーションによってはスレーブとして使用することもあります。


(2) インタフェース信号

インタフェース信号は複数の機器の出力を接続するためにオープン・ドレーン出力でドライブするようになっており、 ロウ・レベルは機器が出力しハイ・レベルはプルアップ抵抗で供給されます。
なお、高速モードに関しては立ち上がりの高速化のために機器の中で電流ソース・プルアップが内蔵されています。

以降、特に断らない限りは標準バス/ファースト・バスで話を進めて行きます。

バス信号の電圧レベルとしては2つが規定されています。
最近のマイコンの動作電源電圧は変更できますので、I2Cバスのプルアップ抵抗は VDDに接続し、 ハイ・レベル入力電圧は 0.7VDD(MIN)となります。
古いデバイスや電源電圧が固定されているデバイスを接続する場合には 5V±5% に接続し、 ハイ・レベル入力電圧は 3V(MIN)となります。

(a) シリアル・クロック(SCL)
通信は SCLで同期を取りながら行います。
通常、SCLはマスタが出力し、送信する機器は SCLがロウの期間にシリアル・データを変更し、 SCLがハイの期間では保持することで通信を行います。
しかし、スレーブが通信準備できていないとき等に SCLをロウにすることで待ち合わせを行い、 データの同期をとることができます。

iic_01

(b) シリアル・データ(SDA)
SCLに同期してデータの転送に使用されます。
マスタとスレーブのどちらからも送信することがあります。
また、通信データに対してのアクノリッジ信号も SDAを通じて送信されますので、 8ビットのデータとそれに対するアクノリッジでは転送方向が逆になります。
なお、通常の通信では必ず、SCLがロウのときに SDAは変化します。

iic_02

SCLがハイの状態でSDAが変化すると、 スタート・コンディションやストップ・コンディションのような制御信号となります。


(3)基本的な通信方法

[スタート・コンディション]
マスタが通信をスタートする時には最初にバスの使用権を獲得する必要があります。

このために、スタート・コンディションを発行します。
これはSCLがハイの状態でSDAをロウに落とすことで実現します。

このときに既に SDAまたは SCLがロウになっていると、これは他のマスタが既にバスを使っている状態ですので、 新たに通信を開始することができず、通信予約状態にします。
また、バスを使えなかったマスタがスレーブとしての機能をもっている場合にはスレーブとしての通信待ちにします。
ただし、同時に 2つ以上のマスタがスタート・コンディションを発行した場合にはこの段階ではどちらが優先かは区別できません。

なお、スタート・コンディションは通信の最初にバスを確保するために使用する以外に、 バスを確保したままでスレーブとの間のデータ送受信の方向を切り替えたりするためにも使用します。
この場合に使用するスタート・コンディションをリスタート・コンディションと呼びます。
具体的な例は後述の [リスタート・コンディション] を参照してください。

[アドレスとアービトレーション]
スタート・コンディションに続いて、 スレーブを指定するために 7ビットのアドレスと転送方向を示す 1ビットの合計 8ビットを送信します。

同時に 2つ以上のマスタがスタート・コンディションを発行した場合には、各々がスレーブのアドレスを送信することになります。
I2Cバスとしてはロウが強いので、スレーブのアドレスの小さい方への通信 (SDAをロウに保持していた方) が優先となります。
このようにして、バス使用権の調停が行われます。

iic_03

アドレス及び転送方向の送信に対して、 SCLの 9クロック目で選択されたスレーブからアクノリッジ (ロウ) が戻されます (このときに SCLをロウに引くことで、ウエイトがかかりますが、ウエイトについては別途説明します)。

指定したスレーブが存在しなければバスをロウに引くものが存在しないので、 アクノリッジは戻らないことになります。
アクノリッジが戻らなかったら通信はそこで終わりとなり、 マスタはストップ・コンディションを発行してバスの使用を中止します。

[データ転送]
スレーブとの通信が確立したら、データの転送に移ります。
このとき、スレーブは SCLをロウに引いてウエイトをかけた状態で、 アドレスの 8ビット目で指定された転送方向での通信準備を行い、 準備が完了したらSCLをロウに引くのを止めます。
これにより、SCLはマスタが制御できるようになり、マスタからのSCLでデータ転送を行えるようになります。
以下のタイミングも参照してください。

iic_04

[アクノリッジ]
データ転送は 8ビット単位で行われ、データの後にデータを受信したほうはアクノリッジを戻します。
マスタからスレーブにデータを送信する場合には、スレーブはデータを受け取ると必ずアクノリッジを戻します。
データを受け取れなかったときにはアクノリッジを戻さないことで、マスタに知らせます。

マスタが受信する場合には受信した最後のデータに対してはアクノリッジを戻さないことで、 スレーブに対して通信の終了を知らせます。
スレーブはアクノリッジがないことで通信の終了と判断し、以降の送信を中止しSDAをハイにします。
このような処理を行わないと、スレーブが次のデータの送信を開始し、SDAをロウに引っ張ってしまうと、 マスタがストップ・コンディションを発行できなくなってしまうことになります。

[ウエイト]
スレーブ(及びマスタ)はSCLをロウに引くことで通信を停止 (ウエイト) させることができます。
通常、ウエイトは 8クロック目の後 (つまりデータの転送が終了してアクノリッジを戻す前) か 9クロック目の後 (アクノリッジの後で、次の転送の前) にかけます。

受信側でデータに対してアクノリッジを戻すかどうかを判断する場合には 8クロック目でウエイトをかけます。
送信側はアクノリッジの後つまり 9クロック目でウエイトをかけることになります (これでアクノリッジを確認してその後の動作を決められます)。

[リスタート・コンディション]
EEPROMのようにデバイスのアドレス以外に内部にアドレス情報をもったデバイスの場合には I2Cバスのアドレスではデバイスそのものを選択することしかできません。
デバイスの中のどのアドレスのメモリかを指定するためのアドレス情報はデータとして送る必要があります。
書き込みの場合には下記の例のようにメモリ・アドレスに引き続いて書き込みデータを送信すればいいのですが、 読出しでは途中でデータの転送方向を切り替える必要があります。

iic_05

以下に読み出しの例を示します。
最初のスタート・コンディションでバスの使用を開始し、 デバイスのアドレスを指定します (このときはマスタからの送信を指定します)。
その後、デバイス内のアドレスをデータとして送信します。
このままでは読み出せませんので、再度スタート・コンディションを発行します。
この ST2と書いたところがリスタート・コンディションとなります。

その後、再度アドレスでデバイスを指定しますが、今度はスレーブの送信を指定します。
その後のデータはスレーブがマスタに送信するので、読み出しができるようになります。

iic_06

[ストップ・コンディション]
データ転送が終了するとバスを開放します。
このために使用するのが、ストップ・コンディションです。

マスタは SCLがロウの状態で、SDAをロウにし、SCLをハイにします。
その状態で、SDAをハイに立ち上げるとストップ・コンディションとなります。

EEPROMへの書き込みではデバイス内の実際の書き込み動作はストップ・コンディションを検出してから行います。
この情報はお役にたちましたか?
Q2
その他の仕様や仕様外の注意事項は?
A2
(1) アドレス
スレーブのアドレスを指定するためのアドレス・フィールドは 7ビットありますが、 そのすべてが自由に使える訳ではありません。
アドレスの最初の 4ビットが 0000 と 1111 は用途が規定されています。

0000 で始まるアドレスはジェネラル・コール・アドレス (0000 000) のような目的で使用します。
1111 で始まるアドレスの内で、 1111 0xx はこの xx の 2ビットとその後に続く 1バイトの合計10ビットでスレーブのアドレスを指定できます。
ただし、通常のマイコンでの使用では 10ビットのアドレスを使う可能性は低いと考えられます。

(2) バスの初期状態
I2Cバスに途中からマスタとして参加するような場合にはバスが使用中かどうかが完全には判断できません。
通常は SCLや SDAがハイの状態を保持していればバスは開放状態と考えられますが、 SCLのハイ期間については上限の規定がないので、どの程度待てばバスが開放状態と断定できません。
従って、この部分はコントローラではなく、上位のプログラムで判断する必要があります。

(3) 動作中のリセット
通信中にリセットがかかるような場合、バス上の全てのデバイスがリセットを認識できればいいのですが、 EEPROMのようにリセット信号をもたないデバイスも存在します。

この場合、もし EEPROMが SDAにロウを出力した状態であれば、 そのままではスタート・コンディションもストップ・コンディションも発行できないため、 バスは使用できなくなります。
これはコントローラでは対応できません。

この場合には、SCLを出力ポートでドライブし、出力ポートから SCLパルスを出力します。
これにより EEPROMは 1バイトの残りのデータ出力を継続します。

EEPROMがハイを出力するか、出力が終わってアクノリッジが戻らないので次の出力を止めることで SDAがハイ状態となります。
この状態になると、スタート・コンディションもストップ・コンディションも発行できますから、 バスを使用できるようになります。
この情報はお役にたちましたか?
back to top  
(2004/04)

78iic
-0001
I2Cバスのプルアップ抵抗値は?
Q1
uPD78P0308Yの I2Cバスはオープン・コレクタ信号ですがこのラインのプルアップ抵抗値はいくつにすれば良いのでしょうか。
A1
I2Cバスの規格はフィリップス社が設定しています。規格の詳細はNXP社のホームページから仕様書をご覧ください。

日本語
http://www.nxp.com/acrobat_download/literature/9398/39340011_jp.pdf

英語
http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf

ここでダウンロードできるI2Cバス仕様のp.39-40に、プルアップ抵抗の最大値/最小値、バス容量、電源電圧、接続デバイス数との関係などが説明されているようです。
この情報はお役にたちましたか?
back to top  

78iic
-0003
I2Cバスの初期設定で STT0と SPT0を同時にセットするとうまくゆかない。
Q1
uPD78F0034Aの I2Cシリアルの初期設定で STT0と SPT0を同時にセットしていますが設定がうまく行きません。 スタート・コンディション、ストップ・コンディションの設定方法を教えてください。
A1
基本的なところに問題があります。
STT0と SPT0を同時にセットされているようですが、これは禁止です。 このような設定は絶対に行わないでください。
先ず、ストップ・コンディションの生成を行い、その後にスタート・コンディションの生成に移ります。 ストップ・コンディションの生成は IICCL0でクロックの選択を行った後、 IICC0で IICE0と SPT0をセットしてください。
この情報はお役にたちましたか?
back to top  

78iic
-0004
外部の EEPROMに I2Cバスで接続する場合の処理例(マスタ)
Q1
外部の EEPROMに I2Cバスで接続する場合の処理例(マスタとしての動作)を教えてください。
A1
1.処理の概略手順

通信を行うには、以下の手順となります。
  (0)ポートの設定   (PM32,33を 1、P32,33を 0に設定)
  (1)転送クロックの設定
  (2)コントロール・レジスタの設定
  (3)PM32, 33を 0に設定
  (4)ストップ・コンディションを発行し、バスが解放されているのを確認
   (割り込み又は SPD0がセットされることで確認する)
  (5)スタート・コンディションを発行し、バスの占有を行う    (STD0がセットされた事を確認する)
  (6)スレーブのアドレスを送信し、スレーブの存在を確認(ACK)
   (割り込みのタイミングで ACKD0を確認する。ACKがなければ転送を中止する)
  (7)EEPROMのアドレスを送信する

書き込みの場合には引き続き
  (8)書き込むデータを送信して、割り込みで ACKを確認する
   (ACKがなければ、転送動作を終了)
  (9)ページ・ライトで書き込むデータが残っていれば(7)を繰り返す
  (10)ストップ・コンディションを発行して書き込みを終了する

読み出しの場合には
  (11)スタート・コンディションを発行して、データ転送を読み出し方向に
  (12)8クロック・ウエイト、自動ACK応答をセット
  (13)ダミー・データ(0FFH)を書いて転送をスタート
  (14)受信完了したらデータを読み出す
  (15)全データの受信が完了したら、自動ACK応答をキャンセルし、9クロック・ウエイトにして、 8クロック目でウエイト解除
  (16)ストップ・コンディションを発行する

2.処理フロー
以上の処理を行う場合のフローをPDFに示します。
なお、ここでは簡単のために、データは全て連続して読み出したり、書き込んだりできるものとします。

3.注意点
(1)ACKについての誤解
  ACKを受信しなかった時に ACK待ちでループしてはいけません。 I2Cでは ACKのタイミングは固定されており、 そのタイミングで ACKが来なければ、もう ACKと認識されることはありません。 ACKが来なければ通信は中止してください。
(2)転送方向についての誤解
  スレーブからデータを読み出す際に、スレーブ(EEPROM)に 2バイトのアドレスをデータとして送信して、 そのままデータの受信動作には移りません。 I2Cバスとしてこのような動作はあり得ません。 EEPROMのアドレスを指定した後、リスタートを行い、データのリードで再度通信を再開する必要があります。  使用される EEPROMの仕様を御確認ください。
この情報はお役にたちましたか?
back to top  
(2003/03)

78iic
-0005
I2Cバスが起動できない [78K共通]
Q1
uPD780034AYでマニュアルのフローを以下のようにプログラムしたが、 ストップ・コンディションを検出できない。
    PM3.2 = 1;           /* 兼用ポートの設定 */
    PM3.3 = 1;
    P3.2= 0;
    P3.3= 0;

    IICCL0.3 = 0;        /* 動作モードの設定 */
    IICCL0.2 = 0;
    IICCL0.0 = 0;
    IICE0 = 1;           /* I2C制御レジスタ0の設定 */
    WTIM0 = 1;           /* 割り込みタイミング設定 */

    PM3.2 = 0;
    PM3.3 = 0;

    SPT0 = 1;            /* ストップ・コンディション生成 */
    while (SPD0 != 1) {  /* ストップ・コンディション検出 */
    }
A1
兼用ポートの設定をビット操作されているのが原因です。
P3.3=0; とされたときに P3.2 の状態が外部端子の状態 (入力ポートでプルアップされているので 1 が読める) である 1 になってしまい、 SDA0端子 (P3.2) が 1 のままとなります。

このため、ストップ・コンディション (SCL0端子が 1のときの SDA0の立ち上がりエッジ) が生成できません。
ポートの設定はバイト単位で行うか、PMレジスタを出力に設定したあとで、 P3.3=0; を実行するようにしてください。

FAQ共通項目の ビット操作の注意点 もご参照ください。
この情報はお役にたちましたか?
back to top  
(2004/04)

78iic
-0006
I2Cバスの制御がうまくいかない [共通]
Q1
uPD780034AYで I2Cバスを制御しようとしているが、アドレス送信から先に進めない。
    do{
        IIC0 = 0B10100000;    /* アドレス&方向設定 */
        do { NOP();
        } while ( IICIF0 == 0 );
            IICIF0 = 0;
    } while ( ACKD0 == 0 );
A1
ACKD0確認でのループをやめてください。
I2Cバスではアドレス送信でアクノリッジが戻らなかったら、 そのアドレスのスレーブは存在しないと考えてください。

お問い合わせのプログラムでは ACKD0確認でループして、再度アドレスを送っていますが、 それがアドレスと解釈されることはなく、アクノリッジは戻りません。
再度アドレス指定からやり直すのであれば、スタート・コンディションの発行からやり直してください。

(2004/04)

この情報はお役にたちましたか?
Q2
アドレス送信でアクノリッジが戻らなかった場合にACKD0でのループがいけない理由はなんですか。
A2
I2Cバスではスタート・コンディションの直後がアドレスの指定と定義されています。従って、スタート・コンディションの直後にアドレスを送信して、アクノリッジが戻らないからといって、再度送信しても、スレーブはそれをアドレスとは解釈しません。
スレーブに対して、アドレスだと認識させるには、再度スタート・コンディションを発行して、アドレスを送り直してください。
または、ストップ・コンディションを発行して、一旦バスを開放し、時間をおいてから、再度スタート・コンディションを発行して、アドレスを送信してみてください。

備考
明らかに存在するスレーブのアドレスを指定しているのにアドレスに対してアクノリッジが戻らない場合にはスレーブが何らかの処理中でビジー状態にあり、応答しない可能性が考えられます。これは個々のデバイスで異なると考えられますので、個々のデバイスのマニュアルで確認してください。

(2008/01)

この情報はお役にたちましたか?
back to top  
(2008/01)

78iic
-0007
I2Cのクロック周波数が設定と異なる [共通]
Q1
uPD784031Yでプリスケーラで設定したクロック周波数と実際にバスで測定した周波数が異なるのはなぜか?
A1
設定できるのは信号の立ち上がり時間が 0 の時の周波数に該当するものです。
実際のバスではバスの容量により立ち上がりが鈍ってきます。
その分は余分に時間が必要になるので、設定した周波数よりは遅くなります。
この情報はお役にたちましたか?
back to top  
(2004/04)

78iic
-0008
EEPROMの読み出しはうまくいったが、その後スタート・コンディションがうまくいかない [共通]
Q1
uPD784031Yで EEPROMの読み出しはうまくいき、ストップ・コンディションを発行して処理を終了、 その後スタート・コンディションを発行しようとしたが、SDAがロウに落ちない。
A1
ストップ・コンディションを設定し、 実際に発行されたことを確認せずにスタート・コンディションを発行されているのではないかと思われます。
ストップ・コンディションやスタート・コンディションは実際に発行されたことを確認してから次の処理に移ってください。

(2004/04)

この情報はお役にたちましたか?
Q2
EEPROMの読み出しは正しい内容が読み出すことができたのですが、その後ストップ・コンディションを発行しようとしても発行できません。SDA信号を確認したところ、SDAがロウの状態で止まっているようです。
A2
EEPROMから最後のデータを読み出したときにACKを戻してはいないでしょうか。
スレーブ(EEPROM)はマスタからACKが戻るかどうかで転送を終了するか継続するかの判断を行います。そのため、マスタからACK応答があると引き続いて次のデータを送信しようとします。そのときの出力データがロウであれば、マスタがストップ・コンディションを発行しようとしてもSDAがハイにならないので、ストップ・コンディションを発行できません。
マスタで受信するときにこのような状態にならないようにするには、最後の受信データを受信するときにACK応答しないように設定しておく必要があります。このための具体的な方法としては以下の2つが考えられます。

(1)受信では8クロック・ウェイトを使う(受信データで受信完了を判断するような場合)
  • 最後のデータ以外を受信した場合にはACK応答に設定して、次の受信を起動します
  • 最後のデータを受信した場合には、ACK応答しない設定にし、9クロック・ウェイトに変更して、8クロック目でのウェイトを解除します。これで、SDAがハイになり、9クロック目でのウェイト状態になるので、ストップ・コンディションを発行します。


(2)受信でも9クロック・ウェイトを使う場合
受信を起動する前に、残りデータ数をチェックして、
  • 残りデータ数が1ならACK応答しない設定にして受信を起動します。
  • 残りデータ数が1以外ならACK応答するように設定にして受信を起動します。

データ受信が完了したら、全てのデータの受信が完了したかを確認します。全てのデータの受信が完了していなければ、引き続いて残りのデータ受信を継続します。全てのデータの受信が完了したならば、通信を終了してストップ・コンディションを発行します。

(2008/03)

この情報はお役にたちましたか?
back to top  
(2008/03)

78iic
-0201
簡易I2Cバスとは? [78K0R共通]
Q1
78K0R/Kx3の簡易I2Cバスとは何でしょうか?
A1
I2Cバスのシングルマスタ・モードでのマスタとしての機能だけをもったものです。ウェイト機能はサポートしていないので、接続するスレーブには遅いものはつなげられません。

(2007/09)

この情報はお役にたちましたか?
back to top  
(2007/09)

78iic
-0202
簡易I2C機能(78K0R)
Q1
マニュアルに記載されたフローを参考にし、78K0R/KG3に搭載されたシリアル・アレイを簡易I2Cで使用してEEPROMを制御しようとしています。EEPROMへの書き込みと読み出しはうまくいったのですが、その後の動作がおかしくなることがあります。何が原因でしょうか。また、どう対策すればいいのでしょうか。
A1
EEPROMからデータを読み出したときの最後のデータに対してACKを戻しているために、EEPROMが読み出し継続と判断して次のデータを出力し、そのデータがSDA信号をロウに引いてしまっているのが原因ではないでしょうか。
この対策としては、マニュアル記載のフローチャートのデータの受信をスタートする前に残りデータ数が1になったかの判断を追加して、残りが1になったらSDAへの出力を禁止することが考えられます。(以下の青の部分の処理を追加してください。)


(2008/03)

この情報はお役にたちましたか?
back to top  
(2008/03)

78iic
-0301
I2Cバスへの不要な信号出力。[78K0/Kx]
Q1
78K0/Kx2のユーザーズ・マニュアルのI2Cのフローチャートを参照し、次のようにプログラムしましたが、最初にI2CバスのSCL0端子やSDA0端子からロウ信号が同時出力されて、その意味がわかりません。どこか間違いがあるでしょうか?

/* ポートの設定 */
  P6 = 0x00;    /* 兼用端子をOR回路を通してIIC用にするために、ポート側を0に設定 */
  PM6 = 0xFC;   /* 兼用端子を出力モードに */

/* I2Cの初期設定 */
  IICX0 = 0x00;    /* 転送クロックの選択 */
  IICCL0 = 0x01;   /* 標準モードの転送クロックの選択 */
  SVA0 = 0x02;     /* 自局アドレスの設定 */
  IICF0 = 0x00;    /* 開始条件の設定 */

/* 通信開始準備 */
  IICC0 = 0x9C;      /* I2C通信許可 */
  SPT0 = 1;          /* ストップ・コンディション生成 */
  while (SPD0 != 1){
  }                  /* ストップ・コンディション検出 */
  STT0 = 1;          /* スタート・コンディション生成 */

/* 通信開始 */
  IIC0 = 0x04;     /* マスタ送信開始 */
    :
    :
A1
以下のプログラムように、ポートの設定ではP60とP61をポートを1(ハイ)にして置いて、IICE0ビットを1にした(I2C通信許可)後にP60とP61を0(ロウ)にしてください。
IIC0機能が動作許可(IICC0レジスタのIICE0ビットを1にする)まで、ポート機能として動作しておりますので、ポートの設定でP60とP61を0(ロウ)にしてP60とP61を出力設定すると、SCLバス上とSDAバス上にロウを出力してしまいます。

/* ポートの設定 */
  P6 = 0x03;   /* 兼用端子をOR回路を通してI2Cバス上1を出力して
                  おくために、ポートを1に設定 */

  PM6 = 0xFC;   /* 兼用端子を出力モードに */

/* I2Cの初期設定 */
  IICX0 = 0x00;    /* 転送クロックの選択 */
  IICCL0 = 0x01;   /* 標準モードの転送クロックの選択 */
  SVA0 = 0x02;     /* 自局アドレスの設定 */
  IICF0 = 0x00;    /* 開始条件の設定 */

/* 通信開始準備 */
  IICC0 = 0x9C;      /* I2C通信許可 */
  P6 = 0x00;    /* 兼用端子をOR回路を通してIIC用にするために、
                  ポート側を0に設定 */

  SPT0 = 1;          /* ストップ・コンディション生成 */
  while (SPD0 != 1){
  }                  /* ストップ・コンディション検出 */
  STT0 = 1;          /* スタート・コンディション生成 */

/* 通信開始 */
  IIC0 = 0x04;     /* マスタ送信開始 */
    :
    :

(2008/01)

この情報はお役にたちましたか?
back to top  
(2008/01)









































 ご利用にあたって  個人情報保護について  RSS       © 1995-2008  NEC Electronics Corporation