アプリケーション・ノート使用上の注意

本アプリケーションノートの英語以外の言語への翻訳はユーザの便宜のために提供されるものであり、リビジョンが古い場合があります。最新の内容については、必ず最新の英語版をご参照ください。

なお、日本語版のアプリケーションノートは基本的に「Rev.0」(リビジョン0)で作成されています。

Image
アプリケーション・ノート使用上の注意

AN-1367: ADE7953 と ADuCM360 の間の I2C インターフェース

はじめに

このアプリケーション・ノートでは、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)として用意されています。このアプリケーション・ノートでは、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 インターフェースを絶縁する場合は、アイソレータの伝搬遅延を考慮する必要があります。

Figure 1. Lab Setup. 図 1. ラボのセットアップ
図 1. ラボのセットアップ
Figure 2. Connection Between ADuCM360 EVM and ADE7953 EVM. 図 2. ADuCM360 EVM とADE7953 EVM 間の接続
図 2. ADuCM360 EVM とADE7953 EVM 間の接続

セットアップの説明

ターミナル・エミュレータ・ソフトウェア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 と通信できる点で、これはレジスタ・ルックアップ・テーブルがすでに実装されているためです。

Figure 3. Terminal Window Showing the Use of Get Command. 図 3. Get コマンド使用時のターミナル・ウィンドウ
図 3. Get コマンド使用時のターミナル・ウィンドウ
Figure 4. Terminal Window Showing the Use of Get and Set Commands. 図 4. Get およびSet コマンド使用時のターミナル・ウィンドウ
図 4. Get およびSet コマンド使用時のターミナル・ウィンドウ

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 kBFlash/EE メモリがあります。ADuCM360 のすべてのペリフェラルは、0x40000000 ~ 0x4004FFFF のアドレス範囲にマップされます。0xE000E000 ~ 0xE000EE000 のアドレス範囲はCortex-M コアのメモリ・マップド・レジスタ(MMR)用で、0x40000000 ~ 0x4004FFFF のアドレス範囲はADuCM360 のMMR 用です。

Figure 5. Memory Map Comparison Between Cortex-M and the ADuCM360. 図 5. Cortex-M とADuCM360 のメモリ・マップの比較
図 5. Cortex-M とADuCM360 のメモリ・マップの比較

NVIC に関する次のことに注意してください。

  • 以前のARM コアには高速割込みと標準割込みがありましたが、Cortex-M ファミリのコアには1 つのコア割り込みしかありません。
  • Interrupt Set Enable Register(ISER: 割込みセット・イネーブル・レジスタ)とInterrupt Clear Enable Register(ICER: 割込みクリア・イネーブル・レジスタ)の2 セットのレジスタを使用できます。

通常、UART およびI2C などのペリフェラルは、割込みをイネーブル/ディスエーブルにするための独自のレジスタを持っています。各ペリフェラルによって転送された割込みのうち1 つのみがISER/ICER 値に従ってコアに到達できます。ISER は0xE000E100 ~ 0xE000E13C のアドレス範囲、ICER は0xE000E180 ~ 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 を変更する必要があります。IDE をKeil MDK-ARM からIAR Embedded Workbench に変更する場合(またはその逆の場合)、命令ではなくアセンブラ・ディレクティブを変更する必要があります。これは、アセンブラ・ディレクティブは使用するアセンブラに依存し、命令セットはMCU コアに依存するためです。

図 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 のみです。

Figure 6. Keil MDK-ARM Tool Chain. 図 6. Keil MDK-ARM のツール・チェーン
図 6. Keil MDK-ARM のツール・チェーン
Figure 7. IAR Embedded Workbench Tool Chain. 図 7. IAR Embedded Workbench のツール・チェーン
図 7. IAR Embedded Workbench のツール・チェーン
Figure 8. ADuCM360 Block Diagram. 図 8. ADuCM360 のブロック図
図 8. ADuCM360 のブロック図

まず、PC と通信するようにUART を設定し、ADE7953 とインターフェースするようにI2C を設定します。このアプリケーション・ノートはI2C インターフェースに関するものですが、ダウンロード可能なファイルAN_1367_I2C_interface.zip に含まれているサンプル・コードにはUART インターフェースとGPIO 用のモジュールがあります。

UART およびI2C 用にADUCM360 を初期化する

Embedded C コードを開発するときには、まずウォッチドッグ・タイマをディスエーブルにし、必要に応じてコアおよびペリフェラルのクロックを設定します。

リセット操作後に、ウォッチドッグ・タイマが自動的にイネーブルになります。ADuCM360 のウォッチドッグ・タイマをディスエーブルにするには、ウォッチドッグ・タイマ・イネーブル・ビットであるT3CON[5] に0’b0 を書き込みます。

// 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 によってクロックが分周されるすべてのペリフェラルに該当します。ペリフェラルのクロックのほうが遅い場合、ペリフェラルに対するクロックがゲーティングされ、ペリフェラルが機能しません。詳細については、ADuCM360/ ADuCM361 Hardware User Guide を参照してください。

図 9 に示しているように、PC とのUART のインターフェースは115,200 bps のボーレートで設定されています。このため、Tera Term ツールも同じように設定します。「MyTera_Setup2014.INI」という名前のTera Term のプロジェクト・ファイルを参照してください。このファイルは、ダウンロード可能なファイルAN_1367_I2C_interface.zip に含まれています。

Tera Term プロジェクト・ファイルを使用するには、[Setup]から[Restore setup]オプションを選択します(図11 を参照)。次に、PC に保存した場所からMyTera_Setup2014.INI プロジェクト・ファイルを選択します。

Figure 9. Clock Configuration for UART. 図 9. UART のクロックの設定
図 9. UART のクロックの設定
Figure 10. Clock Configuration for I2C. 図 10. I2C のクロックの設定
図 10. I2C のクロックの設定
Figure 11. Tera Term Configuration. 図 11. Tera Term の設定
図 11. Tera Term の設定

次の C コードの命令は、UART インターフェースの設定方法を示しています。これは、ダウンロード可能なファイルAN_1367_I2C_interface.zip に含まれているADuCM360_I2C_AppNote.c ファイルから抽出したコードです。コード内のすべての変数は、クロック、GPIO、およびUART に関連するMMRを表します。

// Step 2. Configure clocks.
    // UART speed rate is 115,200 bps: 
    UCLK/DIV = 16 MHz.
    *pCLKDIS=0x03F7; 
    *pCLKSYSDIV=0x00; 
    *pCLKCON0=0x0000;
    *pCLKCON1=0x0000; 
    // Step 3. Set up the behavior of the 
    chosen UART. 
    *pCOMCON=0x00; // UART peripheral is 
    enabling.
    // P0.2 is UART Tx; P0.1 is UART Rx.
    *pGP0CON=0x003C;
    *pCOMDIV=0x0002; // COMDIV = 2;
    *pCOMFBR=0x915C; // Set to 115,200 bps 
    // WordLength = 8 bits, stop bit = 1 bit, 
    no parity check.
    *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); //ISER = 
    0xE000E100;

次に、ADuCM360 の I2C ペリフェラルを初期化します。ADE7953は常にスレーブであるため、ADuCM360 をマスターとして設定する必要があります。

マスターであるADuCM360 で使用可能なI2C モードは、次のとおりです。

  • 標準モード: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 に示します。

Figure 12. Generation Method of Standard 100 kHz SCL. 図 12.標準100 kHz SCL の生成方法
図 12.標準100 kHz SCL の生成方法

図 10 と図12 に示しているように、fI2CCLK は 16 MHz で、CLKSYSDIV[0] = 0 とCLKCON1[8:6] = 0 を初期化した場合、SCL ビット・レートfSCL は次の式を使用して計算できます。

数式 1.

ここで、

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で簡単に実装することができます。ほとんどのファクトリー・オートメーション・システムがこの方法を使用しています。

I2C インターフェース:ADUCM360 と ADE7953

I2C インターフェースは、SCL とSDA の2 つのピンを使用して実装します(このセクションでは、P2.0/SCL/UARTCLK などの多機能ピンは、1 つの機能のみが該当する場合には、その1 つの機能(例: SCL)で表しています)。

  • SCL: シリアル・クロック・ピン。マスターのみがI2C クロックを生成できます。SCL は、標準モードまたは高速モードで使用できます。
  • SDA: シリアル・データ・ピン。

SCL とSDA は両方とも双方向で、プルアップ抵抗を使用して正電源電圧に接続する必要があります。この場合、SCL はADuCM360 によって生成されますが、ADuCM360 の I2C インターフェースはスレーブとして設定できるため、理論的には双方向にすることができます。ADE7953 の I2C インターフェースは、スレーブとしてのみ使用できます。

ADE7953 は、SCL エッジとSDA エッジの間に0.1 μs の最小遅延を必要とします。データシートのtHD;DAT 仕様を参照してください。ADE7953 のデータシートには、維持する必要がある他のタイミング仕様も記載されています。

図 14 に代表的なI2C 転送シーケンスを示します。

Figure 14. Typical I2C Transfer Sequence. 図 14. 代表的な I2C 転送シーケンス
図 14. 代表的な I2C 転送シーケンス

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 ピンを使用します。

// P2.0/SCL/UARTCLK is used for SCL, 
    P2.1/SDA/UARTDCD is used for SDA.
    *pGP2CON |= 0x05;
    // Master Enable, Tx/Rx Request Interrupt 
    Enable.
    *pI2CMCON = 0x131;

すべてのスレーブはI2C 動作用のアドレスを持っており、マスターはこのアドレスを使用してスレーブを特定できます。このアドレスは、ベンダーによって設定されます。例えば、ADE7953のアドレスは0x38 です。

I2C アドレッシング・タイプには、7 ビットまたは10 ビットを使用できます。ADE7953 のアドレッシング・タイプにより、ここでは7 ビット・アドレッシングを使用します。

ADuCM360 の I2C インターフェースには、2 バイトのTx およびRx FIFO スキームがあります(図13 を参照)。

Figure 13. Datapath of I2C Tx/Rx. 図 13. I2C Tx/Rx のデータパス
図 13. I2C Tx/Rx のデータパス

通常、コア・クロックとペリフェラル・クロックは異なります。あるクロック・ドメインのデータを別のクロック・ドメインに転送すると、メタスタビリティが発生して通信がエラーになります。メタスタビリティが発生しないようにするには、FIFO またはデュアルポートRAM を使用します。メタスタビリティは、組み合わせロジックを使用して解決することはできません。

図 15 に、どのようにマスターが7 ビット・アドレス(ビット[7:1])とディレクショナル(読出しまたは書込み)ビット(ビット0)をスレーブに送信するかを示します。

Figure 15. 7-Bit Addressing Mode. 図 15. 7 ビット・アドレッシング・モード
図 15. 7 ビット・アドレッシング・モード

I2CADR0 レジスタは、スレーブ・アドレスとディレクショナル・ビットを格納します。

ADE7953 の I2C インターフェースは、最大シリアル・クロック周波数である400 kHz で動作します。

ADE7953 の I2C 書込み動作とI2C 読出し動作をそれぞれ図16 と図17 に示します。

Figure 16. I2C Write Sequence of the ADE7953. 図 16. ADE7953 の I2C 書込みシーケンス
図 16. ADE7953 の I2C 書込みシーケンス
Figure 17. I2C Read Sequence of the ADE7953. 図 17. ADE7953 の I2C 読出しシーケンス
図 17. ADE7953 の I2C 読出しシーケンス

ADE7953 の I2C アドレスは0b'0111000x(x はディレクショナル・ビット)です。0 は書込みを示し、1 は読出しを示します。

ADE7953 の書込み動作は、マスターが7 ビット・デバイス・アドレスを送信し、ディレクショナル・ビットが0(0x70)に設定されると開始されます。その後、内部レジスタの16 ビット・アドレスが続きます。各バイトを受信したときに、ADE7953はマスターにアクノレッジを送信します。その後、マスターはMSB ファーストでレジスタ・データを送信します。このデータの長さは、レジスタに応じて8、16、24、または32 ビットになります。最終バイトの転送が完了すると、マスターは停止条件を送信し、バスがアイドル状態になります。

ソース・コードを記述する際には、ターゲット・デバイスでI2Cがどのように実装されているかを理解する必要があります。

次のコードは、ADE7953 の I2C 書込み動作を表しています。

void I2C_Write_ADE7953(void)
    { 
     int i=0;
     if (((I2CMasterTxDat[0] >4) && 
    (I2CMasterTxDat[0] <= 
    6))||((I2CMasterTxDat[0] >9))) { 
     printf("The specified ADE7953 
    register address is out of range\n");
     } else {
     ReadFlag=0;
     uiMasterTxIndex = 0;
     // Master case : send 1st data.
     *pI2CMTX = 
    I2CMasterTxDat[uiMasterTxIndex++]; 
     I2cMWrCfg(0x70);
     while (!ucComplete){}
     ucComplete = 0;
     } 
    }

このコードのif 条件は、ADE7953 のアドレス範囲に基づいています。レジスタ・アドレスのMSB は、アドレスが範囲外であるかどうかを決定します。詳細については、ADE7953 データシートとADE7953 Evaluation Board User Guideを参照してください。

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へのバイトの送信を続行します。

ADE7953 のレジスタに書込みを行うときには、データの長さがレジスタの説明に一致することを確認する必要があります。このことは、ADE7953 IC からデータを読み出すときにもあてはまります。I2C0_Master_Int_Handler 関数は、書込み動作と読出し動作の両方でレジスタ・データ長を考慮します。

特に初期プロジェクトや新しいIC で作業を行う場合など、コードのバグをデバッグするには、Visual C++ デバッガを使用します。また、Visual C++ デバッガを使用することで、コードがどのように機能するかをユーザーが理解するのに役立ちます。

通常、組込みコードには物理アドレスが含まれますが、VisualC++ はオペレーティング・システム(OS)のMMU によって割り当てられる仮想アドレスしか解釈できません。仮想アドレスは、プログラムを実行したときに変わることがあります。Cortex-M ファミリのマイクロコントローラにはMMU は含まれていません。このため、Cortex-M コアをベースにしたMCU用のコードはWindows® CE やLinux® OS などに簡単に移植することはできません。Embedded C コードでVisual C++ を使用する方法については、Visual C++ を使用したEmbedded C のシミュレートのセクションを参照してください。


VISUAL C++ を使用したEMBEDDED C のシミュレート


Visual C++ でC コード全体が完了したら、ADuCM360 の実行可能イメージを作成するために、Keil MDK-ARM またはIAREmbedded Workbench IDE でリビルドを実行します。サンプル・コードの次のC/C++ プリコンパイラ・ディレクティブにより、このリビルドを実行することができます。

#ifdef FermiEmulation_Mode
    // to initialize all of the ADuCM360
    register set. 
     ADuCM360_RegsInit(); 
    #endif

次のステップ・バイ・ステップ手順は、Visual C++ 2012 デバッガ・ツールを使用しているときにデバッグ・プロセスを理解するのに便利です。次の方法は、あらゆるバージョンのVisual Studioで使用できます。

  1. 新規プロジェクトを作成します(図18 を参照)。
    Figure 18. Create New Project. 図 18. 新規プロジェクトの作成
    図 18. 新規プロジェクトの作成
  2. Empty Project]を選択します(図19 を参照)。
    Figure 19. Select Empty Project. 図 19. [Empty Project]の選択
    図 19. [Empty Project]の選択
  3. すべてのサンプル・ファイルと既存の項目をプロジェクトに追加します(図20 と図21 を参照)。
    Figure 20. Add Sample Files. 図 20. サンプル・ファイルの追加
    図 20. サンプル・ファイルの追加
    Figure 21. Add Existing Items. 図 21. 既存の項目の追加
    図 21. 既存の項目の追加
  4. 特定のプロパティを変更します(図22 ~ 図 25 を参照)。
    Figure 22. Select Properties. 図 22. [Properties]の選択
    図 22. [Properties]の選択
  5. C/C++]の下でサンプル・コードが含まれているフォルダを選択します。[Additional Include Directories]をクリックします。図23 と 図 24 を参照してください。
    Figure 23. Search for Sample Codes. 図 23. サンプル・コードの検索
    図 23. サンプル・コードの検索
    Figure 24. Select Folder with Visual Studio Sample Code. 図 24. Visual Studio のサンプル・コードが含まれているフォルダの選択
    図 24. Visual Studio のサンプル・コードが含まれているフォルダの選択
  6. Visual C++ コンパイラの場合のみ、FermiEmulation_Modeを定義します(図25 を参照)。この手順は、FermiEmulation_Mode を事前定義します。これに基づいて、Embedded C コードで機能するようにVisual C++ コードをプログラミングすることができます。他のバージョンのVisual Studio を使用している場合は、図22 ~ 図 25 に示しているオプションをメニュー・オプションで検索する必要があります。ただし、手順は同じです。.NET の場合のみ_CRT_SECURE_NO_WARNINGS を追加します(図25 を参照)。
    Figure 25. Define the Code. 図 25. コードの定義
    図 25. コードの定義
  7. Visual C++ ですべてのサンプル・コードをコンパイルおよびリンクします(図26 を参照)。
    Figure 26. Compile and Link all Sample Codes. 図 26. すべてのサンプル・コードのコンパイルおよびリンク
    図 26. すべてのサンプル・コードのコンパイルおよびリンク

図 26 に示しているように、コードにエラーと警告はありません。

図 27 に、Visual C++ を使用して組込みコードをシミュレートする方法を示します。

Figure 27. Simulate Embedded Code. 図 27. 組込みコードのシミュレート
図 27. 組込みコードのシミュレート

Visual C++ がどのように機能するかを理解するために、ADuCM360_Regs.cADuCM360_Regs.h を注意深く解析します。これらのファイルは、ADuCM360 に関係する実アドレスを定義し、MMU をイネーブルにして実アドレスに対応する仮想アドレスを割り当て、Visual C++ がファイルをデバッグできるようにします。ファイルは、Keil MDK-ARM またはIAR Embedded Workbench でデバッグすることもできます。KeilMDK-ARM またはIAR Embedded Workbench を使用してデバッグする場合は、FermiEmulation_Mode を使用する必要はありません。

このデバッグ方法は非常に簡単で、すべてのプロセッサ・タイプで使用できます。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}
     __asm{ nop}
    #endif

ダウンロードしたサンプル・コードのprintf 関数は、Visual C++を使用した場合にコード・サイズを小さくなるように特別に開発されたものです。このため、Keil MDK-ARM またはIAREmbedded Workbench ランタイム・ライブラリを使用した場合は、コード・サイズが大きくなることがあります。コンパクトなprintf 関数はJongSuLib_V2.c ライブラリ・ファイルにあり、ここにはレジスタの読出し/書込み関数など、その他の有用な関数が数多く含まれています。ADuCM360_Test_Lib.c という有用なライブラリ・ファイルには、I2C、SPI、UART、ADC/DACなどのADuCM360 ペリフェラルをサポートする関数が含まれています。これらの2 つの汎用ライブラリは、必要に応じて他のプロジェクトに移植することもできます。

結論

このアプリケーション・ノートでは、I2C 向けのC コードを実装し、ADuCM360 を使用してADE7953 のレジスタを監視および変更する方法について説明しました。組込みコードを開発する場合は、Visual C++ を使用することを推奨します。これは、このツールでは、コーディングとデバッグを非常に簡単に行えるためです。その後Keil MDK-ARM またはIAR Embedded Workbench を使用してC コードをコンパイルおよびリンクして、追加の変更を行うことなく実行可能イメージを作成します。

著者

Generic_Author_image

Fermi Lim

Generic_Author_image

Daniel Kim

Generic_Author_image

Hariharan Mani