1、1 基于 AT89S52 和 FAT16 的 SD 卡读写系统设计 (1) 2009-09-23 10:44:10 作者:张恒 来源 :单片机与嵌入式系统 关键字: AT89S52 SD 卡 SPI 总线 引 言 长期以来,闪存卡 (SD 卡、 MMC 卡等 )因其体积小、功耗低、容量大和非易失性等特点,在嵌入式存储领域的应用越来越广泛。特别是近年来,随着闪存技术的发展,闪存卡价格不断下降且存储容量不断提高。当数据采集系统需要长 时间地采集和记录海量数据时,应用SD 卡作为存储介质是很好的选择,例如电能检测、温度湿度检测、病人心肺数据记录等。FAT16 文件系统是。 Microsoft 公司在
2、其 MS-DOS 操作系统中采用的文件系统,具有出色的文件管理性能,能被当前大多数操作系统识别。因此,将 SD 卡 与 FAT16 文件系统相结合是嵌入式数据存储、记录系统的理想方案, 可以将采集记录的数据直接在 PC 上读取和处理。本文研究和设计了基于 AT89S52 单片机和 FAT16 文件系统的 SD 卡读写系统。 1 系统方案介绍 本系统采用 MCS-51 架构的 AT89S52 单片机。 AT89S52 是一种低成本、 低功耗 、高性能的 CMOS 8 位微控制器,具有 8 KB 在系统可编程 Flash 存储器。应用 AT89S52 读写 SD卡,首先要确定它们之间的通信方案。
3、SD 卡有 2 种可选的通信协议: SD 模式和 SPI 模式。 SD 模式是 SD 卡的标准读写方式,选用此模式需要选择带 SD 卡控制接口的 MCU 或者额外的 SD 卡控制单元; SPI 模式通过 SPI 总线 完成 SD 卡与主控制器的通信。 AT89S52 没有集成 SD 卡控制器,为了不增加额外的 SD 卡控制单元硬件成本,本设计方案采用 SD 卡的 SPI通信模式。虽然 AT89S52 也没有集成 SPI 接口模块,但可以用软件的方式模拟 SPI 接口时序。 另外一个要解决的问题是 SD 卡与 AT89S52 的电平匹配。 SD 卡的逻辑电平相当于 3 3 V 的 TTL 电平标
4、准, AT89S52 的逻辑电平为 5 V CMOS 电平。 解决电平匹配问题的原则有 2 条:一为输出电平器件输出的高电平的最小值,应该大于接收电平器件识别为高电平的最低电压值;另 一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。 考虑到 SsD 卡在 SPI 工作模式下,数据的传输都是单向的,这样可以在单片机向 SD 卡传输数据时采用晶体管加下拉电阻的方法,基本电路如图 1 所示。而在 SD 卡向单片机传输数据时可以采用直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。这个方案需要双电源供电, 1 个 5 V 电源, 1 个 3
5、3 V 电源。 2 2 AT89S52 与 SD 卡接口电路设计 2 1 SD 卡接口规范 SD 卡工作在 2 7 3 6 V 电压下,图 2 是普通 SD 卡的结构示意图和引脚排列图,表1 列出了各引脚在 SPI 模式下的定义和功能描述。主机与 SD 卡之间通过指令来实现交互。 3 2 2 接口电路设计 AT89S52 内有 256 字节的 RAM,由于 SD 卡数据的读出与写入是以块为单位的,而每块为 512 字节,所以需要在单片机的最小系 统上扩展 1 片 RAM。本系统选用的 RAM 芯片为 HM62256,容量 32KB。系统硬件电路如图 3 所示。 4 3 软件设计 3 1 FAT
6、16 文件系统 FAT16 文件系统的存储结构如图 4 所示。 5 主引导记录区 (Main BootRecord, MBR)位于物理磁盘第零扇区。 MBR 中有硬盘分区记录表 (Disk Partition Table, DPT), DPT 记录了各逻辑分区的相对偏移。 SD 卡不支持多分区,在 1 个 SD 卡中只有 1 个分区,因此在 SD 卡上的 DPT 只有 1 个分区表项被占用。系统引导记录区 (DOS Boot Record, DBR)位于磁盘逻辑分区的第 0 扇区,是操作系统可以访问的第 1个扇区,它其中包含 1 个称为 BPB(Bios Parameter Block)的本分
7、区参数记录表。 BPB 记录着本分区的根目录大小、 FAT、个数、磁盘介质描述、分配单元大小等重要参数。 DBR 之后是 FAT(File Allocation Table,文件分配记录表 ),记录文件在磁盘上的存储位置。在 Windows 系统中,文件存储的单位是簇而不是字节, 1 个文件不是连续地存放于磁盘的某一区域,而往往分成若干段,像链子一样存放。 FAT 表记录了每个文件的起始簇 号、后继簇号和终止簇号。 FAT 表中的每个表项对应数据存储区中的 1 个簇,由于 FAT 表对文件管理的重要性, FAT 表有 1 个备份。 DIR 是根目录区,紧接着第 2 个 FAT 表 (FAT2)
8、之后,记录着根目录下每个文件的起始簇号、大小等属性。操作系统根据 DIR 中文件的起始簇号和大小,结合 FAT 表来定位文件。FAT16 文件系统中 1 个文件的存储示意图如图 5 所示。 6 3 2 SD 卡指令规范 单片机通过相应指令与 SD 卡进行交互。 SD 卡有特定的指令格式,都是 6 字节长,最高有效位 (MSB)传输优先,如图 6 所示。 SD 卡指令的最高 2 位 “01”是 SD 卡指令的开始标志,最后 1 位 “1”是结束标志。 6 位的指令是 SD 卡的指令序号,例如 CMD17 的 6 位指令即 17 的二进制表示 010001。指令参数占 4 字节,具体内容参照 SD
9、 卡规范。 7 位 CRC 校检的生成多项式为 G(x)=x7+x3+1。事实上 SD 卡在进入 SPI 模式后,不再通过 CRC 码来确认指令的传输正确与否,指令中的 7 为CRC 校检,只在 SD 模式下起作用。因此仅 SD 卡上电后的第 1 条切换 SPI 模式指令 CMd0 需要校检码,而此校检码是固定的 0x95,其他指令的 CRC 均置 1 即可。 SD 卡响应有 4 种格式,不同指令对应不同 响应,具体内容可参看 SD 卡规范 3 3 SD 卡读写驱动 3 3 1 SPI 时序模拟 用软件来模拟 SPI 总线的具体方法是:将 SCK 的初始状态置 0,允许接收后 (即 CS 置0
10、)将 SCK 置 1,这样单片机由 DI 线输出 1 位数据到 SD 卡;接着再将 SCK 置 0,单片机由7 DO 线从 SD 卡读 1 位数据。至此,模拟 1 位数据输入输出完成。此后再将 SCK 置 1,依次循环 8 次,完成 SPI 总线 1 字节数据的输入输出。 以下是本系统软件模拟 SPI 时序的汇编代码。以通用寄存器 A 作为函数参数,实现将寄存器 A 中的数据通过 SPI 总线发送出去,并 将从 SPI 总线读到的数据存到寄存器 A 中。 3 3 2 SD 卡的初始化 SD 卡的初始化流程如图 7 所示。 SD 卡上电延时 74 个时钟周期后,单片机向 SD 卡发送复位命令 C
11、MDO,使 SD 卡进入 SPI 模式。之后循环发送激活 SD 卡指令 CMD1,直到接收到 SD 卡响应的第 0 位为 0。 8 3 3 3 SD 卡数据块的读写 完成 SD 卡的初始化后,就可以对 SD 卡进行读写操作。读写操作都是通过指令来完成的:单块写命令 CMD24,多块写命令 CMD25;单块读命令 CMD17,多块读命令 CMD18。单块读写时,数据块的长度为 512 字节,多块读写时 SD 卡收到 1 个停止命令 CMD12 后停止读写。图 8、图 9 分别是单块读、写 SD 卡的软件流程。 9 3 4 FAT16 文件读写 按照 FAT16 文件系统的文件组织规范,编写读文件函数和写文件函数。 FAT16 文件读写的软件流程如图 10 所示。 10 结 语 通过串口将本系统连接到 PC 进行测试,结果表明本系统完成了对 FAT16 文件系统下文件的读写。当采用 11 059 2 MHz 晶振时,读写速度和质量都令人满意。本系统采用 51架构的 AT89S52 单片机,实现了基于 FAT16 文件系统的读写 SD 卡设计,整套系统成本较低,在嵌入式数据记录和存储 中有广泛应用前景。