摘要:本文介绍了CF(Compact Flash)卡的基本结构和工作原理。在此基础上详细的给出了在C8051F34x-DK开发平台上,通过串口发送ATA命令和非ATA命令来控制C8051F340单片机,对CF卡等PC卡的各项特征信息(如:扇区总数、柱面数、磁头数、每磁道扇区数、序列号等)和功能(在三种模式下的CF卡8位/16位的读,写,连续读,连续写等)进行一系列测试的一个通用测试系统的设计方案。文中详细介绍了True IDE模式下写CF卡一个扇区的具体实现过程,并给出了相应的程序以及系统的运行结果。 关键字:CF卡;C8051;串口;ATA命令;测试系统
随着计算机应用技术的飞速发展,移动存储设备得到了广泛的应用。其中CF(Compact Flash)卡以其价格低廉、体积小、存储容量大、高速等优点在众多移动存储设备中被广泛地应用于数码相机、PDA和笔记本电脑等当前十分热门的消费类电子产品中。本文所述的就是一个通用的CF卡等基于PCMCIA规范的PC卡的测试系统。该系统可以在底层读取CF的各种信息以及检测CF卡在各种工作模式下对各种命令的执行情况,可用于开发大容量的CF卡等PC卡,还可以在此基础之上开发出基于CF卡的存储设备以及CF卡的适配器等。
1.CF卡的简介
CF卡最先是由SanDisk公司在1994年推出的,现在已经成为一种行业标准。其内部示意图如图1所示。CF卡由两个基本部分组成:控制芯片和闪存模组。闪存用于存储信息,控制芯片用来实现与主机的连接及控制数据在闪存模块中的传输。CF卡的主要特点:体积小,重量轻;支持5V/3V双重电压;给予块擦除技术设计,每次读写为一个扇区;内置控制器,大大简化了外围电路的设计;速度快,最新的3.0规范主持66MB/s的访问速率;符合标准规范,无兼容性问题;固态产品,无可移动部件,可靠性好。目前最大可提供12GB容量,而主流产品容量已达到4GB,可以满足不同容量的需求[1]。

图1 CF卡内部结构示意图
2.系统的设计
我们的这套测试系统是在silicon公司的C8051F34X-DK集成开发环境下开发的。图2是测试系统的示意图。图中的主机是一台安装了Microsoft Windows XP Professional 2002 SP2操作系统的PC机,C8051F34X-DK集成开发环境包括包括了一个C8051F340-TB目标板和一个USB的调试适配器[2]。
在本系统中,由PC机通过串口发送命令控制C8051单片机对CF卡在Memory模式,I/O模式,True IDE模式这三种模式下进行功能及参数的测试:其中主要的测试包括读取CIS,在这三种模式下分别进行低级格式化,高级格式化,数据寄存器的奇偶位转换检测,只通高位的检测等;测试的方式有,循环测试,自动测试,单独测试,重点测试;测试的手段有,只给命令,读状态,写数据,读数据。CF卡的返回的状态信息通过单片机由PC机的界面显示。C8051F34x-DK集成开发环境的目标板通过IDE模式接口、I/O模式接口、Memory模式接口与CF卡连接。PC机与C8051F34x-DK集成开发环境有2个接口:①集成开发环境的目标板通过USB调试适配器与PC相连.②目标板的RS232接口与PC机的串口相连。
图2 测试系统的示意图
CF卡上电时, OE接低电平进入True IDE模式,接高电平时可通过配置属性寄存器选择进入Memory模式或I/O模式。图3是True IDE模式下C8051F340与CF卡的连接示意图。其中P0.0和P0.1接CF卡寄存器组选择信号线CS0和CS1,P0.2和P0.3接数据的读写线IORD和IOWR,P01.0-P1.2与地址线DA0-DA2相连,P2.4接复位线(RESET) P2.5接中断信号请求线(INTRQ),P3.0-P4.7和CF卡的16根数据线相连。CF卡在三种工作方式对应的管脚功能略有不用,由于篇幅的关系,Memory模式或I/O模式下的硬件连接就不一一叙述了。

图3 True IDE模式下C8051F340与CF卡的连接图
3.程序的设计
3.1串口调试
· 端口初始化配置
数字和模拟资源可以通过40个I/O端口使用,每个端口引脚都可以被定义为通用I/O(GPIO)或模拟输入。优先权交叉开关译码器为每个I/O功能分配优先权,UART0的优先权最高,TX0被分配到P0.4脚,RX0被分配到P0.5脚。在这里,我们开启UART,并使交叉开关使能。因此端口的初始化配置为:XBR0=0x01;XBR1=0x40。
·晶振的配置
我们使用内部的高频振荡器,它的基频为12MHZ,与内部4倍时钟乘法器可得到48MHZ的系统时钟。内部振荡器可以通过OSCICL寄存器控制。4倍时钟乘法器用CLKMUL寄存器配置。
int i = 0;
OSCICN = 0x83;
CLKMUL = 0x80;
for (i = 0; i < 20; i++);
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x03;
·定时器的配置
我们使用定时器1它是一个16位的寄存器,在被访问时以2个字节的形式出现:一个高字节TH1和一个低字节TL1。定时器1配置为具有自动重新装入计数初值能力的8位计数器/定时器。定时器初始配置为:TCON=0x04;TMOD=0x02;CKCON=0x08;TH1=0x30。
·UART0的初始化
我们用8位可变波特率标准异步全双工通信,它包括8个数据位,1个起始位,1个停止位,无奇偶校验位。数据由TX0发送,RX0接收。由2个寄存器SCON0和SBUF0控制。SBUF0为2个寄存器:发送缓冲寄存器和接收缓冲寄存器。写操作只能将数据写到发送缓冲器上;读操作只能读取到接收缓冲器上。在这里我们设置波特率为115200bps。初始化为SCONO=0x10。
3.2程序流程
由于篇幅的限制,下面我们将以CF卡在True IDE模式下读/ 写扇区指令为例,对相关程序进行说明并给出了程序运行的结果。
对CF卡的操作只需读写任务寄存器即可。CF卡共有30条指令,数据读写的最小单位为1个扇区。8位格式访问时对应1个扇区数据量为512字节,16位格式访问是对应1个扇区数据量为256字节。由于CE2 = 1 ,所以当CE1 = 0 时,以8位格式访问CF卡, 每次存取的是一个字节。连续存取字节两次则依次存取数据寄存器的偶字节和奇字节。在向CF卡发出命令前,必须先检测CF卡是否忙碌(D7=1)。如果在规定时间内CF卡一直忙碌,则置超时错;否则表示CF卡空闲,可接受命令。
如果CPU要对CF卡写数据,首先CPU把必要的参数写入对应的地址寄存器,等待DRDY有效;然后将操作码写入命令寄存器,同时设置状态寄存器的DRQ位,表示准备好接收数据,CPU通过数据寄存器将数据写入扇区缓冲区;当扇区缓冲区填满后,驱动器清除DRQ位,并置位BSY,将扇区缓冲区中数据写入CF卡;当写结束,清除BSY位,发中断请求信号DNTRQ;CPU接收到中断信号后,读状态寄存器,同时将中断信号INTRQ撤除。图4就是True IDE模式下写CF卡一个扇区的流程图

图4 True IDE模式下写CF卡一个扇区的流程图
CF 卡写扇区函数部分源代码:
void CF_TEST(char order)
{
data int i;
data BYTE status;
data BYTE error;
code BYTE write[512]={0,1,1,2,3,4,5,6,7,9,10};
Init();
do
{
status = ReadReg (7);//读取状态字
if (status & 1 == 1) // ERR=1,置出错标志,做相应处理
{
error = ReadReg(1);
}
} while (status != 0x50);//等待CF卡准备好
WriteReg(2, 0x01);//写入要写入的扇区数
WriteReg(3, 0x24);//写入LBA地址
WriteReg(4, 0x00);
WriteReg(5, 0x00);
WriteReg(6, 0xE0);
WriteReg(7, 0x30);// 写入写命令
do
{ status = ReadReg(7);
if (status & 1 == 1) // ERR=1,置出错标志,做相应处理
{
error = ReadReg(1);
}
} while (status != 0x58);
for (i = 0; i < 512; i++)
{
WriteReg(0,write[i]); //写入数据
}
}
所有的程序在Keil C51 7.0上调试通过,我们把程序烧录进单片机再通过PC机发送命令给单片机,对分别工作在三种模式下的CF卡进行了8位/16位的读,写,连续读,连续写,读取CIS等几十个ATA和非ATA命令的操作,单片机操作CF卡的上位机软件采用从C++builder 6.0编写。用户的操作非常简单。图5是PC机上显示的被测CF卡的有关信息。图6是对扇区1的写操作框图。

图5 PC机上显示的被测CF卡的有关信息

图6对扇区1的写操作框图
4.结束语
经过一段时间的调试,这个系统运行稳定,非常满足我们的设计要求。目前,已有一个开发小组将我们设计的这个测试系统运用到他们对一个基于PCMCIA规范的大容量的闪存卡的开发中,收到了很好的效果。
参考文献:
[1]CF+ and Compact Flash Specification Revision 3.0,2004
[2]http://www.silabs.com/public/documents/tpub_doc/evbdsheet/Microcontrollers/USB/en/C8051F34x-DK. pdf
[3]ATA7 Specification (ANSI 397-2005)
[4]Using SanDisk Flash ATA Components with an 80C51 Microcontroller Application Note ,2004.
[5]潘琢金. C8051F高速SOC单片机原理及应用[M] . 北京:北京航空航天大学出版社,2002.
[6]李昊,王跃科,周睿,潘仲明.CF卡在大容量数据存储系统的典型应用[J].微计算机信息,2005,11-1:66-68
[7]王国章,刘战.一种新的硬件设计方法-结构化ASIC技术[J].微计算机信息,2006,2:161- 163
[8]张治斌,乔应旭.SST89C54 与CF 卡的接口设计与实现[J].国外电子元器件,2006,9:30-32
|