CF卡在手机测试系统中的应用_嵌入式系统论文
关键词:闪存 cf卡 手机测试系统
引言
目前,手机作为日常生活中一种重要的通信工具,越来越受到人们的关注。它的最大特性就是方便易携带。那么,如何保证手机在不同地理位置的条件下仍然具有优质的网络服务,进而保证其通话质量,成为移动通信部门的一种研究课题。为此,需要一种设备能够测试出手机处于不同位置,不同时间的各种网络参数来加以分析,即“便携式手机测试记录仪”。它能够将手机的各种网络数据从手机串口传送到存储设备;存储设备将数据存储下来,达到一定数目,再通过串行上载到pc机;在pc机上利用分析软件来进行数据分析,从而达到测试的目的。在此测试过程中,由于系统要求处理大量的数据,一般的存储器如eeprom等很难达到要求,同时,系统要求数据在旧电时不丢失,即要求数据存储的非易失性,因此不能使用易失性的存储器如sram、sdram等。为此,在系统中采用了一种新型存储装置,即cf卡(compact flash card)。
1 cf卡简介
flash存储器是近年来发展迅速的一种存储器,属于非挥发性内存(non-volatile,即断电数据也能保存)。它具有eeprom电擦除的特点,还具有低功耗、密度高、体积小、可靠性高、可擦除、可重写、可重复编程等优点。单片机的flash memory芯片容量有限,同时接口逻辑比较特殊,在大数据量场合使用会使得控制逻辑较为繁琐。集成了多片flash存储器和外部接口、控制机构和协议的cf卡,可以提供相当可观的存储容量和标准的电气接口协议,可以满足本系统对于数据处理的要求。其内部结构如图1所示。
cf卡的在很小的体积内集成了控制装置、flash memory阵列和读写缓冲区。实际上,控制装置起到了种协议转换的作用,将对flash memory的读写转化成对ata协议控制器的访问。cf卡对于缓冲区的设计使用了一种比缓冲结构,使得外部设备和cf卡通信的同时,cf卡的片内mcu可以对flash memory阵列进行读写。这种设计可以增加cf卡数据读写的可靠性,同时提高数据通讯的速率。在实际系统中,cf卡选用了sst公司的sst48cf096,容量达到了96mb,封装为25×2的双列插座,其工作电压为+5v/+3.3v,传输速率最大可达20mb/s,低功耗30ma/50ma(3.3v/5v)。其典型 应用电路如图2所示。
cf卡的主要功能引脚为数据线d0~d15,地址线a0~a9,片选及数据选择cs1、cs0,读写控制端ata sel、we,寄存器选择reg,卡读写忙判断intrq、reset等。数据线d0~d15用于数据的读写。cf可以工作于16位数据总线方式也可以工作于8位总线方式。读写速度上的要求不是很严格的情况下,为了方便和8位mcu的接口,一般选择为8位数据总线工作方式。若选择8位工作方式,cs1应接固定高电平,cs0低电平有效。cf卡在memory工作方式下,仅地址线a0~a3起作用,用于选择读写端口,其余地址线可以接固定电平。reg用于选择是对cf卡进行命令、状态读写还是读写cf卡的属性寄存器。reg=1时读写命令。在memory方式下,对cf的控制和数据读写均是通过对这几个端口的读写来实现的。inirq用于判断cf卡是否处于读写忙状态。出于严谨性可以在对cf卡进行读写之前利用此引脚判断cf卡是否空闲。在数据读写量较小的情况下,使用一定的延时即可。
图2中96mb的cf卡工作于memory方式,8位数据总线,接口的主控mcu的89c52。单片机按标准的p2、p0口复用方式与cf卡接口。cs0~cs1、reg分别接单片机的p2.6、p2.5、p2.7,端口选择a3~a0接收经373锁存的低4位地址,cf卡的读写引脚分别与单片机的读写信号相接。若把闲置地址引脚接固定电平,则系统分配给cf卡的端口地址为[b000]~[b007]。intrq(即bsy/rdy)脚接到单片机的p1.7。
2 系统方案
2.1 硬件实现
系统采用模块化设计,由电源控制单元(pu)、单片机控制单元、地址锁存单元、数据缓冲单元以及存储单元(cf卡)构成,如图3所示。测试过程中,首先由单片机发送相关命令参数给手机,手机接收到命令后,经由串口输出网络数据。单片机将收到的数据通过缓冲器再送至cf卡。数据采集完毕后,将cf卡中的数据上传至pc机,利用上位机分析软件来进行网络分析。在实际系统中,mcu选用的是at89c52、由于单片机的p0口和p2口采用了引脚复用,所以需要一片地址锁存,地址锁存器选用的是74hc373、cf卡的一次读写操作必须是512字节,而89c52只有256字节的内部ram,需要在外部扩展一片缓冲器,缓冲器选用的是6116、由于系统是由手机电池统一供电,手机电池输出电压为+3.6v,而上述芯片的正常工作电压为+5v,因此,需要升压芯片作为电源模块,选用的是max756。
2.2 软件实现
2.2.1 cf卡的读写操作
cf卡采取的是类似硬盘的分块存储方式,分为柱面cylinder、头head和扇区sector管理。对96mb的cf卡而言,共有733个柱面,每个柱面8个头,每个头32个扇区,每个扇区512字节(8位)。cf卡的读写是以一个扇区为基本单位的,在读写一个扇区之前先送出当前需要读写的柱面、头和扇区,然后发送读写命令,一个扇区的512字节需要一次性连续写入或者读出。下面给出对cf卡进行读和写c51程序段:
#define dataport xbyte[0xb800]
#define feature xbyte[0xb801]
#define seccount xbyte[0xb802]
#define secno xbyte[0xb803]
#define cyllow xbyte[0xb804]
#define cylhigh xbyte[0xb805]
#define cardhead xbyte[0xb806]
#define command xbyte[0xb807] //定义cf卡端口
void nextsector(){ //读写下一个扇区
sector++;
if(sector= =32){//一个头的扇区是否全部读写完毕
sector=0;
head++;
if(head= =16){//一个柱面的所有头是否全部读写完毕
head=0;
cylinder++;
if(cylinder= =733){//所有柱面是否全部读写完毕
cylinder--;
diskfull=1;{//标志位置1,表示cf卡容易已满读写过程结束
}
}
}
}
cardhead=0xa0+head; //置当前头
seccount=0x01; /*一次读写一个扇区
secno=sector; //置当前扇区
cyllow=cylinder%255; //置柱面高位
cylhigh=cylinder/255; //置柱面低位
command=????; //读/写扇区命令,读为0x20,写为0x30
delay(1); //延时1ms
//写操作为:
for(i=1;i<=512;i++){
dataport=mem[0xe800+i]; //写512字节
}
nextsector(); //为写下一个扇区作准备读操作为:
for(i=1;i<=512;i++){
mem[0xe800+i]=dataport; //读512字节
}
nextsector(); //为读下一个扇区作准备
2.2.2 缓冲区的操作
由于cf卡必须以扇区(512字节)为基本单位来进行读写操作,因此,系统需要扩展一片6116作为写缓冲区(地址口为0xe800开始)。系统在平时将收到的测试数据暂存于写缓冲区中。当接收到的数据累计超过一个扇区之后,再传送至ce卡。在实际系统中,开辟了1k的缓冲区,通过一个标志位low和缓冲区指针count来联合确定传送数据的范围。
①low=0,count=0。
|
②low=0,count<=512、开始写缓冲区的有512字节,每写入一个字节,缓冲区指针自动加1。
③low=1,count>=512、当缓冲区指针大于512,表示前512字节已被填满,此时将low置为1,开将缓冲区前512个字节的内容送入cf卡,标志位由0变为1。
④low=1,count<=512。当缓冲区指针指到1024时,缓冲区指针清0,重新开始计数。此时将后512字节的内容送入cf卡,标志位由1变为0。
⑤low=0,count<=512。下一次循环过程开始。
由于向cf卡写入数据的同时,手机端仍然有数据输出。为了防止在写cf卡的过程中出现数据丢失现象,单片机手同端的通信采用串行口中断方式。程序如下:
void single() interrupt 4 using 2//串行口中断服务子程序,中断号为4
{
if(ri= =1){ //判断是否为单行口输入引起的中断
mem[0xe800+count]=sbuf; //将串行数据缓冲器中的数据送至数据缓冲区
count++; //缓冲区指针自动加1
if(count= =1024){ //如果缓冲区指针指向1024,则清0,重新计数
count=0;
}
ri=0; //串行口接收中断请求标志位清0
}
else if(ti= =1){ //判断是否为串行口输出引起中断
ti=0; //串行口发送中断请求标志位清0
}
}
本文以移动通信的手机测试系统的背景,介绍了cf卡在手机测试系统中的具体应用,包括其硬件开发和软件实现。由于cf卡具高传输速率,大容量非易失性固态盘,掉电数据不丢失,良好的震性能,宽温工作范围与所有数码相机、便携式pc、数字式音频播放器及其它具有compact flash插槽的设备兼容等特点,它的应用范围也将越来越广泛。