当前位置:首页 > 单片机 > 单片机
[导读]S3C2416裸机开发系列十六_sd卡驱动实现标签:S3C2416裸机开发sd卡驱动sd2.0gcc2014-05-26 12:562429人阅读评论(3)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)

S3C2416裸机开发系列十六_sd卡驱动实现

标签:S3C2416裸机开发sd卡驱动sd2.0gcc

2014-05-26 12:562429人阅读评论(3)收藏举报

分类:

s3c2416裸机开发(24)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

S3C2416裸机开发系列十六sd卡驱动实现

象棋小子 1048272975

SD卡(Secure Digital Memory Card)具有体积小、容量大、数据传输快、可插拔、安全性好等优点,被广泛应用于便携式设备上。例如作为数码相机的存储卡,作为手机、平板多媒体扩展卡用的TF卡(micro sd)。笔者此处就s3c2416 sd卡驱动的实现作一个简单的介绍。

1. sd卡概述

sd卡技术是在MMC卡的基础上发展起来的,其尺寸与MMC卡一样,只是比MMC卡厚了0.7mm,因此sd设备可以识别并存取MMC卡。sd卡接口除了保留MMC卡的7针外,还在两边加了2针,作为数据线,目的是通过把传输方式由串行变成并行,以提高传输速率。此时的规范为sd1.0版本,最高容量只能到4GB。为了跟进产品的更新换代,sd联合协会在06年发布了容量更大、存储更快的下一代sd卡规范sd2.0。该规范重新定义了sd卡的速度等级,分为三档:Class 2、4、6,分别对应写入速度2MB/s、4MB/s、6MB/s。根据卡容量又分为标准卡(小于2GB)和高容量卡(2GB~32GB),目前市面上应用的sd卡绝大部分都是sd2.0版本的卡。为了让储存卡更加迷你,通过sd卡规范标准,又衍生了MiniSD卡和Micro SD卡,这些卡均比标准sd卡尺寸小,通过sd转接卡可以当作一般的sd卡使用。尤其是Micro SD卡,可以算是最小的存储卡了,超小的体积可以极大的节省消费电子产品内部设计的空间,基本目前的Android手机均是选用Micro SD卡作为多媒体扩展储存卡。随着科技的进步,sd2.0规范sd卡也渐渐无法满足应用的需求,在10年sd联合协会又发布了新的sd3.0规范,该规范定义了sdxc和uhs,并增加了Class10,容量范围为32GB~2TB。在sdxc卡仍需进一步坐等其价格下降的情况下,sd4.0规范已经开始在紧张的制订中,这已超出本文的讨论范围内了。

2. sd卡驱动编写

sd卡共支持三种传输模式:spi模式、1位sd模式、4位sd模式。所有的sd卡都必须支持较老的spi/mmc模式,这个模式支持慢速的四线spi接口,使很多微控制器都可以通过spi或模拟spi接口来读写sd卡。由于s3c2416具有sd总线控制器,并且兼容sd2.0的sd卡,因此此处只分析4位sd模式、sd2.0及sd1.0版本的sd卡驱动实现,sd2.0以上版本sd卡、MMC卡、spi方式读写sd卡在本文不适用。

sd卡驱动的编写必须参考sd2.0规范,此处只根据sd2.0规范讲解几个重要的过程或概念,这些过程具体的实现请参考sd驱动模块中相应的函数实现。

2.1. sd卡初始化及识别过程

sd卡上电后,将进入idle状态,此时的sd卡为1位sd模式。通过拉低CS线将可使sd进入spi模式(不再讨论范围内),在sd模式下卡的初始化及识别过程见图2.1.1,其步骤如下:

1) 发送CMD0软件复位所有的卡到idle状态。

2) 发送CMD8来检查卡是否支持主机电压(2.7v~3.3v),这个命令在sd2.0以上才被定义,若没有收到回复信号,则可能为sd1.0或MMC卡,若接收到卡回复信号,说明为sd2.0版本卡,跳转到步骤5

3) CMD8没有收到回复信号,可进一步发送ACMD41(CMD55+CMD41),参数HCS位为0(非高容量卡),如果没有回复信号,说明是MMC卡或其它不能识别的卡,可进一步发送CMD1确定是否MMC卡(此处不再分析)

4) ACMD41能收到回复,并且从回复中确定sd卡己准备好,即可确定这是sd1.x版本的卡,若回复中表明sd卡未准备好,则需重复发送ACMD41等待卡准备好,可通过超时(卡一直busy)判断卡不支持主机电压,此时表明卡不可用。判断出sd1.x的卡后,跳转到步骤9

5) CMD8有回复说明为sd2.0以上的卡,从回复中确定卡是否能在该电压下工作,不能则认为卡不可用。

6) 回复中确定卡能在2.7v~3.3v电压工作后,进一步发送ACMD41(CMD55+CMD41),参数HCS位为1表明主机支持高容量的卡

7) 检查ACMD41卡回复中忙标志,若卡处于忙状态,则重复发送ACDM41,直到卡准备好,可通过超时(卡一直忙状态)可认为该卡不可用。

8) ACMD41回复准备好后,再检查回复中的CCS位,该位为1说明是sd2.0高容量sdhc卡,若为0,则说明为sd2.0标准容量卡。

9) 在识别出sd1.x、sd2.0标准卡或sd2.0高容量卡后,此时卡进入ready态。进一步通过CMD2请求卡发送其CID(Card Identification),此时卡进入Identification态。

10) 卡在Identification态后,发送CMD3请求卡发布一个16位新的相对地址(RCA),以后主机与卡之间的点对点通信均会以这个RCA地址来进行,此时卡进入Stand-by态。

11) 至此,卡的初始化及识别过程结束,此时卡进入数据传输模式(data transfer mode)


图2.1.1. sd卡初始化及识别流程

2.2. 数据传输模式

sd卡主控制器是一个非常典型的状态机,每个状态只会响应该个状态下的特定命令,不要尝试在某个状态下发送这个状态不支持的命令,sd卡不会对该命令进行响应,命令只会超时。应该通过特定的触发条件转变状态或等待状态迁移完成后,再发送对应状态的命令。如图2.2.1,要想写一个块的数据到sd卡,在stand-by态的情况下,必须通过CMD7选择卡,让卡进入transfer态,然后再发送CMD24单块写命令,再发送一块的数据,此时卡进入Programming态,这时如果又紧接发送CMD24进行单块写将不会成功,必须等待sd卡编程完,从Programming态返回到transfer态才能再次接收下一个块写命令。同样,在transfer态想通过CMD9来获得Card-Specific Data(CSD),必须通过CMD7取消选择卡,此时卡进入stand-by态后,即可通过CMD9来获得卡信息。


图2.2.1. sd卡数据传输模式

2.3. 主机控制器具体对卡的初始化

任何cpu的sd卡主机控制器都可以根据sd2.0规范给出的卡初始化及识别流程进行卡的初始化,对于具体的cpu,需要进行一些与控制器相关的设置,主要有以下几点,具体的实现可参考Hsmmc_Init()这个初始化函数。

1) 设置功能引脚,把相应引脚配置成sd接口用引脚

2) 设置sd卡时钟在100k~400k,sd卡在识别阶段必须用慢速时钟进行访问

3) 按照规范给出的卡初始化流程对卡进行发送相应的命令并处理回复,成功后卡进入stand-by态

4) 通过发送CMD7选择卡,使卡进入transfer态,因为卡的大部分操作如读、写、擦除等均是在这个状态下来进行的,此时卡已完全准备好接收读写命令了。

5) 设置sd卡的时钟到一个较高值,sd卡默认支持最高25M时钟,可以设置成高速模式,最高支持50M,频率越高,数据传输速率越快

6) 通过ACMD6(CMD55+CMD6)来设置sd模式的位宽为4,sd卡初始化后默认是1线宽,更多的数据线将有更大的带宽,数据传输速率最高12.5MB/s(25M、4线)或25MB/s(50M、4线)。

7) 发送CMD16设置块长度,对于标准卡,可通过CMD16来设置块命令(如块读、块写)所操作块的长度(以字节数计),可实现字节的读写,但对于高容量卡这个命令将被忽略,高容量卡一个块的长度均是固定512字节的。通常通过CMD16设置块长度为512字节。至此卡初始化完成。

2.4. 主机命令的发送

sd规范对命令包格式、回复包、数据的传输方式等均作了详细的要求。虽然sd卡主机控制器可以帮我们对命令进行打包,对回复进行解包,产生CRC,并在sd总线上输出相应的时序。我们仍需要告诉sd卡主机控制器需发送的命令、这个命令的参数、这个命令发送后是否需要使用data线, sd卡的回复类型。具体到s3c2416的sd卡主机控制器,这些设置通过CMDREG寄存器来实现。主要有以下几点,具体的实现可参考Hsmmc_IssueCommand()这个命令发送函数。

1) 命令发送时,需检查命令线是否已被使用,若是,则等待正在发送的命令发送完才能发送这个命令

2) 如果命令回复会带忙信号(如R1b回复),则需检查数据线是否已被使用,若是,则等待数据线空闲,带忙回复命令发送后,sd卡会拉低DAT[0]线表明sd卡正忙,数据线不可用。

3) 把命令参数写入ARGUMENT这个寄存器中

4) 在CMDREG中设置命令值[13:8]

5) 设置是否需使用data线,如块读、块写等命令发送后,会紧接着在data线上传输数据,其它不需传输数据的命令不要设置使用data线CMDREG[5]

6) 设置sd卡的回复类型,绝大部分命令在sd卡正确响应后,都会对主机进行回复(R1-R7,R1b),每个命令对应的回复类型请参考sd卡规范。回复类型长度可能为136或48,回复中是否包含CRC或命令值的反馈,如果包含,则告诉主控制器检查回复中相应的CRC或命令值反馈是否正确,以确定传输正确。CMDREG设置好后,主控制器就会发送命令并接收设定长度的回复并根据设定检查CRC、命令值反馈是否正确(若回复中包含CRC或命令值反馈的话)

7) 等待命令完成,检查中断状态位NORINTSTS[15]以确定命令是否有错误,若没有错误并且检测到NORINTSTS[0]命令完成位为1,则说明命令发送成功。其它情况说明命令未能成功发送。

2.5. 主机对sd卡的读写

通常对于一个sd卡驱动模块,至少实现卡初始化、块读、块写这三个接口函数。块读、块写必须在卡初始化完成后,在transfer态下才有效。通常有以下几点需要注意,具体可参考Hsmmc_ReadBlock()和Hsmm

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

IIC是Philips推出的芯片间串行传输总线,它以二根连线实现完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。由于其接口简单灵活,很多外围器件均提供了IIC接口,如手机、平板常用的重力传感器

关键字: s3c2416 裸机开发 iic驱动

现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置。笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节”...

关键字: gcc s3c2416 ucgui 移植 裸机开发

jpeg格式是一种针对相片影像而广泛使用的一种失真压缩标准,其压缩技术十分先进,用有损压缩方式去除冗余的图像数据,在获得极高压缩率的同时,能展现十分丰富生动的图像,能用最少的磁盘空间得到较好的图像品质。由

关键字: s3c2416 移植 裸机开发 libjpeg

在消费电子产品中,往往都会用到音频系统来播放音乐、进行通话等多媒体应用,此外,对于一些需语音提示的产品,音频部分都是不可或缺的功能。笔者此处就s3c2416的音频驱动实现作一个简单的介绍。1. IIS音频总线s3c24

关键字: s3c2416 裸机开发 音频驱动

S3C2416裸机开发系列十八_音频驱动实现(2)标签:WM8960IIS音频驱动s3c2416裸机开发2014-06-10 09:50853人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博...

关键字: s3c2416 裸机开发 音频驱动

花了几天写了SD卡裸机驱动,现在还不完善,只支持4G以内的卡,以后再加上;现在经过修改可以写入数据了,亲测没问题.S3C6410_SDIO.C#include "s3c6410_system.h" #

关键字: s3c6410 sd卡驱动

很多的嵌入式系统都需要人机交互,对于输出设备,LCD以其显示质量高、画面效果好等优点得到了极其广泛的应用。s3c2416包含了一个LCD控制器,笔者此处就s3c2416的LCD应用作一个简单的介绍。1、LCD控制器概述1...

关键字: s3c2416 裸机开发 rgb屏 驱动显示

在嵌入式设计中,由于Nand Flash具有大容量,擦写次数高,接口简单等优点,常用作固化存储器。S3C2416支持Nand启动,因此Nand存储器可以直接保存固化代码以及其它的数据。笔者在此简单的介绍Nand flas...

关键字: nand驱动 s3c2416 裸机开发 nand启动

笔者前面章节简单介绍了s3c2416启动代码的实现过程,启动代码就是用来处理cpu体系结构中一些底层内容,一个功能强大的启动代码是可以当作bootloader(如uboot)来用的。有了启动代码,用户就可以专注于用c来作...

关键字: mdk s3c2416 启动代码 裸机开发

启动代码是处理器上电复位后最先运行的一段代码。主要是用来把处理器初始化到一个确定的状态,为c运行环境作好准备。如设置异常向量表,初始化系统时钟,初始化外部内存,把用户代码拷贝到外部内存,初始化栈,清0全

关键字: s3c2416 启动代码 流水灯 裸机开发
关闭
关闭