《武汉工程大学学报》  2012年7期 71-74   出版日期:2012-07-30   ISSN:1674-2869   CN:42-1779/TQ
单片机控制高容量安全数字卡的应用设计


0引言  高容量安全数字卡广泛应用在含有视频功能的嵌入式系统[1]、笔记本电脑中,对高容量安全数字卡的访问控制成为研究的热点.在含有视频拍摄功能的嵌入式系统中,常用SD卡 (Secure Digital Card——安全数字卡)保存系统拍摄的视频,以便用计算机进一步处理嵌入式系统中所拍摄到的数据.随着拍摄时间的增加和拍摄功能的增强,选用最高容量不超过2 GB的SDSC卡(Standard Capacity Secure Digital Card——标准容量安全数字卡)很难满足系统对存储卡的容量要求,客观上需要嵌入式系统选用容量为4GB~32GB的SDHC卡(High Capacity Secure Digital Card——高容量安全数字卡).SDHC卡是近来按Ver2.0规范生产的SD卡,与按Ver1.1规范生产的SDSC卡存在较大的差异,为了解决嵌入式系统中高容量SD卡的访问控制问题,本文从应用的角度出发,以MC9S12XS12单片机控制Apaccr(宇瞻)4GB的SD卡为例,详细地讨论SDHC卡的控制设计.1SDHC卡与SDSC卡在使用上的主
要差异SDHC卡的内部结构与SDSC卡不同,除了容量上的差异外,在使用控制上还存在着以下几方面的差别:  (1)SDHC卡只支持块访问,不支持字节访问,块的大小固定为一个扇区512字节;SDSC卡既支持块访问,又支持字节访问,块的大小由用户指定.  (2)SDHC卡所使用的文件系统是FAT32,不能在FAT12/16文件系统中使用;SDSC卡使用的文件系统是FAT12/16,在FAT32文件系统中也可以访问SDSC卡.  (3)SD卡除了拥有SDSC卡的全部命令集外,还增加了许多命令.其中,SPI模式中新增加了CMD8命令,用来识别SD卡的接口类型.CMD8命令的格式与其他SPI命令的格式相同,命令代码为0x48.  (4)块访问命令参数的含义不同.在SDSC卡中,6个块访问命令CMD17、CMD18、CMD24、CMD25、CMD32、CMD33的参数含义是SD卡的字节地址.在SDHC卡中块访问命令虽然也是这6个命令,但其参数的含义为SD卡的块地址(扇区地址).  (5)初始化过程不同.2硬件电路设计  SDHC卡是在SDSC卡的基础上发展起来的,它们的引脚数都是9脚,引脚分布相同,都具有SD和SPI两种工作模式,用单片机控制SDHC卡可以采用SPI模式[2]控制.  MC9S12XS128单片机是带有SPI口的CMOS单片机[3],其工作电压为3.135~5.5 V,SD卡的工作电压为2.7~3.6 V,它们都采用3.3 V电源供电时,可用MC9S12XS128的SPI口直接控制SD卡.MC9S12XS128控制宇瞻4 GB的SDHC卡的硬件电路[4]如图1所示.图1单片机控制SD卡的硬件电路
Fig.1Circuit of controlling SD card based on MCU  图1中,R1为4.7 kΩ的电阻,R2为100 Ω的电阻,R3为1 MΩ的电阻,C1为0.01 μF的电容,S1为复位按钮,C2、C3为22PF的电容,Y为16 MHz的晶振.R1、R2、C1、S1构成了单片机的复位电路,C2、C3、Y、R3为单片机的振荡电路.3软件程序设计3.1SPI初始化程序第7期李文华,等:单片机控制高容量安全数字卡的应用设计
武汉工程大学学报第34卷
  SDHC卡工作在SPI模式时,一次数据传输期内CS引脚必须保护为低电平,数据传输结束后需将CS置为高电平.一个字节的数据传输方向是,高字节在先,低字节在后.SDHC卡输出数发生在时钟的下降沿之后,SDHC卡接收数据时时钟的上升沿锁存数据.在SDHC卡的初化过程中,SPI的时钟频率为100~400 kHz,初始化结束后,SPI的时钟频率为0~6 MHz.为了实现单片机与SDHC卡通信,单片机的SPI口应按SDHC卡的时序要求工作[5].用MC9S12XS128单片机控制宇瞻4 GB的SDHC卡时,单片机的SPI口初始化程序如下:void SPI_Init(void){ MODRR =0; MODRR_MODRR4=1; //使用PM口 DDRM|=0x38; //SCK0=1,MOSI=1,
SS0=1 DDRM &=(~0X04); //MISO=0 输入 SPI0CR1 = 0x5E; //CPOL=1,CPHA=1 SPI0CR2 = 0x00; SPI0BR = 0x07; //SPI速率:312.5 kHz}3.2SD卡的初始化程序  上电后,SD卡处于SD模式,采用SPI模式访问SD卡时必须先将SD卡的工作模式转换成SPI模式,然后用SPI模式命令访问SD卡中的存储器.初始化SD卡的的主要任务是,判断卡槽中的SD卡是何种SD卡,并将SD卡的工作模式设置成SPI模式,如果是SDSC卡还需要设置访问块的大小.  初始化SD卡的方法是,上电后先用CMD0命令复位SD卡,使SD卡能接收后续的SPI模式命令,然后用CMD8命令[6]判断SD卡的接口类型和工作条件.  在读得CMD8命令的响应有效后再用ACMD41命令启动SD卡的SPI模式初始化,并检查初始化是否结束,此处发送ACMD41命令时,应将参数的HCS位设置成1.  在SD卡完成了SPI模式初始化后,再用CMD58命令读OCR寄存器的内容,并根据OCR的CCS位判断SD卡是SDHC卡还是Ver2.0版本的SDSC卡.SDSC卡、SDHC卡通用的初始化流程图如图2所示.图2SD卡初始化流程
Fig.2Flow chart of the SD card initialized3.3读写扇区程序  在SPI模式下,SDHC卡的读扇区的命令是CMD17,写扇区命令是CMD24,这2个命令也是SDSC卡在SPI模式下的读写扇区命令.读扇区程序必须按照CMD17命令的时序图编写,写扇区程序必须按照CMD24的时序图编写.考虑到SDHC卡和SDSC卡的读写扇区命令相同,仅仅只是参数的含义不同,可以将读写扇区程序编写成SDHC卡和SDSC卡通用的程序.通用的读扇区流程图如图3所示,通用的写扇区的流程图如图4所示.图3读扇区流程图
Fig.3Flow chart of reading sector图4写扇区流程图
Fig.4Flow chart of writing sector4测试结果  测试主要包括2个方面,一是测试向SDHC卡写数的功能,二是测试从SDHC卡中读数的功能.应用本设计中的电路和程序向宇瞻SDHC卡的第50 000扇区写入512个0x17数据,写数后的结果如图5所示.  将SDHC卡的50 000扇区中的数据读至数据组buff[512]中的结果如图6所示.

图5向SDHC卡写数的结果
Fig.5Result of writing data to SDHC card图6从SDHC卡读数的结果
Fig.6Result of reading data from SDHC card5结语  本设计通过采用MC9S12XS128单片机控制宇瞻4 GB的SDHC卡,提出了嵌入式系统中使用高容量SD卡的设计思路和方法,并成功地实现了单片机对SDHC的访问控制,本设计中的电路和程序已在第五届“飞思卡尔”杯智能汽车的调试过程得到了很好的应用.实践表明,本设计解决了高容量SD卡的访问控制问题,可应用于含有视频拍摄功能的嵌入系统中和基于SD卡的嵌入式系统的存储器升级.