日本語参考資料 最新版英語アプリケーションはこちら AN-1159 アプリケーション・ノート Cortex-M3 ベースの高精度アナログ・マイクロコントローラ (ADuCxxx ファミリー) の I2C 互換インターフェース 著者: Bridget Dowling はじめに このアプリケーション・ノートでは、アナログ・デバイセズの Cortex-M3 ベースの高精度マイクロコントローラ・ファミリー (ADuCxxx ファミリー)を使用した I2C(Inter-Integrated Circuit) 互換インターフェースのハードウェア・マスターとハードウェ ア・スレーブの実装について説明します。 I2C バスの主な特長は、 • • このアプリケーション・ノートには、I2C インターフェースを 使ってマスターとスレーブが相互に通信する方法を示すコード 例も記載してあります。次の例が含まれています。 • • • • マスターの送信と受信 スレーブの送信と受信 スレーブ・モードでの DMA 転送(送信と受信) マスター・モードでの DMA 転送(送信と受信) • • • コンパニオン・コードについては、http://www.analog.com/jp/の AN-1159 コンパニオン・コード zip ファイルをご覧ください。 シリアル・データ・ライン(SDA)とシリアル・クロッ ク・ライン(SCL)の 2 本のバス・ラインのみが必要です。 これらのラインは双方向であるので、マスターとスレーブ はトランスミッタまたはレシーバとして動作可能です。 I2C マスターは複数のスレーブ・デバイスと通信すること ができます。各スレーブ・デバイスは固有のアドレスを持 つため、マルチスレーブ環境においても常にマスターと各 スレーブとの間で固有の関係が成立します。 調停機能を使うと、同じ I2C バス上に複数のマスターが存 在できます。 マスターとスレーブは、最大 400 kbps で送受信できます。 内蔵フィルタ機能により SDA ラインと SCL ラインで 50 ns 以下のスパイクを除去し、データ・インテグリティを維持 します。 複数デバイスの代表的な I2C 接続を図 1 に示します。 3.3V PULL-UP RESISTOR MASTER PULL-UP RESISTOR SCL SCL SDA SDA SLAVE 1 SLAVE 2 SDA 10882-001 SCL 図 1.シングル・マスター・マルチ・スレーブ I2C のブロック図 アナログ・デバイセズ社は、提供する情報が正確で信頼できるものであることを期していますが、その情報の利用に関して、あるいは利用によって 生じる第三者の特許やその他の権利の侵害に関して一切の責任を負いません。また、アナログ・デバイセズ社の特許または特許の権利の使用を明示 的または暗示的に許諾するものでもありません。仕様は、予告なく変更される場合があります。本紙記載の商標および登録商標は、それぞれの所有 者の財産です。※日本語版資料は REVISION が古い場合があります。最新の内容については、英語版をご参照ください。 Rev. A ©2015 Analog Devices, Inc. All rights reserved. 本 社/〒105-6891 東京都港区海岸 1-16-1 ニューピア竹芝サウスタワービル 電話 03(5402)8200 大阪営業所/〒532-0003 大阪府大阪市淀川区宮原 3-5-36 新大阪トラストタワー 電話 06(6350)6868 AN-1159 アプリケーション・ノート 目次 はじめに .............................................................................................. 1 マスター受信 ................................................................................ 11 改訂履歴 .............................................................................................. 2 スレーブ送信 ................................................................................ 12 I2C の基礎 ............................................................................................ 3 DMA モード、マスター送信 ...................................................... 13 代表的な I C タイミング図 ............................................................... 6 DMA モード、マスター受信 ...................................................... 14 Cortex-M3 ベースの MicroConverter の I2C の実装 ....................... 7 DMA モード、スレーブ送受信 .................................................. 15 マスター送信 .................................................................................. 9 コンパニオン・コード ................................................................ 16 2 スレーブ受信 ................................................................................ 10 改訂履歴 12/13—Rev. 0 to Rev. A Changes to Figure 16 .......................................................................... 13 Changes to Figure 19 .......................................................................... 15 9/12—Revision 0: Initial Version Rev. A - 2/16 - AN-1159 アプリケーション・ノート I2C の基礎 MSB LSB SLAVE ADDRESS SCL LSB R/W DATA 3 TO 6 1 2 2 TO 7 7 8 9 START BIT 1 8 9 ACK BIT ACK BIT STOP BIT 10882-002 SDA MSB 図 2.代表的な I2C 転送シーケンス I2C インターフェースの概要 ストップ条件 I C は、Philips Semiconductors 社(現在の NXP Semiconductors 社)が開発した 2 線式シリアル通信システムで、複数のマスター と複数のスレーブを 2 本の線(SCL と SDA)で接続することが できます。I2C インターフェースでは、少なくとも 1 つのマス ターと 1 つのスレーブが存在する必要があります。 データ転送シーケンスは、ストップ条件で停止します。ストッ プ条件は、SCL がハイの間に SDA ラインがローからハイへ変化 することであると定義されます (図 4 参照)。 SCL 信号は、マスターとスレーブの間のデータ転送を制御しま す。転送される各データ・ビットに対して 1 個のクロック・パ ルスを発生します。SCL 信号は常にマスターからスレーブへ送 信します。ただし、スレーブは次の送信を開始できない場合、 このラインをロー・レベルにすることができます。これはクロ ック・ストレッチと呼ばれます。 SDA 信号は、データの送信または受信に使います。SDA 入力は、 SCL がハイの間安定している必要があります。SCL がハイの間 に SDA ラインが変化すると、スタート条件またはストップ条件 と見なされます。代表的な転送シーケンスを図 2 に示します。 スタート条件 I2C インターフェースの代表的なデータ転送シーケンスは、ス タート条件で開始されます。スタート条件は、単に SCL をハイ に保ったまま SDA ラインをハイからローへ変化させます (図 3 参照)。スタート条件は常にマスターが発行します。スタート (およびストップ) 条件は、SCL ラインがハイの間に SDA ライ ンを変化させてもよい唯一のときです。通常のデータ転送では (スレーブ・アドレシングも含む)、SDA ライン上のデータは、 SCL ラインがハイの状態で安定している必要があります。 SDA START 10882-003 SCL 図 3. I2C のスタート条件 SDA SCL STOP 10882-004 2 図 4.I2C のストップ条件 ストップ条件は常にマスターが生成します。データ・シーケン スが終了した場合、またはスレーブ・デバイスからマスターが NACK を受信した場合に、マスターはストップ条件を送信しま す。ストップ条件を受信すると、スレーブ・デバイスがリセッ トされ、スレーブ・アドレス待ちの状態に戻ります。 ストップ条件で割込みを発生するように I2C インターフェース を設定することができます。 スレーブ・アドレス スタート条件の後、マスターは 8 個の SCL パルスと一緒に、最 上位ビット(MSB)を先頭にして SDA ラインに 1 バイトを送 信します。このバイトの最初の 7 ビットは、7 ビットのスレー ブ・アドレスです。この 7 ビット・アドレスがスレーブ・デバ イスのアドレス (すなわち、4 つのスレーブ・アドレスのうち の 1 つ)に一致した場合にのみ、スレーブはマスターに応答し ます。8 番目のビットすなわち最下位ビット (LSB)は、R/W ステータス・ビットです。R/W ステータス・ビットはメッセー ジの方向を指定します。このビットがローの場合、マスターは 選択したスレーブにデータを書込みます。このビットがセット されていると、マスターはスレーブからのデータ受信を期待し ます。いずれのケースもマスターがクロックを発生します。 スレーブが正しいアドレスを受信すると、すなわちマスターか らの 7 ビットの MSB が、I2CADR0 メモリ・マップド・レジスタ (MMR)の 7 ビットの MSB と一致すると、スレーブは有効な ACK を返すため SCL ラインをローにして、I2CSSTA のフラグ をセットします。 スレーブはすべての I2C スレーブ・アドレシングの操作を自動 的にハードウェアで行いますが、スレーブ・アドレスを正しく 出力するのはマスターの役割です。 Rev. A - 3/16 - AN-1159 アプリケーション・ノート レーブが NACK を受信すると、スレーブは SDA ラインを解放 して、マスターがストップ条件を生成できるようにします。 アクノリッジ(ACK/ナック(NACK) スレーブ・アドレスがマスターから送られたアドレスに一致す ると、スレーブは自動的にアクノリッジ(ACK)を送信します。 そうでない場合は、ナック(NACK)を送信します。ACK は、 9 番目のクロック・パルスのときの SDA ラインのロー・レベル として検出されます。NACK は、9 番目のクロック・パルスの ときの SDA ラインのハイ・レベルとして検出されます(図 5 参 照)。 NACK を強制するように、スレーブを設定することもできます。 データ転送 I2C 割込みサービス・ルーチン (ISR)またはポーリング方式で は、スレーブはマスターから送信された R/W ビットの状態に応 じて送信または受信を決定します。次にスレーブは、マスター から送信された各クロックでビットを送信または受信します。 マスターとの間でスレーブがデータを送信/受信するために 9 個 のクロック (データに 8 個と ACK に 1 個)を供給するのはマ スターの役割です。スレーブによって有効なデータ・バイトが 送信または受信されるごとに I2C 割込みビットがセットされま す。 データ転送時、ACK または NACK は常にレシーバが生成しま すが、ACK に必要とされるクロック・パルスは常にマスターが 生成することに注意してください。トランスミッタは ACK ク ロック・パルスの間、SDA ラインを解放する(ハイにする) 必 要があります。有効な ACK の場合、レシーバは SDA ラインを ローにする必要があります。 ここでも、スレーブ・トランスミッタ/マスター・レシーバ・シ ステムでは、スレーブから送信された最後のバイトの後でマス ターが NACK を送信して、マスターがデータ・シーケンスの終 わりをスレーブへ通知する必要があることに注意してください。 スレーブが NACK を受信すると、スレーブは SDA ラインを解 放して、マスターがストップ条件を生成できるようにします。 受信時、ACK と NACK は各バイトの最後に、ハードウェアに より自動的に生成されます。 マスターがスレーブ・レシーバから NACK を受信した場合 (スレーブがスレーブ・アドレスまたは送信されたデータに応答 しない場合)、マスターはストップ条件を生成し、転送を停止 する必要があります (データ転送のセクション参照)。 マスターがデータ転送をアボートする場合、またはバス上の別 のマスターのデータ転送に割込む場合、マスターはスタート条 件を送信し、その後にストップ条件を送信して、これを行うこ とができます。 マスター・レシーバは、スレーブから送信された最終バイトの 後にナック (NACK) を生成して、データ・シーケンスの終わ りをスレーブ・トランスミッタに通知する必要があります。ス SDA FLOATS (HIGH) FOR NACK DATA OUTPUT BY RECEIVER RECEIVER PULLS SDA LOW FOR ACK DATA OUTPUT BY TRANSMITTER DATA LSB TRANSMITTER RELEASES SDA 7 8 9 CLOCK PULSE FOR ACKNOWLEDGE 図 5.I2C バス上のアクノリッジ(ACK)とナック(NACK) Rev. A - 4/16 - 10882-005 MASTER CLOCK AN-1159 アプリケーション・ノート 繰り返しスタート条件 クロック・ストレッチ 繰り返しスタート条件は、ストップ条件が送信されることなく 2 つ目のスタート条件がスレーブへ送信されたときに発生しま す。これにより、マスターはバス制御を放棄することなく R/W ビットを変更することにより、転送方向を変更できるようにな ります。 I2C 通信では、マスター・デバイスがクロック速度を決定しま す。RS-232 とは異なり、I2C バスではマスターとスレーブが既 定のボー・レートに正確に同期しなくて済むように、専用のク ロック信号を使用しています。 ただし、マスターによって与えられるクロック速度で I2C スレ ーブが動作できないために、少し速度を下げる必要がある場合 があります。これは、クロック・ストレッチと呼ばれるメカニ ズムで実行されます。 転送シーケンスの例を図 6 に示します。これは一般に、デバイ スへ送られた最初のデータが読出し対象のレジスタ・アドレス を設定する場合に使用されます。“繰り返しスタート + スレー ブ・アドレス” が受信されると、割込みが発生します。 I2CxSSTA MMR のステータス・ビットを使用することにより、 これを“スタート + スレーブ・アドレス” から区別することがで きます。 I2C スレーブがバス速度を下げる必要がある場合、クロックを ロー・レベルに保持することができます。これに対して、マス ターはクロック信号をハイ状態に解放した後に、クロック信号 をリードバックして、ラインが実際にハイになるまで待つ必要 があります。 MSB SDA LSB 1 2 3 TO 6 LSB R/W SLAVE ADDRESS SCL MSB 7 DATA 8 START BIT MSB 9 1 ACK BIT 2 TO 7 LSB 9 ACK BIT 1 2 3 TO 6 LSB R/W SLAVE ADDRESS 8 MSB 7 8 START BIT DATA 9 1 2 TO 7 ACK BIT 図 6. I2C 繰り返しスタート・シーケンス I2cFifoFlush(MASTER, ENABLE); I2cFifoFlush(MASTER, DISABLE); NVIC_DisableIRQ(I2CM_IRQn); I2cMWrCfg(0xA0); // configure to send slave address I2cTx(MASTER, ucStartAddress); // send slave address while ((I2cSta(MASTER)& I2CMSTA_TXFSTA_EMPTY) != I2CMSTA_TXFSTA_EMPTY){} {} // wait for the Tx FIFO to empty I2cMRdCfg(0xA0, ucLength , DISABLE); // sends out the read condition, this function sets the read bit NVIC_EnableIRQ(I2CM_IRQn); Rev. A - 5/16 - 8 9 ACK STOP BIT BIT 10882-006 図 6 に示すシーケンスを使用することにより、ADuCxxx ファミ リーはマスター・モードで直接 I2C 繰り返しスタート・シーケ ンスを発生することができます。 AN-1159 アプリケーション・ノート 代表的な I2C タイミング図 表 1 と表 2 に、Cortex-M3 ベースの高精度アナログ・マイクロコンバータに実装されている I2C バスの代表的なタイミングを示します。各 I2C バス・ラインの容量負荷 Cb は、I2C バス仕様によると最大 400 pF です。 SCL と SDA の内部プルアップは、ソフトウェアからディスエーブルする必要があることに注意してください。 表 1. 高速モード(400 kHz)での I2C タイミング Parameter Description Min Max Unit tL tH tSHD tDSU tDHD tRSU tPSU tBUF tR tF tSUP Clock low pulse width Clock high pulse width Start condition hold time Data setup time Data hold time Setup time for repeated start Stop condition setup time Bus-free time between a stop condition and a start condition Rise time for both clock and data Fall time for both clock and data Pulse width of spike suppressed 1300 600 600 100 0 600 600 1.3 20 + 0.1 Cb 20 + 0.1 Cb 0 300 300 50 ns ns ns ns ns ns ns μs ns ns ns Max Unit 1 300 µs µs µs ns µs µs µs µs µs ns 表 2. 標準モード(100 kHz)での I2C タイミング Parameter Description Min tL tH tSHD tDSU tDHD tRSU tPSU tBUF tR tF Clock low pulse width Clock high pulse width Start condition hold time Data setup time Data hold time Setup time for repeated start Stop condition setup time Bus-free time between a stop condition and a start condition Rise time for both clock and data Fall time for both clock and data 4.7 4.0 4.7 250 0 4.0 4.0 4.7 tSUP tBUF tR MSB LSB tDSU tSHD SCL (I) P S tDHD 2 TO 7 8 tL 9 tSUP STOP START CONDITION CONDITION 1 S(R) REPEATED START 図 7. I2C 互換インターフェースのタイミング Rev. A tR tRSU tH 1 MSB tF tDSU tDHD tPSU ACK - 6/16 - tF 10882-007 SDA (I/O) AN-1159 アプリケーション・ノート 次のフローチャートでは、I2C ペリフェラル・クロックがイネ ーブルされ、設定済みであると想定しています。 Cortex-M3 ベースの MicroConverter の I2C の実 装 Cortex-M3 ベースの ADuCxxx ファミリーは、フル・ハードウェ アのマスター I2C ポートとスレーブ I2C ポートを内蔵していま す。 I2C ペリフェラル・インターフェースは、合計 19 個のレジスタ から構成されています(マスター用に 9 個、スレーブ用に 9 個、 マスターとスレーブの共用に 1 個)。これらの一覧を表 3 に示 します。 I2C ハードウェア・インターフェースは、I2C 機能あたり 4 個の 2 バイト FIFO を内蔵しています。 • • • • マスター受信 マスター送信 スレーブ受信 スレーブ送信 これらの各々は、受信/送信するバイトの残りのビットを保持す るシフトレジスタを内蔵しています。 表 3.I2C レジスタ Master Slave Shared Receive Transmit Status Control Address/ID I2CMRX I2CMTX I2CMSTA I2CMCON I2CADR0/ I2CADR1 I2CDIV I2CMRXCNT I2XMCRXCNT I2CSRX I2CSTX I2CSSTA I2CSCON I2CID0/I2CID1/ I2CID2/I2CID3 I2CFSTA I2CFSTA 送信 FIFO データを送信するときは、I2CSTX/I2CMTX レジスタへロード する必要があります。 I2CSTX OUT I2CALT BYTE 1 BYTE 0 10882-008 Registers Clock Other FIFO の使用 図 8. 送信 FIFO すべてのレジスタとビットの説明は、デバイス・ユーザー・ガ イドに記載されています。 幾つかの特定機能は、このアプリケーション・ノートで詳しく 説明しています。 通信速度の設定 I2CDIV は 16 ビット・レジスタで、2 つの 8 ビット値 HIGH と LOW を格納します。このレジスタ値が I2C バスの速度を次式に 従って設定します。 fI2CSCL = fPERIPH/(LOW + HIGH + 3) ここで、 fPERIPH は I2C ペリフェラル・クロック。 HIGH = I2CDIV[15:8]。I2C バス・クロックのハイ・レベル区間 は、(HIGH + 2) ÷ I2C ペリフェラル・クロックで決定されます。 LOW = I2CDIV[7:0]。I2C バス・クロックのロー・レベル区間は、 (LOW + 1) ÷ I2C ペリフェラル・クロックで決定されます。 したがって、100 kHz 動作の場合、I2C ペリフェラル・クロック = 16 MHz で、LOW = 0x4F、HIGH = 0x4E。400 kHz の場合、 LOW = 0x13、HIGH = 0x12。 ADuCM360 固有の部分 ADuCM360 では、I2C ペリフェラル・クロックは次式で与えら れます。 fPERIPH = fUCLK ÷ (CLKSYSDIV × I2CCLK) ここで、 UCLK はシステム・クロックであり、16 MHz。 CLKSYSDIV は、CLKSYSDIV[0] ビットの設定に応じて 1 また は 2。 I2CCD はクロック分周値であり、CLKCON1[8:6] ビットにより 1 ~ 7 の値に設定されます。 Tx レジスタへのバイト書込みは、 FIFO のバイト 1 への書込み と等価です (図 8 参照)。 • バイト 0 がエンプティの場合、バイト 1 内のバイトが自動 的にバイト 0 へプッシュされます。これはユーザーから見 えません。I2CFSTA レジスタは、FIFO に 1 バイトが存在 するとき表示します。 • バイト 0 が既にフルの場合、バイトはバイト 1 に留まりま す。Tx に再度書込みを行うと、バイト 1 が上書きされます。 バイト 0 のシフトレジスタ (OUT)への移動もユーザーから見 えませんが、スレーブ側で有効な通信が必要です。 FIFO は フ ル で な い 場 合 、 TXREQ ビ ッ ト ( I2CMSTA[2]/ I2CSSTA[2])をセットします。これらのビットがイネーブルさ れていると、割込みが発生します。 I2CFSTA レジスタの送信 FIFO フラッシュ・ビットをセットす ると、FIFO がエンプティになります。 受信 FIFO データを受信するときは、データはバイト 0 に到着します。 • バイト 1 がエンプティの場合、バイト 0 が自動的にバイト 1 へシフトされます。 • バイト 1 が既にフルの場合、I2CSRX が読出されるまで (バイト 1 の読出しと等価 )、バイト 0 はそこに留まりま す。 • FIFO がフルのとき他のデータが到着すると、スレーブはそ のデータに対して NACK を送信し、I2CSSTA[4](マスター の場合は I2CMSTA[9] )をセットします。 FIFO がエンプティでない場合、RXREQ ビット(I2CMSTA[3]/ I2CSSTA[3])をセットします。これらのビットがイネーブルさ れていると、割込みが発生します。 I2C ペリフェラル・クロックはデフォルトでディスエーブルさ れており、CLKDIS[2]で最初にイネーブルする必要があります。 これは、デバイスの消費電力を最適化するためのものです。詳 細については、AN-1111 アプリケーション・ノート「Options for Minimizing Power Consumption When Using the ADuCM360/ADuCM361」を参照してください。 Rev. A - 7/16 - AN-1159 アプリケーション・ノート メモリからすべてのバイトが送信 FIFO へ転送されたとき、ま たは DMA チャンネルに割り当てられたメモリがフルのとき、 DMA 転送が終了して、割込みが発生します。 I2CSRX BYTE 1 BYTE 0 I2C ステータス・ビットの TXREQ と RXREQ は DMA モードで セットされた場合、割込みは生成しませんが、トランザクショ ン終了を表す TCOMP ビットは割込みを発生させることができ るので、 DMA モードで使用することができます。 10882-009 IN 図 9. 受信 FIFO I2C 低レベル関数 DMA チャンネルの使用 DMA コントローラの次の 4 チャンネルが I2C インターフェース に割当てられています。 • • • • マスター受信 マスター送信 スレーブ受信 スレーブ送信 コード開発を簡単化するため、低レベル関数のセットが I2cLib に用意されています。これらの関数を表 4 に示します。これら は、CD/DVD のドキュメント・フォルダで詳しく説明していま す。 各シナリオのフローチャートは、これらの低レベル関数を使用 しています。 送信の場合は送信 FIFO に空きがあるとき、受信の場合は受信 FIFO にバイトが存在するとき、I2C ペリフェラルは DMA 要求 を発生します。 表 4.I2C 低レベル関数 Master Configuration Description int I2cMCfg(int iDMACfg, int iIntSources, int iConfig); int I2cBaud(int iHighPeriod, int iLowPeriod); int I2cMWrCfg(unsigned int uiDevAddr); int I2cMRdCfg(unsigned int uiDevAddr, int iNumBytes, int iExt); int I2cMRdCnt(void); Configure I2C master Configures I2C baud rate Configures slave address Configures slave address, number of bytes to read Read the counter of bytes received by the master Slave Configuration Description int I2cSCfg(int iDMACfg, int iIntSources, int iConfig); int I2cSIDCfg(int iSlaveID0, int iSlaveID1, int iSlaveID2, int iSlaveID3); int I2cSGCallCfg(int iHWGCallAddr); Configures I2C slave Configure the slave addresses Setup the hardware general call Common Functions Description int I2cRx(int iMode); int I2cTx(int iMode, int iTx); int I2cStr(int iMode, int iStretch); int I2cFifoFlush(int iMode, int iFlush); int I2cSta(int iMode); Reads the Rx register of the slave or master Writes in the Tx register of the slave or master Configures clock stretching Flush slave or master Tx FIFO Reads the status of the slave or master Rev. A - 8/16 - AN-1159 アプリケーション・ノート マスター送信 バイトを送信するには、データを先に送信 FIFO へロードしま す。スレーブのアドレスは、I2CADR0 レジスタで指定します。 データ書込みの場合は、アドレス・レジスタの書込み( W )ビ ットをゼロに設定します。I2CADR0 レジスタに書込みを行うと、 スタート条件が自動的に発生します。 送信 FIFO がエンプティであるか、またはフルではなく、かつ I2CMSTA のビット 2 がセットされた場合、送信されたバイトの 先頭クロックで I2C 割込みが発生し、マスターがバイトを送信 したことを示します。これにより、ユーザーはバイトを FIFO に 追 加 す る こ と が で き ま す 。 FIFO の ス テ ー タ ス は 、 I2CMSTA[1:0]または I2CFSTA レジスタでチェックすることが できます。 転送を開始するとき FIFO に 1 バイトしか存在しない場合、最 初の I2C 割込みは送信されたアドレスの先頭クロックで発生し ます。FIFO に 2 バイト存在する場合は、送信された最初のバイ トの先頭クロックで割込みが発生します。 れてから½ クロック・サイクル以内に、すなわちスレーブ・ア クノリッジ・ビットの間にデータが FIFO にロードされないと、 マスターは自動的に送信を終了します。 ストップ条件は、最終バイト送信の 5.1 µs 後に自動的に発生し ます。 I2CMCON MMR の TXREQ 割 込 み イ ネ ー ブ ル ・ ビ ッ ト (I2CMCON[5])をクリアする必要があります。そうしないと、 ストップ条件が発生するまで、送信割込みが連続して発生しま す。 割込みがイネーブルされている場合 (I2CMCON[8])、ストッ プ条件が発生すると、TCOMP ビットも割込みを発生します。 これにより、例えば低消費電力モードになる前に、I2C ペリフ ェラルを安全にターンオフすることができます。 スレーブからのデータ要求にマスターが応答する例を図 10 に示 します。 送信 FIFO のフルが維持されない場合、送信割込みは各クロッ ク・エッジで発生します。最後のバイトの最終ビットが送信さ れた後に、TXUR ビットがセットされます。TXUR がセットさ I2C MASTER INITIALIZATION I2C MASTER INTERRUPT HANDLER //ENABLE I2C on GPIO DioCfg(pADI_GPx,0xXXXX); DioPul(pADI_GPx,0xXX); //COPY MASTER STATUS REGISTER uiStatus = I2cSta(MASTER); //SET UP I2C MASTER MODE, 100kHz I2cMCfg(0,I2CMCON_IENTX,I2CMCON_MAS); I2cBaud(0xXX,0xXX); //CHECK FOR TX INTERRUPT if((uiStatus & I2CMSTA_TXREQ) == I2CMSTA_TXREQ) //ENABLE MASTER I2C INTERRUPT NVIC_EnableIRQ(I2CM_IRQn); MORE DATA TO TRANSMIT? Y //PLACE DATA IN TX FIFO I2cTx(MASTER,0xXX); N //PLACE FIRST TWO BYTES IN TX FIFO I2cTx(MASTER,0xXX); //DISABLE TX INTERRUPT I2cMCfg(0,I2CMCON_IENTX_DIS,I2CMCON_MAS); //RETURN FROM HANDLER 図 10.マスター送信のフローチャート Rev. A - 9/16 - 10882-010 //SET UP DEVICE ADDRESS I2cMWrCfg(0xA0); AN-1159 アプリケーション・ノート スレーブ受信 I2C スレーブがデータを受信するとき、各バイトの 8 番目のク ロックが受信された後で割込みが発生します。3 番目のバイト が受信される前に FIFO が読出されていない場合、RXOF、 I2CSSTA[4]がセットされて、受信 FIFO のオーバーフローを表 示します。このとき、FIFO を読出すことができます。9 番目の クロックの立上がりエッジの前に FIFO が読出されない場合、 スレーブ・インターフェースは自動的に NACK を出力します。 す。割込みがイネーブルされていて RXREQ がセットされると、 I2C 割込みが連続して発生します。 マスターは最後のデータを送信した後、自動的にストップ条件 を送信します。スレーブはストップ条件を検出し I2CSSTA[10] をセットします。IENSTOP、I2CSCON[8]がセットされている場 合、このビットは割込みを発生することができます。 スレーブがマスターからバイトを受信するフローチャートを図 11 に示します。図 12 に、ステータス・ビットがセットされる タイミングと割込みが発生するタイミングを示します。 FIFO からデータを読出すときは、I2CRX レジスタを使います。 RXREQ、I2CSSTA[3]は、スレーブがデータを受信したことを表 示します。I2CSRX を読出すだけでこのビットはクリアされま I2C SLAVE INITIALIZATION I2C SLAVE INTERRUPT HANDLER //COPY SLAVE STATUS REGISTER uiStatus = I2cSta(SLAVE); //SET UP I2C SLAVE MODE I2cSCfg(0,I2CSCON_IENRX,I2CSCON_SLV); I2cSIDCfg(0xA0,0,0,0); //CHECK FOR RX INTERRUPT if((uiStatus&I2CSSTA_RXREQ)==I2CSSTA_RXREQ) //ENABLE SLAVE I2C INTERRUPT NVIC_EnableIRQ(I2CS_IRQn); //READ DATA FROM FIFO ucDat[i] = I2cRx(SLAVE); //WAIT FOR MASTER //RETURN FROM HANDLER 10882-011 //ENABLE I2C on GPIO DioCfg(pADI_GPx,0xXXXX); DioPul(pADI_GPx,0xXX); DEVICE ADDRESS WORD ADDRESS (n) DATA (n) DATA (n + 1) STOP WRITE START 図 11.スレーブ受信のフローチャート DATA (n + x) RECEIVE INTERRUPT 図 12.スレーブ受信の例 Rev. A - 10/16 - RECEIVE INTERRUPT ACK ACK ACK LSB RECEIVE INTERRUPT STOP BIT SET RECEIVE INTERRUPT 10882-012 START BIT SET ACK MSB R/W ACK LSB MSB SDA LINE AN-1159 アプリケーション・ノート マスター受信 マスター・モードでは、スレーブからのデータ読出しに同様の 方法を使います。まず、I2CMRXCNT レジスタを使って読出す バイト数を設定します。これは、スレーブから読出すバイト数 + 1 を示します。これは 8 ビット・レジスタであるため、一度に 256 バ イ ト を 受 信 す る こ と が で き ま す 。 大 き な 転 送 に は EXTEND オ プ シ ョ ン を 使 用 す る こ と が で き ま す 。 I2CMCRXCNT には、マスターが受信した現在のバイト数が表 示されます。 データの受信を開始するためには、 I2CADR0 レジスタの読出 し(R)ビットをセットします。これにより、I2CADR0 レジス タで設定したアドレスと R/W ビットの条件の下で発生したスタ ート条件から転送が開始されます。各バイトが受信された後 (9 番目のクロックすなわち ACK または NACK の後)、割込み が発生します。RXREQ、I2CMSTA[3]がセットされて、1 バイ I2C MASTER INITIALIZATION トが受信されたことを示します。I2CMRX を読出すだけでこの ビットはクリアされます。 マスターがこれ以上データを受信する必要がない場合、受信し た最後のバイトに対して NACK を自動的に発生します。これに より、スレーブにバイト送信の停止を通知して、マスターがス トップ条件を発生できるようにします。 受信されたデータが時間内に読出されず、FIFO がフルになると、 マスターは受信された余分なデータに対して NACK を送信しま す。 マスターがスレーブからバイトを受信するフローチャートを図 13 に示します。 I2C MASTER INTERRUPT HANDLER //COPY MASTER STATUS REGISTER uiStatus = I2cSta(MASTER); //SET UP I2C MASTER MODE, 100kHz I2cMCfg(0,I2CMCON_IENRX,I2CMCON_MAS); I2cBaud(0x4E,0x4F); //CHECK FOR RX INTERRUPT if((uiStatus & I2CMSTA_RXREQ) ==I2CMSTA_RXREQ) //ENABLE MASTER I2C INTERRUPT NVIC_EnableIRQ(I2CM_IRQn); //READ DATA FROM FIFO dat[i] = I2cRx(MASTER); //SET UP SLAVE ADDRESS and NUMBER OF BYTES TO BE RECEIVED I2cMRdCfg(0xA0,nbByte,DISABLE); //RETURN FROM HANDLER 10882-013 //ENABLE I2C on GPIOs DioCfg(pADI_GPx,0xXXXX); DioPul(pADI_GPx,0xXX); //WAIT FOR FIRST BYTE TO BE RECEIVED 図 13.マスター受信のフローチャート Rev. A - 11/16 - AN-1159 アプリケーション・ノート スレーブ送信 スレーブはデータ送信が要求されるたびに割込みを発生します。 最初はアドレスの ACK 後に発生、すなわち FIFO のバイト 0 の 送信中に発生します。データはスレーブ送信 FIFO に予めロー ドされている必要があります。そうしないと、マスターからの 最初の読出し要求で NACK が発生します。FIFO に予め 2 セッ トのデータがロードされている場合、アドレスの ACK の後に 1 つの割込みが発生し、その後送信された各バイトの ACK の後 に発生します。FIFO に予めロードされているのが 1 セットのデ ータのみである場合、アドレスの ACK の後に 2 つの割込みが 発生し、FIFO は最初のデータを送信した後にエンプティになり ます。 送信 FIFO に空きがある場合、またはバイトがマスターへ送信 されるごとに、TXREQ、I2CSSTA[2]がセットされます。送信す るデータがなくなった場合、送信割込みをディスエーブルする ことが可能で、ストップ条件を検出したとき (I2CSSTA[10]) 再度イネーブルすることができます。IENSTOP、I2CSCON[8]が セットされていると、STOP 検出は割込みを発生することがで きます。 スレーブがマスターからのバイト要求に応答するフローチャー トの例を図 14 に示します。図 15 に、ステータス・ビットがセ ットされるタイミングと割込みが発生するタイミングを示しま す。 バイトが送信された後、マスターがデータの要求を続ける限り 割込みが発生します。 I2C SLAVE INTERRUPT HANDLER I2C SLAVE INITIALIZATION //ENABLE I2C on GPIOs DioCfg(pADI_GPx,0xXXX); DioPul(pADI_GPx,0xXX); //COPY SLAVE STATUS REGISTER uiStatus = I2cSta(SLAVE); //SET UP I2C MASTER MODE I2cSCfg(0,I2CSCON_IENTX| I2CSCON_STOP,I2CSCON_SLV); I2cSIDCfg(0xA0,0,0,0); //CHECK FOR STOP INTERRUPT if((uiStatus & I2CSSTA_STOP) ==I2CSSTA_STOP) //ENABLE SLAVE I2C INTERRUPT NVIC_EnableIRQ(I2CS_IRQn); //ENABLE TX INTERRUPT I2cSCfg(0,I2CSCON_IENTX, I2CSCON_SLV); //CHECK FOR TX INTERRUPT if((uiStatus & I2CSSTA_TXREQ ==I2CSSTA_TXREQ) MORE DATA? //PLACE DATA IN TX FIFO I2cTx(SLAVE,0xXX); Y N //PLACE 1 OR 2 BYTES IN TX FIFO I2cTx(SLAVE,0xXX); //WAIT FOR MASTER //RETURN FROM HANDLER //DISABLE TX INTERRUPT I2cSCfg(0,I2CSCON_IENTX_DIS, I2CSCON_SLV); 10882-014 //PLACE 1 OR 2 BYTES IN TX FIFO I2cTx(SLAVE,0xXX); STOP ACK ACK ACK DEVICE ADDRESS READ 図 14.スレーブ送信のフローチャート DATA (n + 2) DATA (n + 1) TRANSMIT INTERRUPT TRANSMIT INTERRUPT START BIT SET TRANSMIT INTERRUPT STOP BIT SET 図 15.スレーブ送信の例 Rev. A DATA (n + x) - 12/16 - 10882-015 TRANSMIT INTERRUPT(S) DATA (n) NO ACK R/W ACK SDA LINE AN-1159 アプリケーション・ノート DMA モード、マスター送信 I2C 転送は、マスターからのスレーブ・アドレスの送信で開始さ れます。I2CMCON MMR の TXDMA をセットして、DMA 送信 モードが設定されると、I2C ペリフェラルがすべて設定されたと き、すなわちボー・レート、スレーブ・アドレス、DMA 送信要 求が設定され、さらに DMA コントローラが設定されてイネー ブルされたとき、転送が開始されます。転送の開始前に、I2C マ スター送信 DMA チャンネルも NVIC でイネーブルする必要が あります。 から 3 番目のバイトの送信中を意味します(図 17 参照)。ここ で、DMA コントローラの中で、DMA チャンネルが自動的にデ ィスエーブルされますが、FIFO がフルでない場合、I2C ペリフ ェラルは DMA 要求を DMA コントローラに送信して割込みを 発生させます。このため、DMA コントローラで I2C 要求をマス クして重複割込みを避ける必要があります(DMARMSKSET)。 メモリから FIFO へすべてのバイトが転送されたとき DMA 転送 は完了します。これは、最後の 2 バイトが FIFO に残り、終わり I2C マスター送信 DMA 転送のフローチャートを図 16 に示しま す。 新しい転送を開始するときは、DMA コントローラを再設定/再 イネーブルする必要があります。 I2C MASTER TRANSMIT DMA INTERRUPT HANDLER I2C MASTER INITIALIZATION //ENABLE I2C on GPIO DioPul(pADI_GPx,0xXX); DioCfg(pADI_GPx,0xXXXX); //MASK I2C MASTER DMA TRANSMIT REQUEST pADI_DMA->DMARMSKSET| = DMARMSKSET_I2CMTX; //SET UP DMA DESCRIPTORS 6 pADI_DMA->DMAPDBPTR = (unsignedint)&dmaChanDesc; //REFRESH DMA DESCRIPTOR 6 I2CMTxDmaDesc->ctrlCfg.n_minus_1 = DMA_TX_COUNT-1; I2CMTxDmaDesc->ctrlCfg.cycle_ctrl = 1; //SET UP I2C MASTER IN TRANSMIT MODE FOR DMA TRANSFER I2cMCfg(I2CMCON_TXDMA,0, I2CMCON_MAS);I2cBaud(0x4E,0x4F); I2cMWrCfg(0xA0); //ENABLE DMA CHANNEL FOR NEXT TRANSFER pADI_DMA->DMAENSET| = DMAENSET_I2CMTX; //RETURN FROM HANDLER //ENABLE MASTER I2C DMA INTERRUPT NVIC_EnableIRQ(DMA_I2CM_TX_IRQn); //CONFIGURE DMA CONTROLLER pADI_DMA->DMAENSET = DMAENSET_I2CMTX; pADI_DMA->DMACFG = DMACFG_ENABLE_EN; //WAIT FOR COMPLETION OF TRANSFER 10882-016 //INITIATE NEW TRANSFER pADI_DMA->DMARMSKCLR| = DMARMSKCLR_I2CMTX; I2cMWrCfg(0xA0); STOP ACK ACK ACK 図 16.マスター送信 DMA 転送のフローチャート DATA (n – 2) DATA (n – 1) I2C MASTER TRANSMIT DMA INTERRUPT 図 17.マスター送信 DMA 割込み Rev. A - 13/16 - DATA (n) 10882-017 DATA (n – 3) NO ACK ACK SDA LINE AN-1159 アプリケーション・ノート DMA モード、マスター受信 I2CMCON MMR の RXDMA をセットすると、I2C ペリフェラル で DMA 転送がイネーブルされます。DMA コントローラが設定 されイネーブルされ、かつ I2C ペリフェラルがフルに設定され たとき、すなわちボー・レート、スレーブ・アドレス、DMA 送 信要求が設定されたとき、転送が開始されます。転送の開始前 に、I2C マスター送信 DMA チャンネルも NVIC でイネーブルす る必要があります。 DMA 転送が完了すると、 DMA コントローラで対応するチャン ネルが自動的にディスエーブルされます。新しい転送を開始す るには、DMA コントローラを再設定/再イネーブルする必要が あります。I2CADR0 MMR にスレーブ・アドレスを再度書込む と、新しい転送が開始されます。 マスターがスレーブからデータを受信する DMA 転送のフロー チャートを図 18 に示します。 DMA コントローラで予定したすべてのバイトが受信されたとき、 DMA 転送が完了します。I2C マスター I2CMRXCNT MMR も同 じバイト数に設定される必要があります。 I2C MASTER INITIALIZATION I2C MASTER RECEIVE DMA INTERRUPT HANDLER //ENABLE I2C on GPIO DioCfg(pADI_GPx,0xXXXX); DioPul(pADI_GPx,0xXX); //REFRESH DMA DESCRIPTOR 7 I2CMRxDmaDesc->ctrlCfg.n_minus_1 = DMA_RX_COUNT-1; I2CMRxDmaDesc->ctrlCfg.cycle_ctrl = 1; //SET UP DMA DESCRIPTORS 7 pADI_DMA->DMAPDBPTR = (unsignedint)&dmaChanDesc; //ENABLE DMA CHANNEL FOR NEXT TRANSFER pADI_DMA->DMAENSET| = DMAENSET_I2CMRX; //SET UP I2C MASTER IN RECEIVE MODE FOR DMA TRANSFER I2cMCfg(I2CMCON_RXDMA,0, I2CMCON_MAS);I2cBaud(0x4E,0x4F); I2cMRdCfg(0xA0,DMA_RX_COUNT,0); //RETURN FROM HANDLER //ENABLE MASTER I2C DMA INTERRUPT NVIC_EnableIRQ(DMA_I2CM_RX_IRQn); //CONFIGURE DMA CONTROLLER pADI_DMA->DMAENSET = DMAENSET_I2CMRX; pADI_DMA->DMACFG = DMACFG_ENABLE_EN; 10882-018 //WAIT FOR COMPLETION OF TRANSFER //INITIATE NEW TRANSFER I2cMRdCfg(0xA0,DMA_RX_COUNT,0); 図 18.マスター受信 DMA 転送のフローチャート Rev. A - 14/16 - AN-1159 アプリケーション・ノート DMA モード、スレーブ送受信 I2CMCON MMR の TXDMA および/または RXDMA をセットす ると、I2C ペリフェラルで DMA 転送が可能になります。I2C ペ リフェラルをスレーブ・モードに設定し、I2C 割込みをディスエ ーブルします。NVIC と DMA コントローラを設定します。正し い I2C アドレスを受信すると、DMA 転送が開始され、データ・ バイトのみがメモリへ転送されます。DMA 転送が完了すると、 DMA コントローラで対応するチャンネルが自動的にディスエー I2C SLAVE INITIALIZATION ブルされます。新しい転送を開始するときは、DMA コントロー ラのみを再設定する必要があります。図 19 に、スレーブが送信 および受信する DMA 転送のフローチャートを示します。 送信モードでの DMA 転送は、最終バイトから 3 番目の送信中 に終了することに注意してください。これはマスター送信の場 合と同様です。 I2C SLAVE DMA INTERRUPT HANDLER(S)— EXAMPLE OF RX DMA //ENABLE I2C on GPIO DioCfg(pADI_GPx,0xXXXX); DioPul(pADI_GPx,0xXX); //REFRESH DMA DESCRIPTOR 5 I2CSRxDmaDesc->ctrlCfg.n_minus_1 = DMA_RX_COUNT-1; I2CSRxDm aDesc->ctrlCfg.cycle_ctrl = 1; //SET UP DMA DESCRIPTORS 4 AND 5 pADI_DMA->DMAPDBPTR = (unsignedint)&dmaChanDesc; //ENABLE DMA CHANNEL FOR NEXT TRANSFER pADI_DMA->DMAENSET| = DMAENSET_I2CSRX; //SET UP I2C SLAVE MODE FOR DMA TRANSFER I2cSCfg(I2CSCON_RXDMA|I2CSCON_TXDMA,0,I2CSCON_SLV); I2cSIDCfg(0xA0,0,0,0); //RETURN FROM HANDLER //ENABLE SLAVE I2C DMA INTERRUPT NVIC_enableIRQ(DMA_I2CS_Tx_IRQn); NVIC_enableIRQ(DMA_I2CS_Rx_IRQn) 10882-019 //CONFIGURE DMA CONTROLLER pADI_DMA->DMAENSET = DMAENSET_I2CSRX|DMAENSET_I2CSTX; pADI_DMA->DMACFG = DMACFG_ENABLE_EN; //WAIT FOR MASTER 図 19.スレーブ DMA 転送のフローチャート Rev. A - 15/16 - AN-1159 アプリケーション・ノート コンパニオン・コード コンパニオン・コードのリストと説明を表 5 に示します。 表 5.コンパニオン・コード Mode/Flowchart Code Example/Tools Master Transmit Slave Receive Master Receive Slave Transmit DMA Mode, Master Transmit DMA Mode, Master Receive DMA Mode, Slave Receive and Transmit I2Cmaster.c I2Cslave.c I2Cmaster.c I2Cslave.c I2CmasterDMA.c I2CmasterDMA.c I2CslaveDMA.c I2C は、Philips Semiconductors 社(現在の NXP Semiconductors 社)が制定した通信プロトコルです。 ©2015 Analog Devices, Inc. All rights reserved. Rev. A 商標および登録商標は、それぞれの所有者の財産です。 - 16/16 -