SD卡初始化完成之后如果要使用默认的块读写长度(512 B),就可以进行SD卡的读写。当然,也可用CMD16命令来设置SD卡的块读写长度,可以是1B~512 B之间的任意值。但是对SD卡的写过程则要求块长度必须为512 B。无论是SD卡的读还是写,都要求在读写命令发送后有数据起始令牌FEH,数据传输结束有2 B的循环冗余编码CRC。本设计采用默认的块读写长度。
3.2 FAT32文件系统
存储在SD卡中的数据为二进制数据,为了使其能为计算机所识别,SD卡文件系统必须与计算机的文件系统一致。目前Windows系列操作系统中最常用的文件系统有FAT16、FAT32及NTFS等。由于汽车CAN网络的数据量大,并且记录仪需要记录长时间的数据,所以本设计选择FAT32作为SD卡的文件系统,FAT32最大支持单个文件4 GB容量,满足CAN数据记录仪的要求。
FAT32文件系统由系统引导记录区、FAT表区、文件登记表区和数据区四部分组成。系统引导记录区存储SD卡有关磁盘的结构信息,包括扇区字节数、FAT表的数目和总扇区数等;FAT表是FAT32文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构,它准确记录着已经被占用的簇,并为每个已经占用的簇指明存储后续内容的下一个簇的簇号。文件登记表FDT记录文件的登记项,每个登记项占32 B,记录了文件的起始簇号、大小以及创建和最后修改的时间等;数据区用于存储文件数据。
SD卡的文件系统主要功能包括创建文件、打开文件、写文件、读文件和关闭文件。在应用中,可以根据实际情况,增删以上功能,以简化系统。
考虑数据采集对系统实时性的要求, 对FAT表区的链式结构进行简化,磁盘的空闲空间是连续的,采用连续存储方式,这样略去了每次去FAT表搜索空闲簇的过程,满足系统对实时性的要求。简化后的链式结构是直线链, 即写满一个扇区自动写下一个扇区, 写满一个簇自动写下一个簇。
3.2.1 文件的创建
在SD卡上创建文件就是在文件目录表FDT中申请登记项和向FAT表中的FAT项填写空闲簇号的过程,流程图如图4所示。程序首先在系统引导记录区获取SD卡磁盘的结构信息;接着要检测文件登记表FDT中是否已经存在该文件,如果存在同名的文件,则返回,创建文件失败;然后申请空闲的FDT表项,申请FDT 表项成功后,程序会检测磁盘剩余的空间是否满足新创文件数据长度的需要,然后寻找第一个空闲的簇号,并修改对应的FDT表项。由于文件都是连续的,在FAT表中的FAT链表是直线链即前一簇指向后一簇,根据文件的大小,向FAT表区填写FAT链表,直到最后一个FAT项写入0x0FFFFFFFH,表示文件结束。
3.2.2 文件的读/写
SD卡上文件都是以簇为单位存取的,向SD卡上的文件写数据时,首先要根据文件名查找到该文件的文件登记项,根据文件登记项中的起始簇号即可找到文件在数据区中第1簇,向数据区对应的簇中写数据,并且可以在FAT表中找到第2个簇号。根据第2个簇号又能向第2簇写数据并找到FAT 中的第3个簇号,以此类推,直到FAT表中最后一项0x0FFFFFFFH,完成写文件。读取文件的过程与写文件类似。
SD卡在记录汽车CAN总线数据中的应用程序流程图如图5所示。其中LPC2368以中断方式将接收到的CAN数据以及接收时的时间存储到数据队列里,并立即跳出中断,进行主程序的处理或等待下一帧数据的接收中断,从而避免报文的丢失。
本设计采用SD卡作为外部存储介质,将实时采集到的CAN数据信息以标准文件的格式保存于SD卡中,具有性能可靠、使用方便、重量轻及存储容量大等特点,具有广阔的应用前景。