SPI模式SD卡驱动时序分析 -----东方青 一、SD卡概述和分类 首先需要搞清楚的一件事是,所有的SD 卡均默认支持SDIO通信接口协议。而并不是SDIO接口是转为SD卡而设计。主要分为三类: (1)SD存储卡:常用的TF卡或者SD卡,支持SD存储卡1.x和2.0版本协议。 (2)MMC卡:是一种常用的Flash存储卡,通信接口为SDIO。 (3)SDIO设备:支持SDIO接口但为非存储类设备,例如无线网卡。
本文只描述SD存储卡,简称SD卡。SD卡主要分为两个版本,1.x版本和现在普遍使用的2.0版本。2.0版本是为了适应大容量SD卡提出的标准,它将SD卡按照容量的不同分为SDSC卡和SDHC卡。其中SDSC卡为标准容量卡,最大不超过2GB;容量大于2GB的SD卡都属于SDHC卡。 1、SD卡硬件接口 现在常用的SD卡分为Micro SD卡和SD卡 (1)Micro SD卡
如上图所示为Micro SD卡引脚接口规范,其分别支持SDIO通信模式和SPI通信模式。也就是说Mirco SD卡可以由SDIO通信接口驱动,也可以通过SPI通信接口驱动。 (2)SD卡
上图为SD卡引脚接口规范,其也支持SDIO通信模式和SPI通信模式。用户可以根据需要选择一种通信协议驱动SD卡工作。
2、SDIO通信模型
(1)CLK:CLK作为卡的时钟线,由主机产生固定频率的时钟,最高频率可达25MHz。对于命令线CMD和数据线而言,每个时钟周期传送1bit命令或者数据。 (2)CMD:命令信号线,SDIO接口的所有有主机发起的命令及从机对命令的响应,都是在CMD命令线上进行传输。 (3)DAT[3:0]:DAT[3:0]为SDIO接口的4根数据线。主机和从机数据的传输都是在DAT[3:0]。根据需求的不同,在应用是可分为4线制(DAT[3:0]共4根数据线都做完数据通信使用)和1线制(只有DAT[0]作为数据通信使用,其他数据线空闲)的应用。 3、SPI通信协议 对于SPI通信协议而言,就简单了。只需要确定其操作SD卡时,时钟极性和时钟相位的选择即可。如下图为SPI通信协议根据时钟极性和时钟相位不同的时序:
通过了解,当SD卡工作在SPI通信接口模式下时,其时钟极性CPOL=1,时钟相位CPHA=0。所以在空闲是时钟线SCK为高电平,通信是,时钟的第一个边沿采集数据。 二、硬件原理
如上图可知,在LPC54110板卡上,存在SD卡和SPIFlash共用SPI通信总线。当TF_CS被拉低电平时,SD卡上的SPI通信接口被使能,可以和MCU进行通信。 三、SD卡SPI通信的配置操作 1、SPI通信接口初始化
因为在笔者板卡的SPI总线上同时挂载SD卡和SPIFlash,各自器件有不同的通信速率,所以可以通过在选择与设备通信时重新设备通信的时钟频率。如下图:
2、SPI通信数据交互
四、SD卡操作流程 1.SD卡切换到SPI模式状态 通过分析《Simplified_Physical_Layer_Spec》手册,其状态图如下:
SD卡上电时,默认处于SDIO通信接口1线制模式下,通过将其配置进入IDLE空闲模式下,然后可以设置其为SPI模式先通信;然后片选(CS为0)SPI设备,就工作在SPI模式下了。开始是,2.0版本的协议要求发送一个CMD8.然后可以发送CMD58,确定当前SD卡所支持的电压范围、容量和卡的类型(SD卡还是MMC卡),确定当前主机是否支持这张卡。 2.SPI模式SD卡初始化操作流程 通过分析《Simplified_Physical_Layer_Spec》手册,SPI模式SD卡的初始化流程如下图:
(1)如上图可知,当SD卡工作早SPI通信模式后,可以对其发送命令CMD8,这是2.0版本的协议强制要求的,用来区分当前的SD卡是否支持2.0版本的协议。如果发送CMD8之后,SD卡无响应,则此SD卡支持1.x版本的协议,不支持2.0版本协议;如果SD卡有响应,则说明此卡支持2.0版本的协议。 (2)通过命令CMD58(READ OCR)读取OCR来辨别当前SD卡的工作电压范围是否兼容当前主机的工作电压。 (3)发送命令ACMD41,用来启动初始化并且确认SD卡初始化是否完成。2.0版本的协议强制在发送ACMD41之前必须先发送CMD8,读取CMD8的参数扩展了CMD58和ACMD41。当发送ACMD41后,返回的参数中,HCS=1时,表示主句支持高容量存储卡,否则不支持。在通过循环发送CMD58或者CCS的值,如果CCS=0,这此卡为标准容量;如果CCS1,则此卡为大于2GB容量的卡。在空闲状态IDLE下,SD卡使用R1作为回应,如果ACMD41初始化完成,则SD卡通过ACMD41来通常主机已经初始化完成。所以可以一直循环发送ACMD41命令,当返回的为为1时,表明还在初始化;知道繁华的为为0时,表示初始化完成。在这里需要注意的是,SD卡在OCR中检查HCS位,只有在第一个ACMD41的时候检查。重发发送ACMD41是,主机不得发出CMD0命令。 3.SPI通信模式下SD卡的部分命令 4.SD卡R1的响应格式 5.SD卡工作状态
如上图表述了SD卡的工作状态和操作模式之间的对应关系。 6. 五、SD卡驱动程序分析 1、复位SD卡 (1)SD卡上电后,SPI通信片选线CS拉高,先发送大与74个时钟周期(因为SD卡有供电电压上升的过程需要大于64个时钟周期,之后的10个时钟是用来与SD卡同步的),。 (2)然后SPI通信片选线拉低,通过发送CMD0,使得SD卡进入IDLE空闲模式。
如上图所示,一直给SD卡发送CMD0命令,然后检测其返回的参数R1的0位,判断SD卡是否进入IDLE模式,如果R1[0]=1,则表明SD卡已经进入IDLE状态。
如上图R1的0位就表示SD卡IDLE的状态标志 2、识别SD卡类型 通过发送CMD8来分辨SD卡的类型,是支持V2.0还是V1.x或者MMC卡,还可以检测CMD8响应返回的数据R7判断是否支持给定的工作电压范围。先看看R7的参数格式:
如上图为R7所表示的响应参数格式,其中包含了OCR值,表示了状态的检测、电压的兼容和容量是否支持。 R7为5Byte,在发送CMD8后,SD卡响应,发送回来的第一个字节应该是R1,之后的4个字节就包含了Check voltage和Check pattern。
(1)如果SD卡支持当前的电压,就好返回R7,并且包括CMD8的参数部分,其中包括check voltage和check pattern。 (2)如果SD卡不支持当前的工作电压,则不会返回任何响应信息,继续处在IDLE状态。如果是V1.x版本的SD卡也不会有响应。 (3)在PLV2.0(physical layer version2.0)下,首次运动ACMD41之前,必须执行CMD8指令,用以初始化SDHC卡,SDHC卡根据是否接收到CMD8指令来鉴别控制器是否支持PLV2.0版本的协议。使用低电压的控制器也必须早ACMD41命令之前发送CMD8,避免可以工作在两种电压模式下的SD卡因为没有接收到CMD8,而默认工作在高电压环境下,被误认为是只支持高电压的工作模式。
It is recommended to use '10101010b' for the 'check pattern'. 建议检测参数为10101010b,即为0xAA。 下图为操作程序:
3、通过ACMD41初始化SD卡 SD卡的初始化从接收到ACMD41开始,ACMD41指令的HCS(Host Capacity Support)位如果设定为1,表明控制器支持SDHC卡,否则不支持。 SD卡的初始化和识别过程: 在CMD8命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS部分在响应里多了CCS(Card Capacity Status)部分。HCS参数会被不响应CMD8命令的SD卡所抛弃。控制器想不响应CMD8的卡发送ACMD41指令时,HCS位应该设置为0.如果向SDHC卡发送HCS位为0的ACMD41命令,SDHC卡返回的响应中,其busy标识位永远为0,表示当前忙状态。HCS标识位用来表明SD卡是否已经完成初始化,如果为完成,HCS位为0,初始化完成HCS位1。当HCS为0时,控制器会重复发送ACMD41命令,知道初始化完成。SD卡只检查首次接收到的ACMD41指令的HCS位。按照前面的流程图分析,实际上可以发送ACMD41用来分辨SD卡是否为高容量卡。
操作程序如下:
如上三图所示,在流程图中说明如果主机支持大容量SD卡就讲HCS位置1,然后通过ACMD41发送到SD卡,但是因为ACMD41属于应用型命令,所以需要在发送ACMD41之前,先发送CMD55表明后面发送的ACMD41是应用型指令,所以实际上是先发CMD55再发ACMD41。一直发送这两条指令,知道初始化成功,SD卡处于Ready状态。所以接收到响应为0(即HCS位为0)时,就可以开始读取OCR信息,并检测bit30位(CCS位),如果此位值为1,就是高容量SD卡;如果为0,则为标准SD卡。读取OCR的指令是CMD58。其响应为R3。
前面的R1应该为0,之后再接收4Byte的数据,并判断bit30位,就可以判断是SDV2.0还是SD2.0HC了。
到此!基本上SD卡的初始化就结束了。 剩下的操作无非是读取SD卡一个扇区的数据、写一个扇区的数据吗,读取SD卡ID、状态等等了。这些不再详细说,具体分析一下LPC5114板卡的源代码即可。SD卡的难点实际上就是从上电启动到初始化完成的整个过程。
|