应用笔记 4036

利用DS8007评估套件进行设计


摘要 : 本文阐述使用DS8007双智能卡接口评估(EV)套件的步骤,解释了怎样安装和配置软件、配置硬件,建立并装载板上DS5002FP微控制器执行的应用软件。提供了一个简单的\"Hello World\"实例,以及几个C程序函数,以演示板上LCD模块的使用。

简介

DS8007评估(EV)套件DS8007双智能卡接口评估提供方便、成熟的平台。DS8007是混合信号外设,管理微控制器和两个独立智能卡之间的所有接口。

DS8007评估套件包括DS8007和DS5002FP安全微控制器,通过对其编程可提供完整的智能卡接口。它还提供两个智能卡插槽:一个用于标准信用卡和支付卡,一个用于用户识别模块(SIM)。DS8007评估板如图1所示。本文阐述该评估套件的使用步骤,如何开发并运行应用软件代码。

图1. DS8007评估板
图1. DS8007评估板

DS8007为两个独立的智能卡和微控制器的物理连接提供所有必须的电信号。该器件包括一个专用内部序列发生器,控制卡自动激活和禁止,还含有用于数据通信的ISO UART。此外,DS8007的电荷泵和电压稳压器使其能够工作在2.7V至6.0V电压,并提供两路独立的智能卡供电电压,每一路都可以是1.8V、3.0V或者5.0V。标准并行8位总线以复用或非复用配置实现与微控制器的通信。

软件设置

本应用笔记中,应该在计算机上安装并运行Dallas Semiconductor的微控制器工具套件(MTK)和Keil公司的PK51专业开发工具软件。两个软件包都含在DS8007评估套件中。下面的章节说明安装这些应用软件的步骤。如果您已经在计算机上安装了这些应用软件,那么可以略过说明安装过程的这些章节。

安装微控制器工具套件

  1. 将DS8007评估套件安装CD插入到计算机的CD-ROM驱动器中。CD将自动启动,显示DS8007评估套件欢迎界面。如果CD-ROM没有自动启动,请浏览CD根目录文件夹,双击index.html文件。
  2. 单击"Install MTK"按钮,单击"Run"按钮,开始安装。
  3. 在MTK安装期间,选择默认设置。注意:可能会出现安全报警,这取决于您的网络浏览器安全设置以及您的Windows®版本。如果的确出现了报警,接受它,继续安装。

安装Keil专业开发工具

  1. 安装Keil公司的PK51专业开发工具套件时,将Keil微控制器开发工具CD (含在DS8007评估套件中)插入到您计算机的CD-ROM驱动器中。CD会自动启动,显示主菜单。如果CD-ROM没有自动启动,请浏览CD根目录文件夹,双击setup.exe文件。
  2. 在主菜单上,选择"Install Evaluation Software",然后选择"C51 Compiler (Eval Tools)"。
  3. 按照屏幕显示的提示,在计算机上安装Keil工具。

硬件设置

配置DS8007评估套件电路板时,需要正确设置跳线,将串口和计算机相连,并连接电源。下面详细说明这些步骤。

  1. 按照图2,连接跳接器1到13,其详细说明在表1中。
  2. 将所提供的串行电缆的一端连接至电路板DB-9连接器(J6),另一端连接至计算机的COM口。
  3. 将评估套件中的5V ±5%、300mA稳压电源的2.5mm中心正极电源连接至电路板的J7电源连接器。

    图2. DS8007电路板跳线位置
    图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)

建立并装载可执行文件

下一步是建立.HEX文件,它可以下载到电路板存储器中,由DS5002FP运行。建立该文件需要配置Keil µVision®工程文件,以建立正确的可装载文件,然后将其下载到电路板的非易失存储器中。

建立µVision工程

在计算机上安装了Keil C51开发工具后,单击生成的图标,启动µVision程序。我们将按照以下步骤为演示程序建立一个工程文件和C程序文件:
  1. 在工程标题栏,选择"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"消息出现时,单击"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. 右键单击工程工作空间窗口中的Target 1,将该文件加到工程列表中,然后单击"Manage Components"选项。在Project Components标签下,单击"Add Files"按钮,在文件名区输入文件名(DS8007-1.c)。单击"Add"按钮,然后单击"Close"按钮。单击"OK"按钮,关闭Components窗口。您会看到该文件已经被加入到Source Group 1中。
  7. 右键单击工程工作空间中的Target 1,选择"Options for Target 'Target 1",配置工程选项。单击Target标签,在Xtal框中输入14.7。如下面的图3所示,Memory Model选择"Small: variables in DATA",Code ROM Size选择"Large: 64K program",Operating system选择"None"。该窗口中的所有其他选项不进行设置,为默认状态。
  8. 在Output标签中,选中"Create Executable" (如果还没有选它),确定选中了"Create HEX File"框。从下拉选择框中选择HEX Format of HEX-80,如图4所示。该窗口中的所有其他选项都应保持默认状态。单击"OK",关闭'Target 1'窗口的Options for Target。
  9. 单击"File",然后是"Save All",保存工程文件。
  10. 单击"Project"标题栏,选择"Rebuild All Target Files",建立可执行文件。屏幕底部的构建窗口应显示0 Error(s), 0 Warning(s)。如果没有这一显示,则应该找到错误,进行必要的改正。重复该步骤,直到不再报告错误为止。
图3. 工程选项目标标签设置
图3. 工程选项目标标签设置

图4. 工程选项输出标签设置
图4. 工程选项输出标签设置

装载可执行文件

按照上述步骤对硬件进行配置后,DS8007电路板将连接到计算机的COM口。现在应对处理器进行配置,使其能够知道怎样访问板上存储器。向处理器的MCON和RPCTL寄存器写入对应的数值可完成该任务,按下面步骤进行。
  1. 在您的计算机上找到MTK程序,启动它。
  2. 在Select Device窗口中选择"DS5002FP" (图5),单击"OK"。
  3. 单击"Options",然后单击"Configure Serial Port"。选择DS8007电路板所要连接的计算机端口,例如COM1。然后,从下拉菜单中选择"Speed 38400",单击"OK"。
  4. 单击"Target",单击"Open COM1 at 38400 baud"。
  5. 确定电路板的串口已经和计算机建立了连接,并加载了5V电源。单击"Target"和"Connect to Loader"。如果连接成功,DS5002FP将显示其启动加载程序标志,如图6所示。
  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"错误消息,说明该部分有自己的安全锁定设置。要对该部分进行解锁,在加载程序提示符 >下输入解锁命令(U)即可。这样做会破坏存储在处理器存储器中的信息,但是该部分解锁后,可以输入上面的寄存器命令。发出读寄存器命令(> R)后,DS5002FP报告寄存器MCON (0A)和RPCTL (81)的状态。DS5002FP还显示MSL位的状态(参见安全微控制器用户指南(English only),了解详细信息),该例中为01。
DS8007电路板现在可以装入Keil开发工具建立的编程文件。
  1. 单击"File",然后选择"Load SRAM"。选择文件DS8007-1.HEX,然后单击"OPEN"。DS5002FP处理器的响应是: > Loading File ...\DS8007-1.hex
    > Loading File ...\DS8007-1.hex
    
    通过显示一连串的圆点表示正在装载。
  2. 完成后,处理器将报告"Load complete",单击"Target",然后单击"Disconnect from Loader",执行程序。
执行装载程序后立即断开,处理器将开始运行程序。MTK屏幕显示程序输出 "Hello DS8007 World!",成功!

图5. MTK器件选择
图5. MTK器件选择

图6. DS5002FP启动加载程序标志
图6. DS5002FP启动加载程序标志

评估LCD模块

为演示DS8007评估套件非常有用的一项功能,我们现在建立一个应用程序,在2行20字符的液晶显示屏(LCD)上显示一条消息。但是在开始前,必须设置LCD的对比度,使其在程序执行时能够正确地显示消息。首先,对电路板加电,LCD应不亮。找到电路板上的可变电阻R7 (参见上面的图2),使用小螺丝刀对电阻进行调整,直到一个5 x 7点阵出现在显示屏的字符位置。慢慢调整R7,直到点阵刚刚消失。这设置LCD的对比度,使我们能够看到字符,而看不到间隔。

按照上面的第1步到第10步(建立µVision工程),建立一个新工程和可执行文件。工程文件名为DS8007-2,C源代码文件名为DS8007-2.c。该程序的源代码在下面的附录A中给出。如果您不愿意输入这些信息,也可以从上面提到的FTP网站下载这些文件的.ZIP文件。

一旦建立了HEX文件,按照上面的步骤(装入可执行文件)将其装入到电路板的存储器中。和加载程序断开后,LCD将显示两行消息。

结论

DS8007评估套件为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++);
        }
}