AN-1367: ADE7953 と ADuCM360 の間の I2C インターフェース (Rev. 0) PDF

日本語参考資料
最新版英語アプリケーション・ノートはこちら
AN-1367
アプリケーション・ノート
ADE7953 と ADuCM360 の間の I2C インターフェース
Fermi Lim、Daniel Kim、Hariharan Mani 共著
はじめに
このアプリケーション・ノートでは、C プログラミング言語を
使用して、ADE7953(スレーブ)と ADuCM360(マスター)
の間に I2C インターフェースを実装する方法について説明しま
す。ADE7953 は、単相電力量計 IC で、ADuCM360 は ARM®
Cortex®-M3 ベースのマイクロコントローラです。ADE7953 に
は、8、16、24、または 32 ビット長のレジスタがあります。ソー
ス・コードを記述する際には、レジスタのアドレスに基づいて
読出し/書込み操作のデータ・サイズを特定することが重要で
す。ADE7953 のデータシートに含まれているレジスタ・リス
トには、すべての関連情報が含まれています。
このアプリケーション・ノートでは、ARM Cortex-M3 コアと
ADuCM360 マイクロコントローラ・ユニット(MCU)の概要、
ADuCM360 で実行する必要がある初期化手順、ADE7953 と
ADuCM360 の間への I2C インターフェースの実装方法について
説明します。このアプリケーション・ノートで説明しているサ
ンプル・コードは、アナログ・デバイセズの ARM Cortex-M コ
アベースの他のプロセッサでも使用できます。
I2C インターフェースを実現するためのソース・コード全体は、
www.analog.com/jp/ADE7953 または www.analog.com/jp/ADuCM360
にダウンロード可能なファイル(AN_1367_I2C_interface.zip)
I2C
として用意されています。
このアプリケーション・ノートでは、
Visual C++ 2012 統合開発環境(IDE)でソース・コードを実装
する方法と、ADE7953 および ADuCM360 の I2C 通信ポートに
関する有用な情報について説明します。
ソース・コードの検証には、次の機器とソフトウェアを使用し
ました。
•
•
•
•
•
ADE7953 および ADuCM360 評価用モジュール・ボード
(EVM)
ソフトウェア開発環境:Keil MDK-ARM バージョン 4.72
ターミナル・エミュレータ:Tera Term バージョン 4.79
IDE:Visual C++ 2012
ラップトップ・パーソナル・コンピュータ(PC)
ラボ全体のセットアップを図 1 に示します。ワイヤを使用して
2 つの評価用ボードを接続しました(図 2 を参照)。このセッ
トアップでは絶縁インターフェースは考慮しなかったため、両
方のボードを共通の電源電圧で給電し、共通グラウンドを共有
するようにしました。
I2C インターフェースを絶縁する場合は、
アイソレータの伝搬遅延を考慮する必要があります。
EVAL-ADuCM360
EVAL-ADE7953
USB TO UART
(Cortex-M3)
13338-001
1, 2, 3, OR 4 BYTES
INTERNAL REGISTER ACCESS
図 1. ラボのセットアップ
アナログ・デバイセズ社は、提供する情報が正確で信頼できるものであることを期していますが、その情報の利用に関して、あるいは利用に
よって生じる第三者の特許やその他の権利の侵害に関して一切の責任を負いません。また、アナログ・デバイセズ社の特許または特許の権利
の使用を明示的または暗示的に許諾するものでもありません。仕様は、予告なく変更される場合があります。本紙記載の商標および登録商標
は、それぞれの所有者の財産です。※日本語版資料は REVISION が古い場合があります。最新の内容については、英語版をご参照ください。
Rev. 0
©2016 Analog Devices, Inc. All rights reserved.
本
社/〒105-6891 東京都港区海岸 1-16-1 ニューピア竹芝サウスタワービル
電話 03(5402)8200
大阪営業所/〒532-0003 大阪府大阪市淀川区宮原 3-5-36 新大阪トラストタワー
電話 06(6350)6868
Rev. 0 | 1/15
AN-1367
アプリケーション・ノート
目次
はじめに ..........................................................................................1
UART および I2C 用に ADuCM360 を初期化する ...................... 8
改訂履歴 ..........................................................................................2
I2C インターフェース:ADuCM360 と ADE7953 ....................... 10
セットアップの説明 ......................................................................3
Visual C++ を使用した Embedded C のシミュレート ........... 12
ARM Cortex-M3 コアと ADuCM360 MCU ...................................5
結論 ................................................................................................ 15
改訂履歴
9/15—Revision 0:初版
Rev. 0 | 2/15
AN-1367
アプリケーション・ノート
セットアップの説明
ターミナル・エミュレータ・ソフトウェア Tera Term バージョ
ン 4.79 を使用して、ADuCM360 を通じて ADE7953 のレジスタ
の読出し/書込みを行います。
ADuCM360 と PC の間でユニバー
サル非同期レシーバ/トランスミッタ(UART)通信インター
フェースを使用して、読出し/書込みコマンドおよびデータの
送受信を行います。Tera Term バージョン 4.79 ソフトウェア
(UART インターフェースベースの通信用の完全なソース・コー
ドのサンプルを含む)は、OSDN Corporation などのさまざまな
会社のサイトから無償で入手できます。
図 3 に、ターミナル・ウィンドウを示します。ここで、サンプ
ル・コードの get および set コマンドを使用して ADE7953 のレ
ジスタにアクセスします。2 つのコマンドの構文は、次のとお
りです。
•
•
Set REG_ADDR 値
set コマンドは、アドレス REG_ADDR にあるレジスタに
特定の値を書き込みます。
Get START_REG_ADDR REGISTER_NUMBER
get コマンドは、アドレス START_REG_ADDR のレジスタか
ら、連続的にレジスタの内容を読み出します。読出しを行
うレジストリ・ロケーションの数は、REGISTER_NUMBER
で指定します。
ソース・コードの独自の機能としては、各レジスタのデータ・
サイズがわからない場合でも PC が ADE7953 と通信できる点
で、これはレジスタ・ルックアップ・テーブルがすでに実装さ
れているためです。
CONNECTOR OF ADuCM360 EVM
DIGITAL PORT PINS
SDA
SCL
RESET
CONNECTOR OF ADE7953 EVM
GND
図 2. ADuCM360 EVM と ADE7953 EVM 間の接続
Rev. 0 | 3/15
13338-002
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
VDD
P7
VDDOUT
5VUSB
J1-24
J1-23
J1-22
J1-21
J1-20
J1-19
J1-18
J1-17
J1-16
J1-15
J1-14
J1-13
J1-12
J1-11
J1-10
J1-9
J1-8
J1-7
J1-6
J1-5
J1-4
J1-3
J1-2
J1-1
ZX_ISO
MOSI_ISO
RESET_ISO
CS_ISO
SCLK_ISO
TX_ISO
SDA_ISO
MCU_VDD
SCLK_ISO
IRQ_ISO
RX_ISO
ZX_I_ISO
MISO_ISO
REVP_ISO
NC15
NC16
NC17
RESET
P2.2/BM
P2.1
P2.0
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1/IRQ4
P1.0
P0.7/SOUT
P0.6/SIN
P0.5
P0.4
P0.3/SS1
P0.2/MOSI
P0.1/SCLK1
P0.0/MISO1
DVDD
AN-1367
アプリケーション・ノート
ADDRESSES OF ADE7953
13338-003
REGISTER VALUES OF ADE7953
13338-104
図 3. Get コマンド使用時のターミナル・ウィンドウ
図 4. Get および Set コマンド使用時のターミナル・ウィンドウ
Rev. 0 | 4/15
AN-1367
アプリケーション・ノート
ARM CORTEX-M3 コアと ADUCM360 MCU
ARM Cortex-M3 コアは ARMv7-M アーキテクチャをベースに
しています。Cortex-M ファミリは、300 MHz 未満のコア・ク
ロック周波数を必要とする組込みアプリケーションで主に使用
されます。AC モーター・コントロールや単純な家庭用機器な
どのほとんどの組込みアプリケーションでは、メモリ・マネー
ジメント・ユニット(MMU)や NEON™ などの高度な機能は
不要なため Cortex-M ファミリが適しています。Cortex-M コア
のアーキテクチャは、他の Cortex ファミリよりも単純です。
Cortex-M ファミリのコアは、次の独自の機能を備えています。
•
固定メモリ・マップ
共通の Nested Vectored Interrupt Controller(NVIC: ネスト型
ベクタ割り込みコントローラ)
Thumb®-2 命令セットのサポートのみ
Cortex-M ファミリ MCU 用に記述したコードは、簡単に変更し
て他の Cortex-M ファミリ MCU で使用できます。他のベンダー
製であっても使用できます。また、ARM は、さまざまなアプ
リ ケ ー シ ョ ン で 使 用 可 能 な 有 用 な Cortex Microcontroller
Software Interface Standard(CMSIS)ソフトウェアも無償で提
供しています。
図 5 に、Cortex-M ファミリ・コアの固定メモリ・マップと
ADuCM360 のメモリ・マップの比較を示します。
図 5 に示しているように、Cortex-M ファミリの固定メモリ・
マップに基づいて、ADuCM360 には 8 kB SRAM と 128 kB
Flash/EE メモリがあります。ADuCM360 のすべてのペリフェ
ラルは、0x40000000 ~ 0x4004FFFF のアドレス範囲にマップさ
れ ま す 。0xE000E000 ~ 0xE000EE000 の ア ド レ ス 範 囲 は
Cortex-M コアのメモリ・マップド・レジスタ(MMR)用で、
0x40000000 ~ 0x4004FFFF のアドレス範囲は ADuCM360 の
MMR 用です。
511MB
VENDOR SPECIFIC
MEMORY
0xE000EF00
0xE000E100
1MB PRIVATE
PERIPHERAL BUS
NVIC
1GB
•
•
以前の ARM コアには高速割込みと標準割込みがありまし
たが、Cortex-M ファミリのコアには 1 つのコア割り込み
しかありません。
Interrupt Set Enable Register(ISER: 割込みセット・イネー
ブル・レジスタ)と Interrupt Clear Enable Register(ICER: 割
込みクリア・イネーブル・レジスタ)の 2 セットのレジ
スタを使用できます。
通常、UART および I2C などのペリフェラルは、割込みをイネー
ブル/ディスエーブルにするための独自のレジスタを持ってい
ます。各ペリフェラルによって転送された割込みのうち 1 つの
みが ISER/ICER 値に従ってコアに到達できます。ISER は 0x
E000E100 ~ 0xE000E13C のアドレス範囲、ICER は 0xE000E18
0 ~ 0xE000E1BC のアドレス範囲にあります。Cortex-M ファミ
リ MCU を使用する場合は、必要に応じて ISER と ICER を変
更します。使用可能なすべての IDE ツールで最も一般的なも
のは、Keil MDK-ARM と IAR Embedded Workbench® です。こ
れらのツールはどちらも、実行可能イメージが指定されたサイ
ズ制限内の場合に使用できます。このアプリケーション・ノー
トのラボのセットアップでは、Keil MDK-ARM IDE を使用しま
した。IAR Embedded Workbench IDE でコードを使用するには、
ダウンロード可能なファイル AN_1367_I2C_interface.zip に含ま
れている ADuCM360StartUp.s を変更する必要があります。ID
E を Keil MDK-ARM から IAR Embedded Workbench に変更する
場合(またはその逆の場合)、命令ではなくアセンブラ・ディ
レクティブを変更する必要があります。これは、アセンブラ・
ディレクティブは使用するアセンブラに依存し、命令セットは
MCU コアに依存するためです。
0xFFFFFFFF
0xE0100000
0xE00FFFFF
ADuCM360
MEMORY MAP
MMRs
0xE0000000
0xDFFFFFFF
0xE000EE00
0xE000E000
EXTERNAL
DEVICE
0xA0000000
0x9FFFFFFF
1GB
EXTERNAL
RAM
0x34FFFFFF
0x42000000
BIT BAND ALIAS
32MB
0x400FFFFF
0x40000000
BIT BAND REGION
0x60000000
0x6FFFFFFF
0.5GB
0x40000000
0x3FFFFFFF
1MB
0x23FFFFFF
0x22000000
0.5GB
BIT BAND ALIAS
0x20000000
BIT BAND REGION
1MB
8kB SRAM
SRAM
32MB
0x200FFFFF
MMRs
PERIPHERALS
0x20000000
0x1FFFFFFF
0.5GB
CODE
0x00000000
KERNEL SPACE
128kB FLASH/
EE MEMORY
0x4004FFFF
0x40000000
0x20001FFF
0x20000000
0x000207FF
0x00020000
0x0001FFFF
0x0000E000
図 5. Cortex-M と ADuCM360 のメモリ・マップの比較
Rev. 0 | 5/15
13338-005
•
•
NVIC に関する次のことに注意してください。
AN-1367
アプリケーション・ノート
図 6 と図 7 に、Keil MDK-ARM と IAR Embedded Workbench IDE
のツール・チェーンをそれぞれ示します。
図 6 で、
armcc、
armasm、
armlink は灰色で示されていて、それらが C/C++ コンパイラ、
アセンブラ、リンカを形成することを示しています。同様に、
図 7 で、iccarm、iasmarm、ilinkarm は灰色で示されていて、そ
れらがコンパイラ、アセンブラ、リンカであることを示してい
ます。
図 8 に、ADuCM360 のアーキテクチャを示します。ADuCM360
のペリフェラルの中で、ADE7953 と PC との通信に使用される
のは I2C、UART、GPIO のみです。
まず、PC と通信するように UART を設定し、ADE7953 とイン
ターフェースするように I2C を設定します。
このアプリケーション・ノートは I2C インターフェースに関す
る もので すが 、ダウ ンロ ード可 能な ファイ ル
AN_1367_I2C_interface.zip に含まれているサンプル・コードに
は UART インターフェースと GPIO 用のモジュールがあります。
LINEAR
ASSEMBLY
(*.s/*.asm)
C SOURCE FILES
(*.c)
LINKER SCRIPT
(*.sct)
C COMPILER
(armcc)
ASSEMBLER
(armasm)
LIBRARY BUILD
UTILITY
OBJECT FILES
(*.o)
OBJECT FILES
(*.o)
RUN-TIME SUPPORT
LIBRARY
(*.lib)
--scatter
CROSSREFERENCE
LISTER
(*.lst)
--list
IMAGE MAP FILE
(*.map)
--map
LINKER
(armlink)
EXECUTABLE IMAGE FILE
(*.axf/*.elf)
TARGET
BOARD
HEX CONVERSION UTILITY
(fromelf)
HEX FILES
(*.hex)
13338-006
DISASSEMBLED FILE --asm
(*.s)
図 6. Keil MDK-ARM のツール・チェーン
C SOURCE FILES
(*.c)
LINKER SCRIPT
(*.icf)
CROSSREFERENCE
LISTER
(*.lst)
C COMPILER
(iccarm)
ASSEMBLER
(iasmarm)
LIBRARY BUILD
UTILITY
OBJECT FILES
(*.o)
OBJECT FILES
(*.o)
RUN-TIME SUPPORT
LIBRARY
(*.a)
LINKER
(ilinkarm)
EXECUTABLE IMAGE FILE
(*.out)
TARGET
BOARD
HEX CONVERSION UTILITY
(ielftool)
HEX FILES
(*.hex)
IMAGE MAP FILE
(*.map)
図 7. IAR Embedded Workbench のツール・チェーン
Rev. 0 | 6/15
13338-107
DISASSEMBLED FILE
(*.s)
LINEAR
ASSEMBLY
(*.s/*.asm)
AN-1367
アプリケーション・ノート
DAC
AVDD
AGND
ON-CHIP
1.8V ANALOG
LDO
12-BIT
DAC
BUFFER
AMP
BUF
MOD2
GAIN
VREF
24-BIT
Σ-Δ ADC
Σ-Δ
MODULATOR
SINC3/
SINC4
FILTER
AIN6/IEXC
AIN8/EXTREF2IN–
AIN9/DACBUFF+
AIN10
AIN11/VBIAS1
POWER-ON
RESET
RESET
ON-CHIP
OSCILLATOR
(1% TYP)
16MHz
XTALO
VBIAS
GENERATOR
AIN0
AIN1
AIN2
AIN3
AIN4/IEXC
AIN5/IEXC
AIN7/VBIAS0/IEXC/
EXTREF2IN+
ON-CHIP
1.8V DIGITAL
LDO
SINC2
FILTER
MUX
VREF
AMP
BUF
MOD2
GAIN
Σ-Δ
MODULATOR
24-BIT
Σ-Δ ADC
SINC3/
SINC4
FILTER
16MHz
GPIO PORTS
UART PORTS
2 × SPI PORTS
I2C PORTS
MEMORY
128kB FLASH
8kB SRAM
TIMER0
TIMER1
WATCHDOG
WAKE-UP TIMER
PWM
DMA AND
INTERRUPT
CONTROLLER
SERIAL WIRE
DEBUG,
PROGRAMMING
AND DEBUG
SELECTABLE
VREF
SOURCES
DAC, TEMP,
IOVDD/4,
AVDD/4
XTALI
ARM
CORTEX-M3
PROCESSOR
19 GENERALPURPOSE
I/O PORTS
SWDIO
SWCLK
PRECISION
REFERENCE
ADuCM360
DVDD_REG
BUFFER
CURRENT
SOURCES
AVDD_REG
BUFFER
GND_SW
VREF– VREF+
INT_REF
図 8. ADuCM360 のブロック図
Rev. 0 | 7/15
IOVDD
IOVDD
13338-007
IREF
AN-1367
アプリケーション・ノート
UART および I2C 用に ADUCM360 を初期化する
るすべてのペリフェラルに該当します。ペリフェラルのクロッ
クのほうが遅い場合、ペリフェラルに対するクロックがゲー
ティングされ、ペリフェラルが機能しません。詳細について
は、ADuCM360/ ADuCM361 Hardware User Guide を参照して
ください。
Embedded C コードを開発するときには、まずウォッチドッグ・
タイマをディスエーブルにし、
必要に応じてコアおよびペリフェ
ラルのクロックを設定します。
リセット操作後に、ウォッチドッグ・タイマが自動的にイネー
ブルになります。ADuCM360 のウォッチドッグ・タイマをディ
スエーブルにするには、ウォッチドッグ・タイマ・イネーブル・
ビットである T3CON[5] に 0’b0 を書き込みます。
図 9 に示しているように、PC との UART のインターフェースは
115,200 bps のボーレートで設定されています。このため、Tera T
erm ツールも同じように設定します。「MyTera_Setup2014.INI」
という名前の Tera Term のプロジェクト・ファイルを参照してく
ださい。このファイルは、ダウンロード可能なファイル AN_136
7_I2C_interface.zip に含まれています。
// Step 1.Disable the watchdog timer.
*pT3CON=0x0;
次に、UART、I2C、Cortex-M3 コアのクロックを設定します。
図 9 と図 10 に、UART と I2C のクロックを設定する方法を示
します。コア・クロックを 16 MHz として設定し、UART と I2C
インターフェースのコントロール・レジスタを設定します。
CLKCON1 を介して I2C システム・クロック分周比を選択する
場合は、コア・クロックの周波数が I2C システム・クロックの
周波数以下(つまり、HCLK ≤ I2CCLK)になるようにしてく
ださい。このことは、CLKCON1 によってクロックが分周され
16MHz
115200bps
CLKCON1[11:9]
16MHz
DISUARTCLK = 0
DIV2EN = 0
HOST
PC
CLKDIS[3]
CLKSYSDIV[0]
UCLK
16MHz
UCLK/1 = 000
BAUDRATE =
UCLK/DIV/(2 × 16 × COMDIV)/(M + N/2048)
COMDIV = 2
UARTCLK = 16MHz
UCLK/DIV = UARTCLK
M = 2, N = 348
COMLCR = 0x0003
13338-008
HFOSC
Tera Term プロジェクト・ファイルを使用するには、
[Setup]
から[Restore setup]オプションを選択します(図 11 を参照)。
次に、PC に保存した場所から MyTera_Setup2014.INI プロジェ
クト・ファイルを選択します。
COMFBR = 0x915C
図 9. UART のクロックの設定
16MHz
CLKSYSDIV[0]
UCLK
16MHz
DIV2EN = 0
100kHz
400kHz
SCL
CLKCON1[8:6] = 0
16MHz
DISI2CCLK = 0
UCLK/1 = 000
BAUDRATE =
UCLK/DIV/(2 × 16 × COMDIV)/(M + N/2048)
100kHz → I2CDIV = 0x4E4F
400kHz → I2CDIV = 0x1213
I2CCLK = 16MHz
UCLK/DIV = I2CCLK
図 10. I2C のクロックの設定
13338-010
I2C
SLAVE
CLKDIS[2] = 0
図 11. Tera Term の設定
Rev. 0 | 8/15
13338-009
HFOSC
AN-1367
アプリケーション・ノート
次の C コードの命令は、UART インターフェース の設定方
法を示しています。これは、ダウンロード可能なファイル
AN_1367_I2C_interface.zip に含まれている ADuCM360_I2C_
AppNote.c ファイルから抽出したコードです。コード内のすべ
ての変数は、クロック、GPIO、および UART に関連する MMR
を表します。
マスターである ADuCM360 で使用可能な I2C モードは、次の
とおりです。
•
•
// Step 2.Configure clocks.
// UART speed rate is 115,200 bps:
UCLK/DIV = 16 MHz.
標準モード:100 kHz
まず、CLKSYSDIV[0] = 0、CLKCON1[8:6] = 000 に設定し、
I2CDIV[15:8] = 0x4E、I2CDIV[7:0] = 0x4F に設定します。
高速モード:400 kHz
まず、CLKSYSDIV[0] = 0、CLKCON1[8:6] = 000 に設定し、
I2CDIV[15:8] = 0x12、I2CDIV[7:0] = 0x13 に設定します。
標準モードでの SCL の生成方法を図 12 に示します。
*pCLKDIS=0x03F7;
fI2CCLK = 16MHz
*pCLKSYSDIV=0x00;
NEED_HIGH_TIME/fI2CCLK – 2
*pCLKCON0=0x0000;
1
*pCLKCON1=0x0000;
15
I2CDIV
// Step 3.Set up the behavior of the
chosen UART.
8 7
0
HIGH
(0x4E)
LOW
(0x4F)
5µs
5µs
2
// UART peripheral is
SCL
// P0.2 is UART Tx; P0.1 is UART Rx.
10µs = 100kHz
*pGP0CON=0x003C;
13338-011
*pCOMCON=0x00;
enabling.
NEED_LOW_TIME/fI2CCLK – 1
図 12.標準 100 kHz SCL の生成方法
*pCOMDIV=0x0002;
// COMDIV = 2;
*pCOMFBR=0x915C;
// Set to 115,200 bps
図 10 と図 12 に示しているように、fI2CCLK は 16 MHz で、
CLKSYSDIV[0] = 0 と CLKCON1[8:6] = 0 を初期化した場合、
SCL ビット・レート fSCL は次の式を使用して計算できます。
// WordLength = 8 bits, stop bit = 1 bit,
no parity check.
f SCL =
*pCOMLCR=0x0003;
// COMTX and COMRX are enabled; COMIEN[1]
= COMIEN[0] = 1
*pCOMIEN=0x0003;
UART の割込みイネーブル・レジスタ COMIEN は、UART ペ
リフェラルの割込み専用です(詳細については、
ADuCM360/ADuCM361 Hardware User Guide を参照)。UART ト
ランスミッタ(Tx)/レシーバ(Rx)の割込みを Cortex-M3 コ
アに転送するには、対応する ISER を次のように設定します。
// ISER = 0xE000E100; enabling UART interrupt.
write_reg(0xE000E100,0x00020000);
割込みと例外を区別することは重要です。例外は、同期または
非同期として分類できます。システム故障は、通常、同期例外
ですが、割込みは非同期例外です。UART は、ADuCM360 の
割込みベクタ・テーブルの 17 番目の位置にあります。このた
め、
UART 割込みをイネーブルにするには、
ISER の 0xE000E100
アドレス・ロケーションを 0x00020000 として設定します。同
様に、I2C 割込みをイネーブルにするには、ISER を次のように
設定します。
OldRegVal=read_reg(0xE000E100);
RegVal = OldRegVal | 0x00200000; // for I2C
write_reg(0xE000E100,RegVal);
0xE000E100;
//ISER
=
ADE7953
次に、
ADuCM360 の I2C ペリフェラルを初期化します。
は常にスレーブであるため、ADuCM360 をマスターとして設
定する必要があります。
f I 2CCLK
[ Hz]
(Low + High + 3)
ここで、
Low は、I2CDIV[7:0] によって設定される SCL のロー・レベル
期間。
High は、I2CDIV[15:8] によって設定される SCL のハイ・レベ
ル期間。
標準モードで I2CDIV[7:0] は 0x4F(0d'78)、I2CDIV[15:8] は 0x4E
(0d’79)として設定されます。これらの値を使用して、SCL ク
ロック・レートとして 100 kHz が得られます。
このコードを Visual C++ で使用するために、次の命令を追加し
ました。
#ifdef FermiEmulation_Mode
//to initialize all of the ADuCM360 register set.
ADuCM360_RegsInit();
#endif
このサンプル・コードの詳細については、I2C インターフェー
ス:ADuCM360 と ADE7953 のセクションを参照してください。
このサンプル・モードは、スーパー・ループ・アーキテクチャ
をベースにしています。このため、このコード・スタイルは、
複数のタスクを処理できません。Tera Term ツールでメニュー
を使用することで、あらゆるグラフィック・ユーザー・インター
フェース
(GUI)コンポーネントを Visual C++ または Visual Basic
で簡単に実装することができます。ほとんどのファクトリー・
オートメーション・システムがこの方法を使用しています。
Rev. 0 | 9/15
AN-1367
アプリケーション・ノート
I2C インターフェース:ADUCM360 と ADE7953
I2C インターフェースは、SCL と SDA の 2 つのピンを使用して
実装します(このセクションでは、P2.0/SCL/UARTCLK な
どの多機能ピンは、1 つの機能のみが該当する場合には、その
1 つの機能(例: SCL)で表しています)。
SCL: シリアル・クロック・ピン。マスターのみが I C ク
ロックを生成できます。SCL は、標準モードまたは高速
モードで使用できます。
SDA: シリアル・データ・ピン。
通常、コア・クロックとペリフェラル・クロックは異なります。
あるクロック・ドメインのデータを別のクロック・ドメインに
転送すると、メタスタビリティが発生して通信がエラーになり
ます。メタスタビリティが発生しないようにするには、FIFO ま
たはデュアルポート RAM を使用します。メタスタビリティは、
組み合わせロジックを使用して解決することはできません。
SCL と SDA は両方とも双方向で、プルアップ抵抗を使用して
正電源電圧に接続する必要があります。この場合、SCL は
ADuCM360 によって生成されますが、ADuCM360 の I2C イン
ターフェースはスレーブとして設定できるため、理論的には双
方向にすることができます。ADE7953 の I2C インターフェー
スは、スレーブとしてのみ使用できます。
TXFSTA (I2CMSTA[1:0])
TXREQ (I2CMSTA[2])
I2CMTX
ADE7953 は、SCL エッジと SDA エッジの間に 0.1 µs の最小遅
延を必要とします。データシートの tHD;DAT 仕様を参照してく
ださい。ADE7953 のデータシートには、維持する必要がある
他のタイミング仕様も記載されています。
FIFO
FIFO
8 BITS
8 BITS
FIFO
FIFO
IENTX (I2CMCON[5])
TSR
IENTX (I2CSCON[10])
I2CSTX
TXREQ (I2CSSTA[2])
TXFSEREQ (I2CSSTA[0])
図 14 に代表的な I2C 転送シーケンスを示します。
I2C TRANSMIT PATH
ADuCM360 に は 、P0.1/SCLK1/SCL/SIN ピ ン と P0.2/
MOSI1/SDA/SOUT ピン経由、
および P2.0/SCL/UARTCLK
ピンと P2.1/SDA/UARTDCD ピン経由の 2 つの I2C インター
フェースがあります。この例では、P2.0/SCL/UARTCLK ピ
ンと P2.1/SDA/UARTDCD ピンを使用します。
RXREQ (I2CMSTA[3])
I2CMRX
// P2.0/SCL/UARTCLK is used for SCL,
P2.1/SDA/UARTDCD is used for SDA.
FIFO
FIFO
8 BITS
8 BITS
FIFO
FIFO
*pGP2CON |= 0x05;
IENRX (I2CMCON[4])
RSR
IENRX (I1CSCON[9])
I2CSRX
// Master Enable, Tx/Rx Request Interrupt Enable.
RXREQ (I2CSSTA[3])
*pI2CMCON = 0x131;
I2C RECEIVE PATH
すべてのスレーブは I2C 動作用のアドレスを持っており、マス
ターはこのアドレスを使用してスレーブを特定できます。この
アドレスは、ベンダーによって設定されます。例えば、ADE7953
のアドレスは 0x38 です。
MSB
SDA
図 13. I2C Tx/Rx のデータパス
LSB
SLAVE ADDRESS
SCL
MSB
LSB
R/W
DATA
3 TO 6
1
START
BIT
2
2 TO 7
7
8
9
ACK
BIT
図 14. 代表的な I2C 転送シーケンス
Rev. 0 | 10/15
1
8
9
ACK
BIT
STOP
BIT
13338-012
•
ADuCM360 の I2C インターフェース には、2 バイトの Tx およ
び Rx FIFO スキームがあります(図 13 を参照)。
2
13338-013
•
I2C アドレッシング・タイプには、7 ビットまたは 10 ビットを
使用できます。ADE7953 のアドレッシング・タイプにより、
ここでは 7 ビット・アドレッシングを使用します。
AN-1367
アプリケーション・ノート
15
8 7
0
VALUE
R/W
(SLAVE ADDRESS
RESERVED
MSB
I2CADR0
LSB
SDA
R/W
SLAVE ADDRESS
SCL
3 TO 6
2
7
8
9
START
BIT
13338-014
1
ACK
BIT
8
15
0
7
15
16
23
8
7
0
7
STOP
START
図 15. 7 ビット・アドレッシング・モード
0
SLAVE ADDRESS
P
A
C
K
MSB OF REGISTER ADDRESS
A
C
K
A
C
K
LSB OF REGISTER ADDRESS
BYTE 3 (MSB) OF REGISTER
A
C
K
BYTE 2 OF REGISTER
A
C
K
BYTE 1 OF REGISTER
A
C
K
BYTE 0 (LSB) OF REGISTER
A
C
K
13338-015
READ/WRITE
S 0 1 1 1 0 0 0 0
ACK GENERATED BY
ADE7953
START
図 16. ADE7953 の I2C 書込みシーケンス
8
15
0
1
1
1
0
0
0
SLAVE ADDRESS
7
0
0
READ/WRITE
S
A
A
A
C MSB OF REGISTER ADDRESS C LSB OF REGISTER ADDRESS C
K
K
K
ACK GENERATED BY
ADE7953
1
1
1
0
0
SLAVE ADDRESS
0
16
A
C 15
K
8
A
C
K
7
0
A
C
K
7
0
P
1
A
C
K
BYTE 3 (MSB)
OF REGISTER
BYTE 2 OF REGISTER
BYTE 1 OF REGISTER
BYTE 0 (LSB)
OF REGISTER
13338-016
0
READ/WRITE
S
23
STOP
START
ACK GENERATED BY
MASTER
ACK GENERATED BY
ADE7953
図 17. ADE7953 の I2C 読出しシーケンス
図 15 に、どのようにマスターが 7 ビット・アドレス(ビット
[7:1])とディレクショナル(読出しまたは書込み)ビット(ビッ
ト 0)をスレーブに送信するかを示します。
I2CADR0 レジスタは、スレーブ・アドレスとディレクショナ
ル・ビットを格納します。
ADE7953 の I2C インターフェースは、最大シリアル・クロッ
ク周波数である 400 kHz で動作します。
ADE7953 の I2C 書込み動作と I2C 読出し動作をそれぞれ図 16 と
図 17 に示します。
ADE7953 の書込み動作は、マスターが 7 ビット・デバイス・
アドレスを送信し、ディレクショナル・ビットが 0(0x70)に
設定されると開始されます。その後、内部レジスタの 16 ビッ
ト・アドレスが続きます。各バイトを受信したときに、ADE7953
はマスターにアクノレッジを送信します。その後、マスターは
MSB ファーストでレジスタ・データを送信します。このデー
タの長さは、レジスタに応じて 8、16、24、または 32 ビット
になります。最終バイトの転送が完了すると、マスターは停止
条件を送信し、バスがアイドル状態になります。
ADE7953 の I2C アドレスは 0b'0111000x(x はディレクショナ
ル・ビット)です。0 は書込みを示し、1 は読出しを示します。
Rev. 0 | 11/15
AN-1367
アプリケーション・ノート
ソース・コードを記述する際には、ターゲット・デバイスで I2C
がどのように実装されているかを理解する必要があります。
次のコードは、ADE7953 の I2C 書込み動作を表しています。
void I2C_Write_ADE7953(void)
{
int i=0;
if (((I2CMasterTxDat[0] >4) &&
(I2CMasterTxDat[0] <= 6))||((I2CMasterTxDat[0]
>9))) {
通常、組込みコードには物理アドレスが含まれますが、Visual
C++ はオペレーティング・システム(OS)の MMU によって
割り当てられる仮想アドレスしか解釈できません。仮想アドレ
スは、プログラムを実行したときに変わることがあります。
Cortex-M ファミリのマイクロコントローラには MMU は含ま
れていません。このため、Cortex-M コアをベースにした MCU
用のコードは Windows® CE や Linux® OS などに簡単に移植す
ることはできません。Embedded C コードで Visual C++ を使用
する方法については、Visual C++ を使用した Embedded C のシ
ミュレートのセクションを参照してください。
VISUAL C++ を使用した EMBEDDED C のシ
ミュレート
printf("The specified ADE7953 register
address is out of range¥n");
} else {
Visual C++ で C コード全体が完了したら、ADuCM360 の実行
可能イメージを作成するために、Keil MDK-ARM または IAR
Embedded Workbench IDE でリビルドを実行します。サンプル・
コードの次の C/C++ プリコンパイラ・ディレクティブにより、
このリビルドを実行することができます。
ReadFlag=0;
uiMasterTxIndex = 0;
// Master case : send 1st data.
*pI2CMTX =
I2CMasterTxDat[uiMasterTxIndex++];
#ifdef FermiEmulation_Mode
I2cMWrCfg(0x70);
// to initialize all of the ADuCM360 register set.
while (!ucComplete){}
ADuCM360_RegsInit();
ucComplete = 0;
#endif
}
}
このコードの if 条件は、ADE7953 のアドレス範囲に基づいて
います。レジスタ・アドレスの MSB は、アドレスが範囲外で
あるかどうかを決定します。詳細については、ADE7953 デー
タシートと ADE7953 Evaluation Board User Guide を参照してく
ださい。
次のステップ・バイ・ステップ手順は、Visual C++ 2012 デバッ
ガ・ツールを使用しているときにデバッグ・プロセスを理解す
るのに便利です。
次の方法は、
あらゆるバージョンの Visual Studio
で使用できます。
1.
新規プロジェクトを作成します(図 18 を参照)。
I2cMWrCfg(0x70)ルーチンは 0x01110000(0x70)を ADE7953
に送信します(図 15 と図 16 を参照)。
各バイトを受信したときに、ADE7953 はマスターにアクノレッ
ジ を 送 信 し 、ADuCM360 は I2C 割 込 み を 生 成 し て
ADuCM360_Test_Lib.h にある I2C0_Master_Int_Handler 関数を
呼び出します。これにより上記のコードの ucComplete の値が
変 更 さ れ ま す 。ucComplete 値 が 変 更 さ れ る と 、
I2C_Write_ADE7953() が while ループから抜け出して、
ADE7953
へのバイトの送信を続行します。
図 18. 新規プロジェクトの作成
2. [Empty Project]を選択します(図 19 を参照)。
13338-018
特に初期プロジェクトや新しい IC で作業を行う場合など、コー
ドのバグをデバッグするには、Visual C++ デバッガを使用しま
す。また、Visual C++ デバッガを使用することで、コードがど
のように機能するかをユーザーが理解するのに役立ちます。
13338-017
ADE7953 のレジスタに書込みを行うときには、データの長さ
がレジスタの説明に一致することを確認する必要があります。
このことは、ADE7953 IC からデータを読み出すときにもあて
はまります。I2C0_Master_Int_Handler 関数は、書込み動作と読
出し動作の両方でレジスタ・データ長を考慮します。
図 19. [Empty Project]の選択
Rev. 0 | 12/15
AN-1367
アプリケーション・ノート
すべてのサンプル・ファイルと既存の項目をプロジェク
トに追加します(図 20 と図 21 を参照)。
5. [C/C++]の下でサンプル・コードが含まれているフォル
ダを選択します。[Additional Include Directories]をク
リックします。図 23 と 図 24 を参照してください。
13338-022
3.
13338-019
図 23. サンプル・コードの検索
13338-023
図 20. サンプル・ファイルの追加
図 24. Visual Studio のサンプル・コードが含まれている
フォルダの選択
13338-020
6.
図 21. 既存の項目の追加
13338-024
特定のプロパティを変更します(図 22 ~ 図 25 を参照)。
図 25. コードの定義
図 22. [Properties]の選択
Visual C++ ですべてのサンプル・コードをコンパイルおよ
びリンクします(図 26 を参照)。
13338-025
7.
13338-021
4.
Visual C++ コンパイラの場合のみ、FermiEmulation_Mode
を定義します(図 25 を参照)。
この手順は、FermiEmulation_Mode を事前定義します。
これに基づいて、Embedded C コードで機能するように
Visual C++ コードをプログラミングすることができます。
他のバージョンの Visual Studio を使用している場合は、図
22 ~ 図 25 に示しているオプションをメニュー・オプショ
ンで検索する必要があります。ただし、手順は同じで
す。.NET の場合のみ _CRT_SECURE_NO_WARNINGS を
追加します(図 25 を参照)。
図 26. すべてのサンプル・コードのコンパイルおよびリンク
図 26 に示しているように、コードにエラーと警告はありませ
ん。
Rev. 0 | 13/15
AN-1367
アプリケーション・ノート
図 27 に、Visual C++ を使用して組込みコードをシミュレート
する方法を示します。
このデバッグ方法は非常に簡単で、すべてのプロセッサ・タイ
プで使用できます。
Visual C++ デバッガを使用するメリットは、
I2C0_Master_Int_Handler 関数と set/get コマンドを簡単に解析
できることです。
I2C0_Master_Int_Handler 関数の次のコードは、同期用です。
#ifndef FermiEmulation_Mode
__asm{ nop}
__asm{ nop}
__asm{ nop}
__asm{ DSB}
__asm{ nop}
13338-026
__asm{ nop}
図 27. 組込みコードのシミュレート
Visual C++ が ど の よ う に 機 能 す る か を 理 解 す る た め に 、
ADuCM360_Regs.c と ADuCM360_Regs.h を注意深く解析しま
す。これらのファイルは、ADuCM360 に関係する実アドレス
を定義し、MMU をイネーブルにして実アドレスに対応する仮
想アドレスを割り当て、Visual C++ がファイルをデバッグでき
るようにします。ファイルは、Keil MDK-ARM または IAR
Embedded Workbench でデバッグすることもできます。Keil
MDK-ARM または IAR Embedded Workbench を使用してデバッ
グする場合は、FermiEmulation_Mode を使用する必要はありま
せん。
#endif
ダウンロードしたサンプル・コードの printf 関数は、Visual C++
を使用した場合にコード・サイズを小さくなるように特別に開
発されたものです。このため、Keil MDK-ARM または IAR
Embedded Workbench ランタイム・ライブラリを使用した場合
は、コード・サイズが大きくなることがあります。コンパクト
な printf 関数は JongSuLib_V2.c ライブラリ・ファイルにあり、
ここにはレジスタの読出し/書込み関数など、その他の有用な
関数が数多く含まれています。ADuCM360_Test_Lib.c という
有用なライブラリ・ファイルには、I2C、SPI、UART、ADC/DAC
などの ADuCM360 ペリフェラルをサポートする関数が含まれ
ています。これらの 2 つの汎用ライブラリは、必要に応じて他
のプロジェクトに移植することもできます。
Rev. 0 | 14/15
AN-1367
アプリケーション・ノート
結論
このアプリケーション・ノートでは、I2C 向けの C コードを実
装し、ADuCM360 を使用して ADE7953 のレジスタを監視およ
び変更する方法について説明しました。組込みコードを開発す
る場合は、Visual C++ を使用することを推奨します。これは、
このツールでは、コーディングとデバッグを非常に簡単に行え
るためです。その後 Keil MDK-ARM または IAR Embedded
Workbench を使用して C コードをコンパイルおよびリンクして、
追加の変更を行うことなく実行可能イメージを作成します。
I2C は、Philips Semiconductors(現 NXP Semiconductors)が開発した通信プロトコルを表します。
Rev. 0 | 15/15