AN-1159: Cortex-M3 ベースの高精度アナログ・マイクロコントローラ (ADuCxxx ファミリー) の I²C 互換インターフェース (Rev. A) PDF

日本語参考資料
最新版英語アプリケーションはこちら
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 -