×
单片机 > 单片机程序设计 > 详情

基于STM32F103XX微处理器的Micr0 SD卡读写

发布时间:2020-06-15 发布时间:
|

O 引言
    由于远程智能心脏检测仪器对采集到的心电信号是实时处理与存储的。因此,本文在STM32F103XX微处理器的基础上,采用Micro SD存储卡实现了关键心电信号的存储。

1 硬件电路设计
1.1 STM32F103xx微处理器简介
    STM32F103XX基于高性能32位RISC的ARMCortex-M3核,工作频率为72 MHz。片上集成了高速存储器,通过APB总线连接了丰富、增强的外设和I/O。所有的设备都提供标准的通信接口。
1.2 SPI协议
    由于SPI(setial peripheralinterface)总线占用的接口线少,通信效率高,并且支持大部分处理器芯片,因而是一种理想的选择。SPI是利用4根信号线进行通信的串行接口协议,包括主/从两种模式。4个接口信号为:串行数据输入(MISO,主设备输入、从设备输出)、串行数据输出(MOSI,主设备输出、从设备输入)、移位时钟(SCK)、低电平有效的从设备使能信号(cs)。SPI最大的特点是由主设备时钟信号的出现与否来确定主/从设备间的通信。一旦检测到主设备的时钟信号,数据开始传输。
1.3 Micro SD卡简介
    Micro SD卡的接口可以支持2种操作模式:SDIO模式和SPI模式。设计者可以选择其中任一模式。SDIO模式允许4线的高速数据传输,传输速率高,但是大部分微控制器无此接口,使用软件模拟协议复杂。SPI模式使用简单通用的SPI通道接口,即可实现数据传输,目前大多数微控制器都提供SPI接口。SPI模式相对于SDIO模式的缺点是损失了传输速度,但目前微处理器的处理速度越来越高,利用SPI模式大多都能满
足工程需要。
    Micro SD卡要求用全双工、8位的SPI操作。STM32F103XX微处理器和Micro SD卡之间只需要4根信号线就可以完成数据的读/写,当CS片选信号线为低电平时,微处理器开始所有的总线传输。数据从微处理器的MOSI引脚同步输入Micro SD卡的DI引脚,并由Micro SD卡的DO线同步输入微处理器的MISO引脚,数据在CLK信号的上升沿同步输入和输出。在每个数据传输的结尾还必须提供8个额外的时钟,以允许Micro SD卡完成任何未完结的操作。另外,使用SPI模式时,为了防止在无卡接入或卡驱动器呈高阻态时总线悬空,根据SD卡规范,这些信号需要在微处理器端用10~100 kΩ的上拉电阻,其硬件连接电路如图1所示。

[page]

2 软件设计
    软件设计一部分是基于STM32固件库,该固件库针对基于ARM的32位微处理STM32F101XX和STM32F103XX。其中,包括程序、数据结构和覆盖所有外设特性的宏单元,还包括设备驱动的描述以及每个外围模块的实例。因此,使用该固件库可以节省许多时间,将更多的时间花费在编程方面,从而减少了在应用开发中的综合开销。
2.1 Micro SD卡初始化为SPI总线模式
    STM32F103XX微处理器包括2个串行外设接口(SPI),可以方便地对Micro SD卡接口进行配置。首先对要用到的SPIl接口采用命令SPI_In-it(SPIl,&SPI_InitStructure)进行初始化,并使能SPIl。
    刚上电时,Micro SD卡缺省使用专有的SD总线协议,将Micro SD卡切换到SPI模式,主机需要发出命令CMDO(GO-IDLE-STATE)。Micro SD卡会检测到SPI模式选择信息,因为卡选择(CS)引脚在该命令和其他所有SPI命令传送过程中都保持为低电平,故MicroSD卡以R1作为响应,空闲状态位被置为高电平,此时MicrlO SD卡进入空闲状态,此阶段的SPI时钟频率不能超过400 kHz。Micro SD卡进入SPI模式后,主机应该先发一条初始化指令CMD1(ActiVates the card process),此时可将SPI频率设置为高速模式。然后发送命令CMD59决定是否开启CRC校验,设置读/写块数据长度,最后延迟8个时钟后返回。Micro SD初始化流程如图2所示。


2.2 Micro SD卡读写单块数据
    从Micro SD卡中读取一个数据块只需要主机发送CMD17(MSD_READ_SINGLE_BLOCK)命令,并将起始地址作为参数(此地址必须和介质上一个块的起始位置对齐),然后Micro SD卡会验证这个字节地址,并以一个R1命令作为响应。在完成Micro SD卡读取操作后,先发送一个起始数据命令,接着发送固定数量的数据,最后是2个字节CRC校验。读取一个数据块由函数u8 MSD_ReadBlock(u8*pBuffer,u32 ReadAddr,u16 NumByteToRead)来完成,pBuffer是一个指针,它指向接受Micro SD卡数据内存缓冲区的地址,ReadAddr是要读取数据在Micro SD卡中的地址,NumByteToRead是要读取的字节数,一般为512 B。

[page]

    从Micro SD卡中写入一个数据块与读取数据块相似。主机发送CMD24(MSD_WRITE_BLOCK)命令启动写操作过程,Micro SD卡将以R1命令响应格式进行应答。如果命令响应,则进行写操作,主机发送起始令牌,然后发送固定数量的数据字节(512 B),返回一个数据响应令牌,指示需要写入的数据是否完成,最后是2个字节的CRC校验,写入一个数据块由函数u8 MSD_WriteBuffer(u8*pBuffer,u32 WriteAddr,u32 Num-ByteToWrite)来完成,向Micro SD卡写数据函数中的参数与向Micro sD卡读数据函数中的参数相同。读/写单块数据流程如图3所示。


2.3 Micro SD卡的文件存储
    由于需要Micro SD卡上的数据能够在计算机上直接读/写,所以Micro SD卡文件系统必须与计算机的文件系统一致。目前常用的文件系统主要有微软的FATl2,FATl6,FAT32,NTFS,以及Linux系统下的 EXT2,EXT3等。由于微软Windows的广泛应用,在当前的消费类电子产品中,用得最多的还是FAT文件系统,如U盘、MP3,MP4,数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大的FAT开源文件系统,对于单片机系统设计者来说是很重要的。所以在Micro SD卡存储机制上,移植了FAT FS文件系统。FAT FS是一种完全免费开源的FAT文件系统模块,是专门为小型嵌入式系统而设计的。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到多种平台而只需做简单的修改。需要使用者编写移植代码的是FAT FS提供的底层接口,包括存储介质读/写接口DiskIO和供给文件创建修改时间的实时时钟RTC。
    FAT FS Module一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构,如图4所示。最顶层是应用层,使用者无需理会FAT FSModule的内部结构和复杂的FAT协议,只需要调用Module提供给用户的一系列应用接口函数,如f-open,f-read,f- write,f-Close等就可以像在PC上读/写文件那样简单。
2.3.1 文件(或目录)创建
    在Micro SD卡上创建文件(或目录)的过程就是在文件目录表中申请登记项的过程。首先程序要检测文件目录表(FDT)中是否已经存在该文件,然后申请空闲的FDT 表项。如果存在同名的文件,则返回,创建文件(或目录)失败。申请FDT表项成功后,程序会检测磁盘剩余的空间是否满足新创文件数据长度的需要,而后寻找第一个空闲的簇号,并修改对应的FDT表项。根据文件的大小,不断循环查找下一个空闲的簇,同时修改当前FAT项目为下一个簇号,直到最后一个FAT项写入0xFFFFH,以表示文件结束。新建目录时,只需要提供函数CreateDir()函数新建目录的目录名,其过程和创建文件一样,只是不需要提供数据相关的信息。
2.3.2 文件的读写
    Micro SD卡上的文件都是以簇(Cluster)为单位存取的。当读取Micro SD卡上的文件时,首先要根据文件名查找到文件加目录登记项(F-DT),根据文件中目录登记项中起始簇号即可以找到文件在数据DATA区中的第一簇内容,并且可以在FAT表中找到第二个簇号。根据第二个簇号又能读取第二簇的数据和FAT中第三个簇号,这样就可以读取全部文件数据。写文件时要保证 FAT1和FAT2内容的一致性,即要对两个FAT进行同样的写操作。当要在已有的文件中增添数据时,程序首先要分析原有文件最后一个扇区还有多少剩余空闲字节数,以便新添加数据与这最后一个扇区汇合,超过扇区的数据在申请新的空闲FAT表项时,其过程与新建文件类似。在文件的最后一簇填写0xFFFFH 表示文件结束。
2.3.3 文件(或目录)的删除
    删除文件的操作需要提供函数DeleteFile()删除文件的文件名和扩展名。删除文件时,不涉及数据区的操作,只须在文件的目录登记项(FDT)上做一个删除标记,并把文件在FAT表中所占用的簇标记为“空簇”。
    程序先在FDT中查找是否有同名文件,如果存在同名文件,则将在对应的FDT表项中第一个字节内容改为0xE5H,表示该FDT表项的内容已经被删除,新建文件可以使用该表项。最后还需要将FAT表中所有文件相关簇项目的内容都改成Ox0000,释放出所对应的Micro SD卡磁盘空间。若未找到同名文件,则返回一个错误值。删除目录的操作只需要提供函数DeleteDir()删除目录的目录名。程序先在FDT中查找是否有同名目录项,如果存在同名目录项,则将对应的FDT表项中第一个字节内容改为0xE5H。然后读出对应目录的起始簇号,在该簇号中去删除该目录下的所有文件。

3 结语
    该方案已经成功应用于远程智能心脏检测仪器中,为心脏检测仪器的数据采集提供了一种非易失性存储器的解决方案,远程智能心脏检测仪器采集得到的数据信息以FAT32标准文件的格式保存于Micro sD卡中,数据文件可在Windows下读取,在保证高性价比的同时,又方便了数据的进一步分析和处理。
关键字:STM32F1103XX  Micro  SD  SPI  FATFS 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码