摘要:介绍CF(Compact Flash)卡的特点;阐述CF卡的内部结构和工作原理;给出在一个数字音频系统中如何实现CF卡读写。
关键词:CF卡 结构寄存器 任务寄存器 EP7212
随着微电子技术的发展,各种数字设备,如掌上电脑、数字相机大量出现。为了使各种设备存储卡可以兼容,即一个设备存储卡可以用于另一个设备上,1995年各大厂商联合建立了CFA组织,制定CFA标准。CFA标准规定CF卡的电气标准、物理特性以及命令集。CF卡不仅包括闪存、磁介质、I/O设备,而且还包括网卡、调制解调器、传真机等。CF卡的外型目前有两种:TYPE I(3.3mm)和TYPE II(5mm),后者是为大容量存储卡和I/O设备而设计的。
1 SST48CF024的特点和工作原理
(1)特点
SST48CF024是SST公司生产的超小型、低功耗、闪存介质的CF卡,具有24MB存储空间,完全符合CFA标准,并且可以通过50~68脚适配器应用于PCMCIA接口。该卡内部包括256字节卡结构信息(CIS),内置微控制器和文件管理器,使得主机很容易实现对CF卡文件的存取。该卡同时还具备电源管理功能,具有正常、空闲和睡眠三种状态。
(2)引脚介绍
CF卡主要有三种工作模式:PC CARDI/O、PC CARD MEMORY和True IDE模式。PC CARD模式与PCMCIA标准兼容。TRUE IDE模式与ATA/ATAPI-4标准兼容。
三种模式下主要引脚定义如表1所列。
表1
| 引脚 | PC CARD I/O | PC CARD MEMORY | True IDE |
| A10~A0 | 地址线 | 同I/O | 仅A0~A2选择任务寄存器 |
| CE1,CE2 | 用于选择奇偶字节 | 同I/O | 用于选择任务寄存器,或者选择控制、状态寄存器 |
| D0~D15 | 数据线 | 同I/O | 同I/O |
| IORD | 未用 | I/O读信号 | 同MEMORY |
| IOWR | 未用 | I/O写信号 | 同MEMORY |
| OE | 读信号 | 读CIS寄存器 | 接地 |
| WE | 写信号 | 写结构寄存器 | VCC |
| REG | 0为特片寄存器 1为普通内存 | 在读写时应为低 | VCC |
| Reset | 高电平有效 | 同I/O | 低电平有效 |
| VCC | 3.3V | 同I/O | 同I/O |
| GND | 地 | 同I/O | 同I/O |
(3)三种模式的选择
当上电时,如果OE接地,则进入True IDE模式,在此模式下只可以存取任务寄存器。另外两种模式需要通过设备结构寄存器来选择。
(4)结构寄存器介绍
地址(A10~A0)0X200:结构选择寄存器
地址(A10~A0)0X202:结构状态寄存器
地址(A10~A0)0X206:卡拷贝寄存器
下面仅介绍结构选择寄存器:
| SReset | Leve1REQ | CONF5 | CONF4 | CONF3 | CONF2 | CONF1 | CONF0 |
Sreset:恢复位信号;
Leve1REQ:中断模式选择(电平或边沿触发);
CONF5~CONF0:见表2。
表2
| CONF5 | CONF4 | CONF3 | CONF2 | CONF1 | CONF0 | 模 式 |
| 0 | 0 | 0 | 0 | 0 | 0 | MEMORY |
| 0 | 0 | 0 | 0 | 0 | 1 | I/O模式,对应任意16个连续地址 |
| 0 | 0 | 0 | 0 | 1 | 0 | I/O模式,对应1F0~1F7H和3F6~3F7H |
| 0 | 0 | 0 | 0 | 1 | 1 | I/O模式,对应170~177H和376~377H |
(5)寄存器功能及地址分配
寄存器功能及地址分配(PC CARD MEMORY)
2 读写子程序的设计
每次执行CF卡命令前,都需要读取状态寄存器来确定当前CF卡所处状态。状态寄存器各位信息如表4所列。
表3
| -REG | A10 | A9~A4 | A3 | A2 | A1 | A0 | 偏移 | 读寄存器 | 写寄存器 |
| 1 | 0 | X | 0 | 0 | 0 | 0 | 0 | 数据寄存器偶字节 | 数据寄存器偶字节 |
| 1 | 0 | X | 0 | 0 | 0 | 1 | 1 | 错误寄存器 | 特征寄存器 |
| 1 | 0 | X | 0 | 0 | 1 | 0 | 2 | 扇区计数器 | 扇区计数器 |
| 1 | 0 | X | 0 | 0 | 1 | 1 | 3 | 扇区号寄存器 | 扇区号寄存器 |
| 1 | 0 | X | 0 | 1 | 0 | 0 | 4 | 柱面号寄存器(低字节) | 柱面号寄存器(低字节) |
| 1 | 0 | X | 0 | 1 | 0 | 1 | 5 | 柱面号寄存器(高字节) | 柱面号寄存器(高字节) |
| 1 | 0 | X | 0 | 1 | 1 | 0 | 6 | 驱动器/磁头寄存器 | 驱动器/磁头寄存器 |
| 1 | 0 | X | 0 | 1 | 1 | 1 | 7 | 状态寄存器 | 命令寄存器 |
| 1 | 0 | X | 1 | 0 | 0 | 0 | 8 | 数据寄存器偶字节 | 数据寄存器偶字节 |
| 1 | 0 | X | 1 | 0 | 0 | 1 | 9 | 数据寄存器奇字节 | 数据寄存器奇字节 |
| 1 | 0 | X | 1 | 1 | 0 | 1 | D | 错误寄存器 | 特征寄存器 |
| 1 | 0 | X | 1 | 1 | 1 | 0 | E | 辅助状态寄存器 | 设备控制寄存器 |
| 1 | 0 | X | 1 | 1 | 1 | 1 | F | 卡地址寄存器 | 保留 |
| 1 | 1 | X | X | X | X | 0 | 8 | 数据寄存器偶字节 | 数据寄存器偶字节 |
| 1 | 1 | X | X | X | X | 1 | 9 | 数据寄存器奇字节 | 数据寄存器奇字节 |
表4
| 符 号 | 位 | 描述 | 真值 |
| BSY | 7 | 控制器忙否 | 1 |
| DRDY | 6 | 驱动器就绪 | 1 |
| DWF | 5 | 驱动器故障 | 1 |
| DSC | 4 | 寻道结束 | 1 |
| DRQ | 3 | 服务请求 | 1 |
| CORR | 2 | ECC检验错误 | 1 |
| IDX | 1 | 收到索引 | 1 |
| ERR | 0 | 命令执行出错 | 1 |
①状态寄存器D7位为0,表示控制空闲;D6、D4均为1,表示CF卡准备好接收下一条指令,否则,控制器不能接收下一条命令。
②寄存器命令块读写操作设计的8个寄存器组成1个命令块寄存器。执行命令前,程序要写7个寄存器,其中前6个为参数,最后1个为命令码。扇区计器中的数值表示待传送扇区的数目,每传送一个扇区,其值自动减一。扇区号寄存器存放的是物理扇区号,柱面寄存器存放的物理柱面号,驱动器/磁头寄存器中存放的是磁头号。读写控制命令有读扇区,命令码为20~21H;写扇区,命令码为30~31H。
③由于数据寄存器为16位,因此读写一个扇区,只需要连续执行256次访问数据端口的操作。需要注意的是:CE1=0、CE2=0,存取的是一个字;CE1=0、CE2=1,存取的是一个字节。连续存取字节两次则依次存取数据寄存器偶字节和寄字节。
④执行命令后,需查看状态寄存器D0位。若D0位为0,则表示命令执行成功;若失败,相应错误原因可在错误寄存器中查出。
3 CF卡的应用
EP7212是CIRRUS LOGIC公司生产的支持MP3格式的数字音频解码的微处理器。它采用ARM7TDMI CPU核,时钟速率高达74MHz;它内含DRAM、FLASH、LCD、串口和数字音频接口。这些特征使得开发者容易实现MP3文件的解码和播放。本例中利用CF卡存储MP3,硬件连接框图如图1所示。
(1)CPLD逻辑关系采用VHDL语言实现
OE <=NCS3 OR NRD;
WE <=NCS3 OR NWR;
CE1 <=A0 AND (NOT WORD);
CE2 <=(NOT A11)AND (NOT WORD);
REG <=A11;
(2)软件实现
首先,配置结构寄存器,设为MEMORY模式。然后,各个任务寄存器设定参数。最后,将命令写入命令寄存器,执行操作。下面的代码段实现将CF卡第一个扇区全部写入0XAAAA。
LDR R0,=0X30000200; //结构寄存器地址A11=1
LDR R1,=0;
STRB R1,[R0]; //设置为MEMORY方式
LDR R0,=0X30000800; //初始化地址,A11=1
LDR R2,=0X80; //检测忙信号
LDR R3,=0XAAAA; //测试数据
LDR R1,=1; //传输扇区数目。此处是1个扇区大小
STRB R1,[R0,#2];
LDR R1,=0; //起始扇区号
STRB R1,[R0,#3];
LDR R1,=0; //柱面低8位地址
STRB R1,[R0,#4];
LDR R1,=0; //柱面高8位地址
STRB R1,[R0,#5];
LDR R1,=0XE0; //磁道数
STRB R1,[R0,#6];
LDR R1,=0X30; //写扇区命令
STRB R1[R0,#7];
WAIT
LDRB R1,[R0,#7]; //读状态信号,检测是否忙。
//若忙,在此循环
TST R1,R2;
BNE WAIT
LDR R4,=0; //初值
LDR R5,=0X100; //写256个字,512个字节。
WRITE
STR R6,[R0];
ADD R5,R5,#1;
CMP R5,R4;
BNE WRITE; //向缓冲写512个字节
由于篇幅有限,本文仅给出MEMORY模式实现的方法,其它两种模式实现与MEMORY相似。由于CF卡具有易于携带、兼容性好、容量大的特点,可以预见,它必将在更广阔的领域得到应用。