DS8007の評価キット入門

要約

このアプリケーションノートでは、DS8007デュアルスマートカードインタフェース用の評価(EV)キットをすぐに使用できるよう必要な手順について説明しています。この記事では、ソフトウェアのインストールと設定方法、ハードウェアの設定方法、およびオンボードDS5002FPマイクロコントローラで実行可能なアプリケーションの作成とロードの方法について説明します。また、オンボードLCDモジュールの使用を実証するため、単純な「Hello World (ハローワールド)」の例と、Cソースコードによるいくつかの関数を提供します。

概要

DS8007の評価(EV)キットは、DS8007デュアルスマートカードインタフェースを評価するため、使いやすく実績のあるプラットフォームを提供します。DS8007は、マイクロコントローラと2つの独立したスマートカード間のインタフェースの詳細をすべて管理するミックスドシグナル周辺機器です。

DS8007のEVキットは、完全なスマートカードインタフェースを実現するため、プログラミング可能なDS8007およびDS5002FPセキュアマイクロコントローラで構成されています。また、DS8007のEVキットには、2つのスマートカードソケットも実装されており、1つは標準的なクレジット/支払い用カードのサイズ、もう1つは加入者識別モジュール(SIM)デバイスのサイズです。DS8007のキットのボードを図1に示します。この記事では、このEVキットをすぐに使用することができる方法と、アプリケーションコードの作成および実行方法について説明します。

Figure 1. DS8007 EV kit board.
図1. DS8007のEVキットボード

DS8007は、マイクロコントローラと2つの独立したスマートカードを物理的にインタフェース接続するために必要なすべての電気信号を供給します。また、このデバイスは、カードの有効化と無効化を自動的に制御する専用の内蔵シーケンサ、およびデータ通信用ISO UARTを実装しています。更に、DS8007は搭載しているチャージポンプと電圧レギュレータによって2.7V~6.0Vの電源電圧で動作が可能で、2種類の独立したスマートカードへ1.8V、3.0V、または5.0Vのいずれの供給電圧も生成することができます。マイクロコントローラとの通信は、8ビットの標準パラレルバスで多重化または非多重化の設定が可能です。

ソフトウェアのセットアップ

このアプリケーションノートにおける作業には、ダラスセミコンダクタ製のマイクロコントローラツールキット(MTK)、およびKeil社のPK51プロフェッショナルディベロッパーツールキットのそれぞれのソフトウェアが、コンピュータにインストールされ、使用可能な状態であることが必要です。いずれのソフトウェアパッケージも、DS8007のEVキットに同梱されています。以下の各項では、これらのアプリケーションをインストールするための手順を説明しています。これらのアプリケーションの一方または両方が、すでにコンピュータにインストールされている場合は、該当するアプリケーションのインストール方法を説明している項をお読みいただく必要はありません。

マイクロコントローラツールキットのインストール

  1. DS8007のEVキットのインストールCDをコンピュータのCD-ROMドライブに挿入します。CDは自動ブートし、DS8007のEVキットのWelcome (ようこそ)画面がディスプレイに表示されます。CD-ROMが自動ブートしない場合は、CDのルートフォルダを開き、index.htmlファイルをダブルクリックします。
  2. 「Install MTK (MTKをインストール)」ボタンをクリックし、「Run (実行)」ボタンをクリックしてインストールを開始します。
  3. MTKのインストール時に、デフォルト設定を選択します。注:ウェブブラウザのセキュリティ設定およびWindows®のバージョンによっては、セキュリティ警告が表示される場合があります。この場合は、そのまま警告を了解し、インストールを続行してください。

Keil社製プロフェッショナルディベロッパーツールキットのインストール

  1. Keil社のPK51プロフェッショナルディベロッパーツールキットをインストールするには、Keil社のマイクロコントローラディベロップメントツールCD (DS8007のEVキットに同梱)をコンピュータのCD-ROMドライブに挿入します。CDは自動ブートし、メインメニューがディスプレイに表示されます。CD-ROMが自動ブートしない場合は、CDのルートフォルダを開き、setup.exeファイルをダブルクリックします。
  2. メインメニューで、「Install Evaluation Software (評価ソフトウェアをインストール)」を選択し、次に「C51 Compiler (Eval Tools) (C51コンパイラ(評価ツール))」を選択します。
  3. 画面の指示にしたがって、Keil社のツールをコンピュータにインストールします。

ハードウェアのセットアップ

DS8007のEVキットボードを設定するには、ジャンパの設定、シリアルポートのPCへの接続、および電源の接続を正しく行う必要があります。詳細な手順を以下に説明します。

  1. ジャンパJU1~13を図2に示すように接続します。詳細については表1を参照してください。
  2. 同梱のシリアルケーブルの片方の端をボードのDB-9コネクタ(J6)に接続し、もう一方の端をコンピュータのCOMポートに接続します。
  3. EVキットに同梱の電源(5V、安定化(±5%)、300mA、2.5mmのセンタープラス)をボードのJ7電源コネクタに接続します。

    Figure 2. DS8007 board jumper locations.
    図2. DS8007のボードのジャンパ位置

表1. DS8007のボードのジャンパ設定
Jumper Installed Description
JU1 Installed Board's DVDD connected to DS8007's digital VDD
JU2 Installed DS8007's VCCA connected to smart card socket 1, pin C1
JU3 Installed Board's AVDD connected to DS8007's analog supply, VDDA
JU4 Installed: Connect pins 1 and 2 Board's AVDD connected to smart card socket 1, pin S2
JU5 Installed: Connect pins 2 and 3 Board's AVDD connected to smart card socket 1 pin, S1 through 10K
JU6 Not Installed
JU7 Not Installed
JU8 Installed DS8007's VCCB connected to SAM socket, pin C1
JU9 Installed: Connect pins 2 and 3 DS8007's PRESB connected to GND (through 10K)
JU10 Installed: Connect pins 2 and 3 DS5002FP's nPROG connected to RS-232 DTR0/DSR0
JU11 Installed Board's 5V supply connected to board's AVDD
JU12 Installed Board's 5V supply connected to board's DVDD
JU13 Installed: Connect pins 2 and 3 DS8007's INTAUX pin connected to GND (through 10K)

実行ファイルの作成およびローディング

次の手順は、ボードのメモリにダウンロードしてDS5002FPによって実行可能な.HEXファイルの作成方法です。このファイルを作成するには、Keil µVision®のプロジェクトファイルを設定してロード可能な適正なファイルを作成する作業、およびロードしたファイルをボードの不揮発性メモリにダウンロードする作業が必要です。

µVision Projectの作成

Keil社のC51ディベロップメントツールをコンピュータにインストールした後、作成されたアイコンをクリックしてµVisionプログラムを開始します。ここで、以下の手順にしたがって、デモプログラム用のプロジェクトおよびCソースを作成します。

  1. メニューバーから「Project (プロジェクト)」→「New Project (新規プロジェクトの作成)」を選択し、プロジェクト名にDS8007-1を入力します。
  2. 「Select Device for Target (ターゲットデバイスの選択)」が表示されたら、Dallas Semiconductorフォルダを選択し、デバイス選択リストからDS5002FPを選択します。
  3. 「Copy Standard 8051 Startup Code to Project Folder and Add File to Project (8051標準開始コードをProjectフォルダにコピーし、ファイルをプロジェクトに追加します)」メッセージが表示されたら、「Yes」ボタンをクリックします。
  4. 「File (ファイル)」→「New (新規作成)」をクリックしてソースファイルを作成し、以下の情報を入力します。ファイルのダウンロードをご希望の場合、ここからダウンロードすることもできます(ZIP、11kB)。
    // File DS8007-1.C 
    
    #include <REG5000.H>                    // special function register declarations 
    //                                      // for the DS5000/5002                   
    #include <stdio.h>                      // prototype declarations for I/O functions 
    
    // Main C function.  Program execution starts here.
    void main (void) {
    
    // Set up the serial port for 38400 baud at 14.7MHz.
            TMOD=0x21;                      // Timer 1: 8-bit auto-reload from TH1, Timer 0: 16-bit
            TH1 = 0xFE;                     // Set timer reload value for 38,400 baud
            PCON|=0x80;                     // Turn on baud rate doubler SMOD_0
            TCON=0x50;                      // Enable timers 0 and 1
            SCON=0x50;                      // 10-bit async, enabled
            TI=1;                           // Set TI to send first character
            TR1 = 1;                        // Start timer 1
    
    // Start main program
            printf ("\nHello DS8007 World!\n\n");   // Output message
            while (1) ;                     // End program by looping here.
    }
    
  5. 上記のテキストを入力した後、「File (ファイル)」→「Save As (名前を付けて保存)」をクリックし、ファイル名に「DS8007-1.c」を入力してファイルを保存します。
  6. Project Workspace (プロジェクトワークスペース)ウィンドウで、Target 1 (ターゲット1)を右クリックしてこのファイルをプロジェクトリストに追加し、「Manage Components (コンポーネントの管理)」オプションをクリックします。Project Components (プロジェクトコンポーネント)タブで、「Add Files (ファイルの追加)」ボタンをクリックし、ファイル名の入力欄にファイル名(DS8007-1.c)を入力します。「Add (追加)」ボタンをクリック後、「Close (閉じる)」ボタンをクリックします。「OK」ボタンをクリックしてComponents (コンポーネント)ウィンドウを閉じます。Source Group 1 (ソースグループ1)に保存したファイルが追加されていることを確認することができます。
  7. Project Workspace (プロジェクトワークスペース)ウィンドウのTarget 1 (ターゲット1)を右クリックして、「Options for Target 'Target 1 (ターゲットのオプション「ターゲット1」)」を選択し、プロジェクトオプションを設定します。Target (ターゲット)タブをクリックし、下の図3に示すようにXtalボックスに14.7と入力します。また、Memory Model (メモリモデル)に「Small: variables in DATA (小:データ内に変数あり)」を選択し、Code ROM Size (コードROMサイズ)に「Large: 64K program (大:64Kプログラム)」、Operating system (オペレーティングシステム)に「None (なし)」を選択します。このウィンドウでのその他の選択項目については、すべてデフォルト設定のままで変更する必要はありません。
  8. Output (出力)タブで、「Create Executable (実行可能ファイルを作成)」にチェックマークが付いていない場合は、図4に示すようにチェックマークを付けます。また、「Create HEX File (HEXファイルを作成)」にチェックマークが付いていることを確認します。図4に示すように、HEX Format (HEXフォーマット)のドロップダウン選択ボックスからHEX-80を選択します。このウィンドウでのその他の選択項目については、すべてデフォルト設定のままで変更しないようにしてください。「OK」をクリックし、Options for Target 'Target 1' (ターゲットのオプション「ターゲット1」)ウィンドウを閉じます。
  9. 「File (ファイル)」→「Save All (すべて保存)」をクリックして、Projectファイルを保存します。
  10. メインメニューで「Project (プロジェクト)」をクリックして、「Rebuild All Target Files (すべてのターゲットファイルを再構築)」を選択し、実行ファイルを作成します。画面下のビルドウィンドウに0 Error(s), 0 Warning(s) (エラー:0、警告:0)が表示される必要があります。エラーがある場合には、エラーを見つけて必要な修正を行います。エラーがなくなるまでこの手順を繰り返します。
Figure 3. Project options target tab settings.
図3. プロジェクトオプションのTargetタブの設定

Figure 4. Project options output tab settings.
図4. プロジェクトオプションのOutputタブの設定

実行ファイルのローディング

上記の手順にしたがってハードウェアの設定をした後、DS8007ボードをコンピュータのCOMポートに接続します。利用可能なオンボードメモリへのアクセス方法をプロセッサが認識するには、次にプロセッサの設定が必要となります。このため、以下の手順にしたがって、プロセッサのMCONおよびRPCTLレジスタに適切な値を書き込む必要があります。

  1. MTKプログラムをコンピュータ上で開始します。
  2. Select Device (デバイスを選択)ウィンドウの「DS5002FP」を選択し(図5)、「OK」をクリックします。
  3. 「Options (オプション)」→「Configure Serial Port (シリアルポートを設定)」をクリックします。DS8007ボードが接続されているコンピュータのPort (ポート)を選択します(例:COM1)。次に、ドロップダウンメニューから「Speed 38400 (スピード38400)」を選択し、「OK」をクリックします。
  4. 「Target (ターゲット)」→「Open COM1 at 38400 baud (COM1を38400ボーで開く)」をクリックします。
  5. ボードのシリアルポートがコンピュータに接続され、5Vの電源が供給されていることを確認します。「Target (ターゲット)」と「Connect to Loader (ローダへ接続)」をクリックします。接続が成功した場合には、図6に示すように、DS5002FPのブートローダバナーが表示されます。
  6. プロンプト記号>の後に以下のコマンドを入力し、MCONおよびRPCTLレジスタを設定します。
    > W MCON 0A
    
    > W RPCTL 01
    
    > R
    
    MCON:0A RPCTL:81 MSL:01        Microcontroller's response to read register command
    
    ブートローダコマンドの入力時に、「E: LOCKED (E:ロックされています)」エラーメッセージが表示された場合、その部分にはセキュリティロックが設定されています。その部分のロックを解除するには、ローダプロンプト>の後にロック解除コマンド(U)を入力します。これによって、プロセッサメモリに保存されている該当の情報が破壊されることになりますが、その部分のロックを解除することで、上記のレジスタコマンドを入力することができるようになります。読出しレジスタコマンド(> R)の発行後、DS5002FPは上記のとおりレジスタのステータスであるMCON (0A)およびRPCTL (81)を通知します。また、DS5002FPはMSLビットのステータス(この場合は01)も表示します(詳細については、セキュアマイクロコントローラのユーザガイド(英文のみ)を参照)。
以上で、DS8007ボードは、Keil社のディベロップメントツールで作成されたプログラムファイルをロードすることができるようになりました。
  1. 「File (ファイル)」をクリックし、「Load SRAM (SRAMをロード)」を選択します。DS8007-1.HEXファイルを選択し、「OPEN (開く)」をクリックします。DS5002FPプロセッサは以下のとおり応答します。
    > Loading File ...\DS8007-1.hex
    
    その後、一連のドットを表示することでロードの進行状況を示します。
  2. ロードが完了すれば、プロセッサは「Load complete (ロード完了)」を通知します。「Target (ターゲット)」→「Disconnect from Loader (ローダから切断)」をクリックすることで、プログラムを実行することができます。
ブートストラップローダが切断されると直ちに、プロセッサはプログラムの実行を開始します。MTK画面にプログラムの出力結果「Hello DS8007 World ! (ハロー、DS8007ワールド)」が表示されます。これが表示されたら作業は成功です !

Figure 5. MTK device selection.
図5. MTKデバイスの選択

Figure 6. DS5002FP boot loader banner.
図6. DS5002FPブートローダバナー

EVキットLCDモジュール

次に、DS8007EVキットの非常に有用な機能の1つを実証するため、2行20文字の液晶ディスプレイ(LCD)にメッセージを表示させるアプリケーションプログラムを作成します。ただしその前に、LCDコントラスト調整を設定し、プログラムの実行時にLCDにメッセージが適切に表示されるようにする必要があります。まず、ボードに電源を供給しますが、このときLCDには何も表示されていないことを確認してください。可変抵抗器R7をボード上に設置します(上図2を参照)。小型のねじ回しを使用して、ディスプレイの文字位置に各5 x 7ドットの四角が表示されるまで、レジスタを調整します。表示された四角がちょうど消えるまで、R7をゆっくりと調整します。これでLCDのコントラストは調整され、文字は表示されますが、スペースは表示されなくなります。

上記の手順1~10 (µVision Projectの作成)にしたがって、新しいプロジェクトおよび実行可能ファイルを作成します。プロジェクトファイル名にDS8007-2、Cソースコードファイル名にDS8007-2.cを使用します。このプログラムのソースコードは、以下の付録Aに示します。この情報の入力を望まない場合には、上記のFTPウェブサイトから.ZIPファイルを入手することができます。

HEXファイルが作成された時点で、上記の手順(実行ファイルのローディング)にしたがって、ボードのメモリにHEXファイルをロードします。ローダから切断されると、LCDは2行のメッセージを表示します。

結論

DS8007EVキットは、DS8007デュアルスマートカードインタフェースを評価するために、使いやすく実績のあるプラットフォームを提供します。このキットおよびKeil社のC言語によるディベロップメントツールによって、スマートカードアプリケーションの開発が簡素化されます。

付録A. LCDデモコード

// file DS8007-2.c
//

#include <REG5000.H>                      // special function register declarations
//                                        // for the DS5000/5002 #include <string.h>
#include "LCD_Funct.h"




        int tmp = 0;
        uint8_t LCD_Str[42];


void main(void)
{

        // Initialize LCD Module, and display 2-line message.
        LCD_Init();
        strcpy(LCD_Str, "DS8007 Dual");                 // Create first line of LCD text
        tmp = LCD_Curpos(1,5);                          // Position cursor line 1 char 5
        if (tmp == 0) LCD_WRStr(LCD_Str);               // Write string to LCD

        strcpy(LCD_Str, "Smart Card Interface");        // Create 2nd line of LCD text
        tmp = LCD_Curpos(2,1);                          // Position cursor on line 2, char 1
        if (tmp == 0) LCD_WRStr(LCD_Str);               // Write string to LCD
        
        tmp = LCD_Curpos(1,20);                         // Return cursor to line 1 char 20

        while (1);                                      // Loop here to end program
}


void LCD_Init()
{
        LCD_Delay();                    // Delay to ensure that LCD power-up is complete
        
        LCD_WRCmd(FnctSet);             // Write FnctSet instruction
        LCD_WRCmd(DispCnt);             // Write Display Control instruction
        LCD_WRCmd(DispClear);           // Write Display Clear instruction
        LCD_WRCmd(EntryMode);           // Write Entry Mode instruction
}

// Write a string to the 2 x 20 LCD module
void LCD_WRStr(uint8_t LCD_Str[])
{
        int     i = 0;

        while ((LCD_Str[i] != '\0')     && (i < 20))
        {
                LCD_WRChr(LCD_Str[i]) ; // Write first 20 characters
                i++;
        }
        
        if  (LCD_Str[i] != '\0')
            LCD_WRCmd(Line2Ad);         // Set CGRAM address to first char 2nd line

        while ((LCD_Str[i] != '\0')     && (i < 40))
        {
                LCD_WRChr(LCD_Str[i]) ;
                i++;
        }
}

// Write a single character to the 2 x 20 LCD module
void LCD_WRChr(uint8_t LCD_Chr)
{
        LCD_Busy();                     // Wait until the LCD is not busy
        LCD_RS = 1;                     // Set RS high for character write
        LCD_Dat = LCD_Chr;              // Output character
        LCD_EN = 1;                     // Set enable high
        LCD_EN = 0;                     // Clear enable
        LCD_RS = 0;
        LCD_Dat = 0xFF;                 // Re-establish Port Pins as inputs
}

// Write a command to the 2 x 20 LCD module
void LCD_WRCmd(uint8_t LCD_Cmd)
{
        LCD_EN = 0;                     // Make sure that the LCD enable is low 
        LCD_RS = 0;                     // Set LCD register select and R/W lines
        LCD_RW = 0;
        LCD_Busy();                     // Make sure that the display is not busy

        LCD_Dat = LCD_Cmd;              // Output instruction
        LCD_EN = 1;                     // Set enable high
        LCD_EN = 0;                     // Clear enable
        LCD_Dat = 0xFF;                 // Re-establish Port Pins as inputs
}

// Set the cursor position to a specific location
int LCD_Curpos(uint8_t VPos, uint8_t HPos)
{
        int rtn;
        uint8_t Addr, Cmd;

        // Check input range 1..2 line, 1..20 characters per line
        if (((VPos == 0) || (VPos > 2)) || ((HPos == 0) || (HPos > 20)))
                rtn = -1;
        else
        {
                if(VPos == 2) Addr = (0x40 + (HPos - 1));
                else Addr = HPos - 1;
                rtn = 0;
                Cmd = Addr | 0x80;
                LCD_WRCmd(Cmd);
        }
        return(rtn);    
}

// Test the LCD Module to see if it is Busy (loop until
// not busy) 
void LCD_Busy()
{
        uint8_t LCD_Stat = LCD_Dat;     // Get byte containing status

        while (LCD_Stat & 0x80){        // Wait for busy flag to clear
                LCD_RW = 1;             // LCD RW needs to be high
                LCD_EN = 1;             // Strobe enable signal
                LCD_Stat = LCD_Dat;     // Read staus
                LCD_EN = 0;
                LCD_RW = 0;
        }
}

// Time delay for 2 x 20 LCD module (approximately 50ms)
void LCD_Delay()
{
        uint8_t i, j ;

        for (i=0;i!=100;i++)
        {
                for (j=0;j!=153;j++);
        }
}