海川先生的笔记 https://passport2.21ic.com/?786816 [收藏] [复制] [RSS]

日志

stm32 SDIO方式驱动SD卡之SD协议

热度 1已有 3674 次阅读2013-11-7 22:44 |个人分类:stm32|系统分类:单片机

写在前面的话
试过官方的V4.5.0和V4.3.0都没成功,偶然间找到了V4.4.0竟然能用(3.5的库),激动ing,接下来就认真分析一下代码吧。当然分析代码前要先了解一下SD的协议和硬件接口。
1 SD的协议
  1.1  SD卡协议目前已经发展到了V4.1,可以去SD协会官网下载.官网的文件N多个,此刻最需要的是 Part1 Physical Layer...这个.其他的文档作用不妨参考下图了解一下吧.不过下载的是精简版,每年交N多美金成为SD协会的会员才能搞到完整版.

                                                                                                                                                                 SD说明 文档结构

  1.2  SD卡分类.从容量上分有  标准容量SDSC(<=2G);大容量SDHC(2G到32G);超大容量SDXC(32G到2T),一般卡面上会有HC或XC等字样.从速度上可以分为class2,class4,calss6,class10(10MHZ/Sec).

       这里的协议适用于标准SD,miniSD和MicroSD.

  1.3  总线协议

        总线上的命令和数据都是由一个以0开头以1结尾的bit Stream构成的.命令是一个操作的开始点,它在CMD line上串行传输,由host发送给SD卡.命令又分为广播命令和点对点命令;响应是由某个目标卡或者总线上的所有卡针对之前收到的命令回复给Host的,响应也是在CMD line上传输;数据通过数据线(Dat0-Dat3)传输,可以选择一位数据线也可以选择4位宽的数据线,数据的传输的双向的,Host由卡读数据时,数据由卡到Host.Host向卡写数据时,数据由Host到卡.

               

                                                                                                                        无响应或无数据操作

        SD卡总线上最基本的传输方式就是命令和响应方式,host发命令然后SD卡给予相对应的响应.数据是以数据块的方式传输的,可以单独一个块传输也可以多块传输.同样的数据量多块传输要比一个块一个块传输快,多块传输以CMD line上的停止命令结束.下面是多块读和多块写的操作图示.

          一个命令的组成看下图,由1位起始位,参数,7位CRC,1位结束位构成,共计48bits

         响应分短响应(48bits)和长响应(136bits)内含参数和CRC.看图如下:

        命令在CMD line上是MSB在前LSB在后.

     数据在数据线上的传输格式分为两大类,分别是Usual Data(8位)和wide width data(512位) 每大类由分为standard bus 1bit和 wide bus 4bit两类.看图

  1.4 引脚功能定义

           SD内部的寄存器和内部结构框图

   

2 SD功能描述

2.1 基本描述

     host和SD之间的通讯都是有host控制的,host发送两种命令:广播命令和点对点命令.

     SD和host之间有两种操作模式,识别模式和数据传输模式.

     识别模式:复位后进入识别模式,在识别模式主要是寻找bus上的SD卡,SD卡会一直停留在识别模式直到收到主机给他分配的相对地址RCA(用CMD3实现).

     数据传输模式:收到CMD3就会进入数据传输模式.

      SD卡的状态和操作模式之间的对应关系如下图

         

2.2 卡识别模式

      在卡识别模式,host复位所有的卡,验证他们的操作电压,并向每个卡发布相对地址, 所有的数据通信只在CMD line 进行传输.

      CMD0 是软件复位命令.除了卡当前处于在Inactive state外,CMD0都会使SD卡进入Idle state.

      SD卡上电后都会处于Idle state,即使卡之前是Inactive state.

      SD卡上电或接收到CMD0之后,所有卡的CMD line都处于输入模式,等待命令的起始位'0',卡初始化用的RCA=0x0000.stm32的引脚配置成什么什么模式参考下图

        

      操作电压的验证:上电或复位后双方不知道对方能提供货能支持的电压范围,host发送一个带有操作电压范围参数的命令CMD8给SD卡,SD卡通过分析CMD8的参数检查操作电压的合法性,电压参数在VHS[3:0]中,这四bits中只能由1bit是'1',如果卡能支持host提供的电压,则会给予一个响应.否则不会响应并停留在idle state.

       初始化SDHC和SDXC时,发送第一个ACMD41之前必须发送CMD8,能够接受CMD8并给予正确响应,说明该卡支持Physical layer Version 2.00或Physical layer Version 2.00之后的协议,并且卡使能一些新的功能.

       ACMD41参数中需设置HCSbit和OCR[23:0],OCR[23:0]会设置一个VHS[3:0]指定范围中的一个具体值.该命令的功能是辨出那些不支持host提供电压的卡,这些卡脱离总线进入Inactive state.ACMD41是特殊应用型命令,发送特殊应用型命令前必须发送CMD55,CMD55的参数是RCA=0x000.

       下面是ACMD41命令描述和OCR寄存器描述

       SD卡状态转移图(识别模式)

          SD卡初始化和识别的处理过程:初始化从ACMD41开始,该命令设置HCS(host支持的容量标志)和OCR寄存的的23:0bit。HCS=1 表示host支持SDHC或SDXC,HCS=0表示host既不支持SDHC也不支持SDXC.接收到CMD8会扩展ACMD41的功能.不对CMD8响应的卡不理睬HCS的值,然而host应该HCS=0,如果卡不对CMD8进行响应,SDHC不在乎HSC的值,但host如果设置HCS=0,那会SDHC和SDXC类型的卡永远不会转入到 ready state(busy=0),OCR寄存器中的busy bit用来指示SD卡是否初始化完成,busy=0,初始化仍在进行中;busy=1,初始化已经完成.卡初始化应该在ACMD41发出来1秒钟内完成,卡会在ACMD41第一次发出带有voltage window的参数时检查操作条件和OCR中的HCS位.在重复发ACMD41的过程中,SD卡不接收其他的命令除了CMD0.

       如果卡回应了CMD8,那么对ACMD41的响应中包含有CCS(卡容量标志)位,当busy=1时CCS位有效,CCS=0,sd卡为SDSC卡;CCS=1,SD卡为SDHC或SDXC.

       Host对总线上的新卡完成相同的初始化的过程,不兼容的卡进入Inactive state.接下来Host发布CMD2给所有的SD卡,为了获得他们的唯一卡识别号(Card ID---CID).SD卡响应过自己的CID后进入Identification state.接下来Host发出CMD3,要求各SD卡发布自己新的RCA(比CID短,用在将来的数传输模式),等到RCA被Host接收的时候,SD卡进入Ready state.之后哦如果host想给卡一个新的RCA,那么就发送一个CMD3给目标卡,最后一个RCA才是卡的真是RCA.

        Host重复识别模式(CMD2--CMD3循环),完成对系统中每个卡的识别.

            下图是卡初始化和识别过程的流程图(写驱动的重要参考)

          关于ACMD41这个命令:如果在第一次ACMD41命令参数里的voltage window field(bit23:0)不为0,这时第一个ACMD41就开始初始化,参数中其余的位有效.接下来重复的ACMD的参数应该跟第一次ACMD41的参数一样.

       下图时ACMD41的参数格式和他的响应R3

         上图中的XPC控制SDXC的功耗,对于32G以下的卡没有影响,SR18跟UHS-I卡有关,此刻不关心它.

2.3 数据传输模式

     由于一些卡在识别模式对操作频率有限制,所以直到CMD3结束SD卡的频率应在Fod(400K)以下.在数据传输模式下方可以在Fpp的频率操作SD卡.Host发送CMD9命令获得SD卡的CSD(card special data) 寄存器的内容,比如数据块长度,卡容量等等.

     host发送CMD4广播命令所有已识别卡的driver stages,根据布线layout和总线上卡的数量和数据传输频率编程SD卡的DSR寄存器.时钟频率有Fod到Fpp的转变也是在此时发生的.CMD4命令对host和SD卡来说都是可选的.

      CMD7用来选择一个特定的目标卡使他进入 transfer state,同一个时间系统内只能有一个卡处于transfer state ,选中一个卡后其他卡都回到ready state.带RCA=0x0000的CMD7命令使系统中的所用SD卡都进入到ready state.

      下图时数据传输模式 卡状态的转移图

          数据转移模式下的SD卡状态转移关系总结如下:

       所有的数据读写命令均可以被CMD12中断,写数据是应该先中断写操作,而后才能执行CMD7重新选择另一个SD卡;写数据过程中,一旦数据传输结束SD卡将离开write state转向program state(传输成功时)或转向transfer state(传输失败);如果数据块传输被停止,那么最后一个数据块是有效的,数据将被存储;SD卡为块写操作提供了缓存空间,这就允许当前块正在编程时下一个块被发送至SD卡,但当缓存区已满并且SD卡正处于编程状态,DAT0 line将会保持低电平;写CSD,写保护,擦出功能不提供缓存区,这就是说当正在执行上述命令时不会接受其他数据传输命令,DAT0保持低电平;卡正处于program state时参数设置命令不允许使用,参数设置命令有CMD16(设置块小),CMD32(擦出开始地址命令),CMD33(擦出结束地址命令),读命令也不被允许在program state中.CMD7后不会立即停止擦出和编程操作;复位命令(CMD0和CMD15)将会停止任何等待和编程操作,这样操作破换SD卡的数据内容,host有责任阻止这样的情况发生;

2.4  宽总线的选择

      在卡未被LOCK且处于transfer state时用ACMD6选择宽总线(4bits DAT3--DAT0),复位或上电后

默认1bit宽度(DAT0);

2.5  数据块的读写,和擦出就是那几个命令,查阅文档可得知,说明一点的是 擦出命令又三条,这三条命令时有先后顺序要求的.

2.6  数据保护这一部分就不学习了.

2.7  CMD8的补充介绍

       CMD8命令的定义为了初始化兼容V2.0版本后的SD卡,CMD8在Idle state有效,他有两个作用:1电压检查;2扩展现有的命令和响应.CMD8的命令结构如下:

       当卡处于Idle state时,host应该在ACMD41之前发送CMD8,参数中的check pattern为任意8bit值,卡检查是否可以在host提供的电压下运行,可以运行响应命令R7,响应中的参数包含跟命令中一样的VHS和check pattern;卡不支持host提供的电压不予以响应且停留在Idle state.

2.8  SD响应格式详解,命令详解,状态转移,CCCs in SD Mode,Card status和SD status参考文档

2.9  SD卡上电时间也是由要求的

      SD卡从电压达到VDDmin开始1ms内准备好接收第一个命令.

到此为止,SDIO操作SD卡基本就这么多了,SPI方式操作文档里也有详细的描述.

      

     

         


      


         

        



路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 flyheart33 2014-3-22 14:38
讲的不错,受用,SD卡难啊