为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

SD卡驱动流程

2012-07-09 15页 pdf 665KB 35阅读

用户头像

is_349935

暂无简介

举报
SD卡驱动流程 SD 卡驱动编写流程 现在对SD卡驱动编写做个总结,以及本人在调试中遇到的问题。先介绍一下SD卡规格,其 全称Secure Digital Memory Card 简写SD,是以Flash Memory 为基础的存储卡,自带 控制器。所以编写的驱动是针对控制器接口的,不是针对Flash Memory的。 SD卡支持三种驱动模式,见下图! 外观图和PIN定义看下图: 分别为SPI模式和SD BUS模式,不同的模式,注意相同编号的 PIN意义不一样! 下面以SD 1bit mode 为例子介绍怎么驱动SD 卡。 S...
SD卡驱动流程
SD 卡驱动编写流程 现在对SD卡驱动编写做个,以及本人在调试中遇到的问题。先介绍一下SD卡规格,其 全称Secure Digital Memory Card 简写SD,是以Flash Memory 为基础的存储卡,自带 控制器。所以编写的驱动是针对控制器接口的,不是针对Flash Memory的。 SD卡支持三种驱动模式,见下图! 外观图和PIN定义看下图: 分别为SPI模式和SD BUS模式,不同的模式,注意相同编号的 PIN意义不一样! 下面以SD 1bit mode 为例子介绍怎么驱动SD 卡。 SD卡是以命令驱动的,所以应先了解命令的基本格式,见下图! 其中需要用到CRC7 下面的图是用示波器实际采集到的 CMD6发送时的波形 图例说明: 深蓝为CLK信号 浅蓝为CMD信号 红色CMD开始 黄色CMD结束 结合上面的图很容易理解命令发送格式 CRC7码可以用下面函数计算 另外还会用到CRC16码,在发送数据和接收数据时需要用到,可以用查方法,那样速度最快 SD卡命令实际使用到的命令有 32条,其中基本命令 25条,用户应用命令7条。 下面表中详细介绍了每条命令的功能 下面的图表为用户命令: 要运行用户命令需要先发送 基本命令CMD55。每次运行都需要先发送 CMD55 其中 R1, R2, R3, R6 为返回数据格式 SD卡内部寄存器介绍: R2,R3,R6,能返回寄存器状态或使用 CMD9.CMD10读寄存器内容 下面的截图为发送 CMD24后 ,SD卡回复的数据信息 图例说明: 深蓝为CLK信号 浅蓝为CMD信号 红色CMD开始 黄色CMD结束 紫色为DATA0 了解命令发送格式后,就可以继续下一步了,向 SD卡发送初始化命令和读写数据了,调试过程 中这一步很容易出问题,主要是时序匹配不上,发送命令后 SD卡没有反映,不过 CMD0是个例 外 用I/O模拟CLK,CMD时 需要注意 数据是上升沿有效,下降沿触发。 SD卡操作总流程! 驱动模式选择 初始化SD卡 发送SD卡支持的操作命令 退出CD卡操作 SD卡支持级联,可以在总线上挂多个设备,通过初始化命令选择卡,状态转换命令退出。不支 持单个SD卡模式选择。 驱动模式选择: SD卡上电时 如果CS接地,SD卡将进入SPI模式,CS接高电平,将进入 SD BUS模式 在SD BUS模式时 发送CMD0 SD卡不会回应,在SPI模式时 发送CMD0, SD卡能回应R1信息。 初始化SD卡: 进入SD BUS 模式后,发送CMD0复位SD卡。由于处于SD BUS模式,SD卡此时不会回复 信息。发送命令的时候需要注意 SD卡命令状态,不同的状态只能响应特定的命令 ,下面为初始 化命令发送流程: CMD0 复位SD卡 CMD55 用户命令 CMD41 SD卡工作电压设置命令 CMD2 从默认地址获取 SD卡ID CMD3 获取一个新地址 CMD9 从新地址读取SD卡ID CMD7 选择新地址的SD卡为有效卡 CMD55 用户命令 CMD6 设置数据位宽 CMD16 设置BLOCK长度 CMD13 读取当前SD卡状态 初始化完成 初始化完成后,就可以对 SD卡进行读写操作了 。 调试的时候需要注意 ACMD41 用户命令,只有这个命令操作成功后,下面的 CMD2才能响应, ACMD41命令失败时,需要重试,从 CMD0执行到ACMD41命令执行成功需要大楷 300ms。 这个过程中的SD卡状态转换如下图: 发送SD卡支持的操作命令: 不同的SD卡所支持的命令稍有不用,但基本命令都是支持的。详细支持那类命令要从 SD卡 的ID中获得。这一步主要是要调通 读,写,擦,这三个功能,这个三个命令调通后其它命令大 同小异。读CMD17, 写CMD24, 擦CMD38. 需要注意的是读写命令都是单个 BLOCK操作,擦可以多个BLOCK操作,需要先设置开始地址 命 令CMD32, 结束地址命令CMD33。最后发送CMD38指令擦除。下面为详细操作流程: 先说一下SD卡数据发送格式,见下图, sbit1 和sbit4 MODE的区别! 数据包以512byte为基本单位发送 读的操作流程:CMD17 初始化正确后 发送CMD17 读指令 等待SD卡反馈状态数据(反馈数据发送在 CMD信号线上) 等待SD卡的DATA0信号为“0”(读数据的开始信号) 确认收到数据的开始信号,不然继续等待。( 超时1ms失败) 接收数据515byte 。(其中513和514字节为CRC16码,515结束字) 计算CRC16码,效验数据正确否? 退出读函数命令结束 下图为执行CMD17的截图: 图例说明: 深蓝为CMD信号 浅蓝为DATA0信号 红色段为CMD17命令 黄色段为SD卡回复的状态数据 紫色段为开始读取 SD卡数据 绿色为CLK信号 读命令需要注意的是等待回复问题, “0”为start bit; 结合上面的流程说明和 CMD17的截图,编写代码就容易了。 写的操作流程:CMD24 初始化正确后 准备好要发送的数据和 CRC16效验码 发送CMD24 写指令 等待SD卡反馈状态数据(反馈数据发送在 CMD信号线上) 写SD卡的DATA0信号为“0”(写数据的开始信号 ) 写数据515byte 。(其中513和514字节为CRC16码,515结束字) 准备接收SD卡反馈的写状态字 (反馈数据发送在 DATA0信号线上) 判断接收到的状态字是否为 “0,1,0”如果是则写正确,不然则出错 退出写函数命令结束 下图为CMD24的截图: 图例说明: 深蓝为CMD信号 浅蓝为DATA0信号 红色段为CMD24命令 黄色段为SD卡回复的状态数据 紫色段为开始写数据到 SD卡 绿色为CLK信号 写命令和读命令差不多,但这个命令本人则调试了很久才调通,主要是在 SD卡回复后CPU对卡 的写操作要延迟7ms之多,黄色段到紫色段的严重超时,正常情况看上图,基本没有延迟,具 体 原因跟(判断状态函数)有关系。 本人用的调试系统为 (ARM 44B0 60M+8M SDRAM+2M ROM) 擦除块的操作流程:CMD32 CMD33 CMD38 初始化正确后 发送CMD32命令指定擦除块的开始地址 发送CMD33命令指定擦除块的结束地址 发送CMD38命令 擦除开始 接收SD卡返回的状态字 命令结束 下图为整个擦除过程中的截图 图例说明: 浅蓝为CMD信号 红色段为CMD32命令和回复信号 黄色段为CMD33命令和回复信号 棕色为CMD38命令和回复信号 不用关注紫色 绿色为CLK信号 擦除命令比较容易处理,一般命令正确发送 ,就能执行。其他命令如连续读,连续写,都大同小 异,需要注意的是连续写或读 需要用CMD12停止数据发送或写的状态,转换到空闲状态。 单个块读或写不需要停止命令。 退出CD卡操作: 如果总线上挂有多个 SD卡,就需要用CMD7命令退出当前SD卡,从而选择其他的 CD卡操作。 CMD7命令为 选择卡或取消卡,在初始化的时候发送 CMD7命令,SD卡将进入数据发送模式,在数 据模式里发送CMD7则退出当前卡的操作。需要注意的是,在数据模式里不同的状态只支持特定 命 令,如在数据模式里发送读 ID指令则无效。 总结: 该驱动流程主要是针对 I/O模拟SD BUS时序写的,如果使用专用 SD桥接IC的话,则编程方法 有所不同,但命令操作顺序是一样的。如果 CPU支持SPI模式则推荐用,如果采用 I/O口模拟时钟, 延迟不容易控制,特别是在写命令的时候,特容易出错。 SPI模式和SD BUS 1bit MODE的操作效 果一样,只是SPI模式支持的命令多一点。 其它并无区别。I/O口模拟时需要注意上拉电阻,不 加的话,读的数据容易出错。另外在调试 SD卡驱动的时候发现,在(状态检测函数)里加 printf 函数会增加不稳定行。程序经常因此跑飞, WHY? 这个问题我也没有搞清楚!去掉后就一切正常 。 我们经常用printf函数来打印程序运行状态,虽然方便直观,但是用的太多,问题似乎也多多。 在这个SD卡驱动编写调试过程中,表现很明显,很多次程序跑飞就是因为它。 Jack Peng 2005 10.19 SD卡驱动编写流程
/
本文档为【SD卡驱动流程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索