基于嵌入式ARM的SD卡的读写.docx
《基于嵌入式ARM的SD卡的读写.docx》由会员分享,可在线阅读,更多相关《基于嵌入式ARM的SD卡的读写.docx(25页珍藏版)》请在冰点文库上搜索。
基于嵌入式ARM的SD卡的读写
摘要
SD卡(SecureDigitalMemoryCard)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
本实训的作品是利用基于ARMCotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统FATFSR0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。
关键词:
嵌入式;ARM;STM32;SD卡;文件系统
Abstract
SDCard(SecureDigitalMemoryCard)ChinesetranslationforSecureDigitalCard,itisakindofbasedonsemiconductorflashMemoryofanewgenerationofMemorydevice,itiswidelyusedinportabledevices,suchasDigitalcameras,personalDigitalassistant(PDA)andmultimediaplayer,etc.ThistrainingworkisbasedonARMCotex-M3kernelembeddedprocessorSTM32ownSDIOhardwareinterfacetodrivetheSDcard,andcombinedwiththefilesystemFATFSR0.07CtocompleteabasedonembeddedARMoftheSDcard,speaking,readingandwritingwork,realitytoSDcardtoaTXTfile,andreadSDcardfilegoalsandthroughtheserialportprinttoPCdisplay.
Keywords:
embedded;ARM;STM32;SDCard;Filesystem
1前言
1.1ARM应用背景
如今,学习一种处理器的就有许多ARM内核的处理器可供使用,现在社会已步入嵌入式学习阶段。
在嵌入式领域,8位处理器已经不再胜任一些复杂的应用,比如GUI,TCP/IP,FILESYSTEM等,而ARM芯片凭借强大的处理能力和极低的功耗,非常适合这些场合。
现在越来越多的产品在选型的时候考虑到使用ARM处理器,ARM的应用是相当的广泛。
ARM的嵌入式控制应用如:
汽车、电子设备、保安设备、大容量存储器、调制解调器、打印机等。
一个典型的ARM嵌入式工业控制系统的功能模块如图1-1所示。
输入输出
图1-1ARM嵌入式工业控制系统的功能模块
目前已有超过85%的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。
ARM在此方面的应用如:
手提式计算机、移动电话、PDA等。
随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。
此外,ARM在语音及视频处理上进行了优化,并获得广泛支持。
ARM技术在目前流行的数字音频播放器、数字机顶盒、游戏机、数码相机、数字式电视机、GPS、机顶盒中得到广泛采用。
现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。
如图1-2所示是基于ARM技术的数码相机的功能模块[9]。
图1-2基于ARM技术的数码相机的功能模块
1.2研究内容
本设计旨在加深对ARM的学习,巩固大学四年所学专业知识,提升动手能力和思考问题解决问题的能力。
本设计选择意法半导体的STM32F103系列处理器,通过自制STM32开发板的过程,和对STM32F103C8T6芯片的研究学习,掌握其各种外设功能。
STM32F103VET6具有一个SDIO接口。
SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:
1位(默认)、4位和8位。
在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。
SDIO存储卡规范2.0版支持两种数据总线模式:
1位(默认)和4位。
目前的芯片版本只能一次支持一个SD/SDIO/MMC4.2版的卡,但可以同时支持多个MMC4.1版或之前版本的卡。
除了SD/SDIO/MMC,这个接口完全与CE-ATA数字协议版本1.1兼容。
本实训的作品是利用基于ARMCotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统FATFSR0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。
本文第一章讲述了该论文写作背景,主要阐述了ARM应用范畴,以及该论文研究的内容;第二章讲述了该研究课题使用的核心芯片STM32F103VET6的各项参数;第三章着重介绍了SDIO的原理及实现方法;第四章着重介绍了FAT文件系统的原理;第五章介绍了测试方法和结果。
1.3研究成果
给硬件系统供电(5V),插上JLINK,插上串口线(两头都是母的交叉线),插上MicroSD卡,打开超级终端,配置超级终端为1152008-N-1,将编译好的程序下载到硬件平台,即可看到超级终端打印出如下信息:
图1-3显示结果图
2STM32处理器概述
2.1STM32简介
STM32F103xx增强型系列使用高性能的ARM/Cortex-M3/32位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。
所有型号的器件都包含2个12位的ADC、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:
多达2个I2C和SPI、3个USART、一个USB和一个CAN。
STM32F103xx增强型系列工作于-40℃至+105℃的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。
完整的STM32F103xx增强型系列产品包括从36脚至100脚的五种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。
下面给出了该系列产品中所有外设的基本介绍。
这些丰富的外设配置,使得STM32F103xx增强型微控制器适合于多种应用场合:
·电机驱动和应用控制;
·医疗和手持设备;
·PC外设和GPS平台;
·工业应用:
可编程控制器、变频器、打印机和扫描仪;
·警报系统,视频对讲,和暖气通风空调系统;
2.1.1STM32F103VET6的参数
STM32F103VET6芯片的参数如表2-1
表2-1器件功能和配置(STM32F103xx增强型)
芯片引脚图如图2-2:
图2-2STM32F103xx增强型LQPFP100管脚图
2.2内部资源
STM32有丰富的内部资源,如下所示:
·RealViewMDK(MiertocontrollerDevelopmentKit)基于ARM微控制器的专业嵌入式开发工具;
·内置闪存存储器;
·内置SRAM;
·嵌套的向量式中断控制器(NVIC);
·外部中断/事件控制器(EXTI);
·时钟和启动;
·自举模式;
·DMA;
·RTC(实时时钟)和后备寄存器;
·窗口看门狗;
·I2C总线;
·通用同步/异步接受发送器(USART);
·串行外设接口(SPI);
·控制器区域网络(CAN);
·通用串行总线(USB);
·通用输入输出接口(GPIO);
·ADC(模拟/数字转换器);
·温度传感器;
·串行线JTAG调试口(SWJ-DP)。
2.3Cortex-M3内核简介
Cortex-M3内核包含一个适用于传统Thumb和新型Thumb-2指令的译码器、一个支持硬件乘法和硬件除法的先进ALU、控制逻辑和用于连接处理器其他部件的接口。
Cortex-M3处理器是首款基于ARMv7-M架构的ARM处理器。
中央Cortex-M3内核使用3级流水线哈佛架构,运用分支预测、单周期乘法和硬件除法功能实现了出色的效率(1.25DMIPS/MHz)。
Cortex-M3处理器是一个32位处理器,带有32位宽的数据路径、寄存器库和基于传统ARM7处理器的系统只支持访问对齐的数据,沿着对齐的字边界即可对数据进行访问和存储。
Cortex-M3处理器采用非对齐数据访问方式,使非对齐数据可以在单核访问中进行传输。
Cortex-M3处理器是专为那些对成本和功耗非常敏感但同时对性能要求又相当高的应用而设计的。
凭借缩小的内核尺寸和出色的中断延迟性能、集成的系统部件、灵活的配置、简单的高级编程和强大的软件系统,Cortex-M3处理器将成为从复杂的芯片系统到低端微控制器等各种系统的理想解决方案。
表2-3为Cortex-M3处理器与ARM7作比较。
表2-3Cortex-M3与ARM7相比较
2.4STM32SDIO简介
2.4.1SDIO简介
STM32F103VET6具有一个SDIO接口。
SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:
1位(默认)、4位和8位。
在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。
SDIO存储卡规范2.0版支持两种数据总线模式:
1位(默认)和4位。
目前的芯片版本只能一次支持一个SD/SDIO/MMC4.2版的卡,但可以同时支持多个MMC4.1版或之前版本的卡。
除了SD/SDIO/MMC,这个接口完全与CE-ATA数字协议版本1.1兼容。
2.4.2SDIO功能特性
(1)主要功能
SD/SDIOMMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和CE-ATA设备间提供了操作接口。
多媒体卡系统规格书由MMCA技术委员会发布,可以在多媒体卡协会的网站上(www.mmca.org)获得。
CE-ATA系统规格书可以在CE-ATA工作组的网站上(www.ce-ata.org)获得。
SDIO的主要功能如下:
●与多媒体卡系统规格书版本4.2全兼容。
支持三种不同的数据总线模式:
1位(默认)、4位和8位。
●与较早的多媒体卡系统规格版本全兼容(向前兼容)。
●与SD存储卡规格版本2.0全兼容。
●与SDI/O卡规格版本2.0全兼容:
支持良种不同的数据总线模式:
1位(默认)和4位。
●完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。
●8位总线模式下数据传输速率可达48MHz。
●数据和命令输出使能信号,用于控制外部双向驱动器。
(2)SDIO总线拓扑
总线上的通信是通过传送命令和数据实现。
在多媒体卡/SD/SDI/O总线上的基本操作是命令/响应结构,这样的总线操作在命令或总线机制下实现信息交换;另外,某些操作还具有数据令牌。
在SD/SDIO存储器卡上传送的数据是以数据块的形式传输;在MMC上传送的数据是以数据块或数据流的形式传输;在CE-ATA设备上传送的数据也是以数据块的形式传输。
3SDIO的原理及实现方法
3.1原理
SDIO包含2个部分:
●SDIO适配器模块:
实现所有MMC/SD/SDI/O卡的相关功能,如时钟的产生、命令和数据的传送。
●AHB总线接口:
操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。
图3-1SDIO框图
复位后默认情况下SDIO_D0用于数据传输。
初始化后主机可以改变数据总线的宽度。
如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:
0]或SDIO_D[7:
0]可以用于数据传输。
MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0。
如果一个SD或SDI/O卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0或SDIO_D[3:
0]。
所有的数据线都工作在推挽模式。
SDIO_CMD有两种操作模式:
●用于初始化时的开路模式(仅用于MMC版本V3.31或之前版本)
●用于命令传输的推挽模式(SD/SDI/O卡和MMCV4.2在初始化时也使用推挽驱动)
SDIO_CK是卡的时钟:
每个时钟周期在命令和数据线上传输1位命令或数据。
对于多媒体卡V3.31协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体卡V4.0/4.2协议,时钟频率可以在0MHz至48MHz间变化;对于SD或SDI/O卡,时钟频率可以在0MHz至25MHz间变化。
SDIO使用两个时钟信号:
●SDIO适配器时钟(SDIOCLK=HCLK)
●AHB总线时钟(HCLK/2)
下表适用于多媒体卡/SD/SDI/O卡总线:
表3-1SDIO引脚定义
3.2SDIO适配器
下图是简化的SDIO适配器框图:
图3-2SDIO适配器
●命令通道状态机(CPSM)
当写入命令寄存器并设置了使能位,开始发送命令。
命令发送完成时,命令通道状态机(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。
当收到响应后,接收到的CRC码将会与内部产生的CRC码比较,然后设置相应的状态标志。
当进入等待(Wait)状态时,命令定时器开始运行;当CPSM进入接收(Receive)状态之前,产生了超时,则设置超时标志并进入空闲(Idle)状态。
●命令格式
命令:
命令是用于开始一项操作。
主机向一个指定的卡或所有的卡发出带地址的命令或广播命令(广播命令只适合于MMCV3.31或之前的版本)。
命令在CMD线上串行传送。
所有命令的长度固定为48位,下表给出了多媒体卡、SD存储卡和SDIO卡上一般的命令格式。
CE-ATA命令是MMCV4.2命令的扩充,所以具有相同的格式。
命令通道操作于半双工模式,这样命令和响应可以分别发送和接收。
如果CPSM不处在发送状态,SDIO_CMD输出处于高阻状态。
SDIO_CMD上的数据与SDIO_CK的上升沿同步。
3.3SDIO卡识别过程
多媒体卡和SD卡的卡识别过程是有区别的;对于多媒体卡,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为开路驱动,允许在这个过程中的卡的并行连接,识别过程如下:
1.总线被激活
2.SDIO卡主机广播发送SEND_OP_COND(CMD1)命令,并接收操作条件
3.得到的响应是所有卡的操作条件寄存器内容的“线与”
4.不兼容的卡会被置于非激活状态
5.SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡
6.所有激活的卡同时串行地发送他们的CID号,那些检测到输出的CID位与命令线上的数据不相符的卡必须停止发送,并等待下一个识别周期。
最终只有一个卡能够成功地传送完整的CID至SDIO卡主机并进入识别状态。
7.SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令至这个卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。
至此,这个卡转入待机状态,并不再响应新的识别过程,同时它的输出驱动从开路转变为推挽模式。
8.SDIO卡主机重复上述步骤5至7,直到收到超时条件。
对于SD卡而言,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为推挽驱动而不是开路驱动,识别过程如下:
1.总线被激活
2.SDIO卡主机广播发送SEND_APP_OP_COND(ACMD41)命令
3.得到的响应是所有卡的操作条件寄存器的内容
4.不兼容的卡会被置于非激活状态
5.SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡
6.所有激活的卡发送回他们唯一卡识别号(CID)并进入识别状态。
7.SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。
至此,这个卡转入待机状态。
SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值。
8.SDIO卡主机对所有激活的卡重复上述步骤5至7。
对于SDI/O卡而言,卡识别过程如下:
1.总线被激活
2.SDIO卡主机发送IO_SEND_OP_COND(CMD5)命令
3.得到的响应是卡的操作条件寄存器的内容
4.不兼容的卡会被置于非激活状态
5.SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。
至此,这个卡转入待机状态。
SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值。
3.4SDIO写数据块
执行写数据块命令(CMD24-27)时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个CRC码。
一个支持写数据块命令的卡应该始终能够接收由WRITE_BL_LEN定义的数据块。
如果CRC校验错误,卡通过SDIO_D信号线指示错误,传送的数据被丢弃而不被写入,所有后续(在多块写模式下)传送的数据块将被忽略。
如果主机传送部分数据,而累计的数据长度未与数据块对齐,当不允许块错位(未设置CSD的参数WRITE_BLK_MISALIGN),卡将在第一个错位的块之前检测到块错位错误(设置状态寄存器中的ADDRESS_ERROR错误位)。
当主机试图写一个写保护区域时,写操作也会被中止,此时卡会设置WP_VIOLATION位。
设置CID和CSD寄存器不需要事先设置块长度,传送的数据也是通过CRC保护的。
如果CSD或CID寄存器的部分是存储在ROM中,则这个不能更改的部分必须与接收缓冲区的对应部分相一致,如果有不一致之处,卡将报告一个错误同时不修改任何寄存器的内容。
有些卡需要长的甚至不可预计的时间完成写一个数据块,在接收一个数据块并完成CRC检验后,卡开始写操作,如果它的写缓冲区已经满并且不能再从新的WRITE_BLOCK命令接受新的数据时,它会把SDIO_D信号线拉低。
主机可以在任何时候使用SEND_STATUS(CMD13)查询卡的状态,卡将返回当前状态。
READY_FOR_DATA状态位指示卡是否可以接受新的数据或写操作是否还在进行。
主机可以使用CMD7(选择另一个卡)不选中某个卡,而把这个卡置于断开状态,这样可以释放SDIO_D信号线而不中断未完成的写操作;当重新选择了一个卡,如果写操作仍然在进行并且写缓冲区仍不能使用,它会重新通过拉低SDIO_D信号线指示忙的状态。
3.5SDIO读数据块
在读数据块模式下,数据传输的基本单元是数据块,它的大小在CSD中(READ_BL_LEN)定义。
如果设置了READ_BL_PARTIAL,同样可以传送较小的数据块,较小数据块是指开始和结束地址完全包含在一个物理块中,READ_BL_LEN定义了物理块的大小。
为保证数据传输的正确,每个数据块后都有一个CRC校验码。
CMD17(READ_SINGLE_BLOCK)启动一次读数据块操作,在传输结束后卡返回到发送状态。
CMD18(READ_MULTIPLE_BLOCK)启动一次连续多个数据块的读操作。
主机可以在多数据块读操作的任何时候中止操作,而不管操作的类型。
发送停止传输命令即可中止操作。
如果在多数据块读操作中(任一种类型)卡检测到错误(例如:
越界、地址错位或内部错误),它将停止数据传输并仍处于数据状态;此时主机必须发送停止传输命令中止操作。
在停止传输命令的响应中报告读错误。
如果主机发送停止传输命令时,卡已经传输完一个确定数目的多个数据块操作中的最后一个数据块,因为此时卡已经不在数据状态,主机会得到一个非法命令的响应。
如果主机传输部分数据块,而累计的数据长度不能与物理块对齐同时不允许块错位,卡会在出现第一个未对齐的块时检测出一个块对齐错误,并在状态寄存器中设置ADDRESS_ERROR错误标志。
4FatFS文件系统
4.1FatFS文件系统简介
FAFFS是面向小型嵌入式系统的一种通用的FAT文件系统。
FATFS完全是由AISIC语言编写并且完全独立于底层的I/O介质。
因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。
FATFS支持FAT12、FAT16、FAT32等格式,所以我们利用前面写好的SDIO驱动,把FATFS文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对已格式化的SD卡进行读写文件了。
4.2FatFS文件系统移植
4.2.1移植前工作
在移植FATFS文件系统之前,我们先要到FAT的官网获取源码,版本为R0.07C。
解压之后可看到里面有doc和src这两个文件夹。
doc文件夹里面是一些使用文档,src里面是文件系统的源码。
图4-1FATFS源码
4.2.2开始移植
首先我们要获取一个完全没有修改过的文件系统源码,然后在10-MicroSD卡这个文件夹下的实验代码下移植,这个实验代码实现的是卡的底层的块操作。
注意,我们在移植这个文件系统的过程中会尽量保持文件系统源码的纯净,尽量做到在修改最少量的源码的情况下移植成功。
FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。
FATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。
接下来我们介绍几个重要的配置选项。
1)_FS_TINY。
这个选项在R0.07版本中开始出现,之前的版本都是以独立的C文件出现(FATFS和TinyFATFS),有了这个选项之后,两者整合在一起了,使用起来更方便。
我们使用FATFS,所以把这个选项定义为0即可。
2)_FS_READONLY。
这个用来配置是不是只读,本章我们需要读写都用,所以这里设置为0即可。
3)_USE_STRFUNC。
这个用来设置是否支持字符串类操作,比如f_putc,f_puts等,本章我们需要用到,故设置这里为1。
4)_USE_MKFS。
这个用来定时是否使能格式化,本章需要用到,所以设置这里为1。
5)_USE_FASTSEEK。
这个用来使能快速定位,我们设置为1,使能快速定位。
6)_CODE_PAGE。
这个用于设置语言类型,包括很多选项(见FATFS官网说明),我们这里设置为936,即简体中文(GBK码,需要c936.c文件支持,该文件在option文件夹)。
7)_USE_LFN。
该选项用于设置是否支持长文件名(还需要_CODE_PAGE支持),取值范围为0~3。
0,表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我们选择使用3,通过ff_memalloc函数来动态分配长文件名的存储区域。
8)_VOLUMES。
用于设置FATFS支持的逻辑设备数目,我们设置为2,即支持2个设备。
9)_