1、基于 STM32 的几种读 SD 卡方式的速度探究摘 要SD 卡是常见的存储介质,它具有读写速度快,容量大,便携等特点。在 STM32 平台上对 SD 卡进行读写一般采用 SPI 接口或者是SDIO 接口的方式。这两种不同的接口速度有很大的差异。另 STM32 还支持 DMA(Direct Memory Access) ,可以实现对存储器的直接访问,省去了 CPU 的数据搬移时间。 中图分类号:TP334.7 文献标识码:A 文章编号:1009-914X(2015)36-0269-01 1、硬件设计 1.1 STM32F103ZET6 STM32F103ZET6 基于高性能 32 位 RISC
2、 的 ARM Cortex-M3 核,其最高工作频率为 72MHz。片上集成了高速存储器, 1.2 SPI 协议 SPI 是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议。 1.3 SDIO STM32F103ZET6 系列微控制器支持直接使用 SDIO 接口对 SD 卡进行读写,最高速度可达 SPI 方式的数倍。 1.4 DMA STM32F10x 系列 MC
3、U 支持 DMA 功能,可以直接将数据从一个地址空间复制到另外一个地址空间,只需 CPU 执行初始化的动作,传输数据的冗长过程可以让 DMA 控制器完成。 1.5 SD 卡接口电路设计 SPI 通信模式如图 1 所示: 其中 SS 是片选线,SCK 为时钟信号线,由主通信设备产生,MOSI 是主设备输出/从设备输入引脚,MISO 是主设备输入/从设备输出引脚。SDIO 通信模式如图 2 所示: 同样,在电路设计中,需要在 DATA03 和 CMD 线加上上拉电阻。 2.软件设计 2.1 SD 卡的初始化 2.1.1 将 SD 卡初始化为 SPI 总线模式 STM32F103ZEET6 微处理器
4、包括 2 个串行外设接口(SPI) 。刚上电时,将 SD 卡切换到 SPI 模式,主机需要发出命令 CMD0。SD 卡会检测到 SPI模式选择信息, 2.1.2 将 SD 卡初始化为 SDIO 模式 首先上电(power-on) ,然后发出 CMD0,再接着发送 CMD8,有应答(response)判断为 Ver2.00 或更新的 SDMC,无应答(no response)判断为 ver2.00 或者更新版 SDMC(电压不匹配(voltage mismatch) )或ver1.X SDMC 或不是 SDMC。 2.2 SD 卡读写单块数据 从 SD 卡中夺取一个数据块只需要主机发送 CMD1
5、7 命令,并将起始地址作为参数,然后 SD 卡会验证这个字节地址,并且以一个 R1 命令作为响应。在完成 SD 卡读取操作后,先发送一个起始数据命令,接着发送固定数量的数据,最后是 2 个字节的 CRC 校验。 2.3 SD 卡的文件存储 由于需要 SD 卡的数据能够在计算机上直接读写,所以 SD 卡的文件系统必须与计算机的文件系统兼容。目前常用的文件系统主要有 Windows下的 FAT32,NTFS,Linux 下的 EXT2,EXT3 等。 2.4 DMA 的配置 一般对于 SD 卡的读写,对于 MCU 来说都是大吞吐量的数据传输,所以通过 DMA 来提高效率。SDIO 采用的 DMA2
6、 中的通道 4,用于从存储器向SDIO 的 FIFO 搬移数据。具体过程如下:执行卡的识别过程,提高 SDIO的时钟频率,发送 CMD7 命令选择卡,配置 DMA2,发送 CMD24(开始写数据) ,查询 DMA 通道的使能状态寄存器,确认没有通道仍处于使能状态。 配置 DMA2 的具体步骤如下: 1)使能 DMA2 控制器并清除所有的中断标志位。 2)设置 DMA2 通道 4 的源地址寄存器为存储器缓冲区的基地址,DMA2 通道 4 的目标地址寄存器为 SDIO_FIFO 寄存器的基地址。 3)设置 DMA2 通道 4 控制寄存器(存储器递增,非外设递增,外设和源的数据宽度为字宽度) 。 4
7、)使能 DMA2 通道 4 发送 CMD24 的具体步骤如下: 1)设置 SDIO 数据长度寄存器(SDIO 数据时钟寄存器应该在执行卡识别过程之前设置好) 2)设置 SDIO 参数寄存器为卡中需要传送数据的地址 3)设置 SDIO 命令寄存器:CmdIndex 置为 24(WRITE_BLOCK) ;WaitRest 置为 1(SDIO 卡主机等待响应) ;CPSMEN 置为 1(使能 SDIO 卡主机发送命令) ,保持其它域为他们的复位值。 4)等待 SDIO_STA6=CMDREND 中断,然后设置 SDIO 数据寄存器:DTEN 置为 1(使能 SDIO 卡主机发送数据) ;DTDIR
8、 置为 0(控制器至卡方向) ;DTMODE 置为 0(块数据传送) ;DMAEN 置为 1(使能 DMA) ;DBLOCKSIZE 置为 9(512 字节) ;其它域不用设置。 5)等待 SDIO_STA10=DBCKEND 3、速度测试 3.1 SPI 读速度测试 笔者采用的是 class4 的 SD 卡。 使用 SPI 模式,SPI 时钟使用最高频率 36M,速度可以达到400KB/s。 使用 SPI+DMA 方式,速度可以达到 800KB/s,比不采用 DMA 速度提高了几乎一倍。 使用 SDIO 方式,速度几乎达到了 2MB/s。 4、结语 STM32 系列 MCU 的应用日渐广泛,SD 卡也具有广阔的市场前景和发展前景。在 21 世纪,信息在人们的生活中已经变得不可或缺,相信使用嵌入式系统的电子产品会在人们的生活中越来越广泛的应用。