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