外设驱动 SDIO及SD存储卡

1、SDIO接口

SDIO接口如下图所示,SDIO_CK是主机到卡之间的时钟;SDIO_CMD为命令和响应信号线,主机和卡之间的命令与响应通过该引脚传输;SDIO_D[7:0]为双向数据总线,主机与卡之间的数据在这些引脚上传输。
在这里插入图片描述

2、SDIO通讯流程

SDIO总线通讯基于命令和数据传输。多媒体卡/SD/SD I/O总线上的基本事务是命令/响应事务。一般的处理过程如下:

  • 开始操作的流程为主机发送命令、SD卡向主机回复响应、主机收到响应后进行下一步操作;
  • 结束操作的流程为主机发送停止命令、SD卡向主机回复响应、主机停止操作。

1、SDIO(多个)块读取操作
流程为主机通过SDIO_CMD向卡发送命令,卡收到命令后向主机回复响应并将数据通过SDIO_D发送给主机,主机收到卡的响应后通过SDIO_D接收数据。当卡收到主机的停止命令后,向主机回复相应并停止数据传输。流程如下:
在这里插入图片描述2、SDIO(多个)块写入操作
写入流程与读取流程类似,只是数据发送由主机发送。流程如下:
在这里插入图片描述

3、命令与数据路径

1、命令路径

  • 命令和响应格式

命令是用于启动操作的令牌。命令从主机发送到单个卡或发送到所有已连接的卡。所有命令格式都为固定长度48位,其中[45:40]的6位供用户提供命令索引,[39:8]的32位供用户填充参数。命令格式如下图所示,
在这里插入图片描述SD协议中卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为了实现这些功能,在标准中定义了两种类型的通用命令:应用程序特定的命令(ACMD)和常规命令(CMD)。
当卡接收到 APP_CMD (CMD55) 命令时,卡所需的下一个命令是应用程序特定的命令(也就是SD厂商自定义的命令)。ACMD 与常规多媒体卡命令的结构相同,且 CMD 编号也可以相同。卡将其识别 ACMD 的依据是:它出现在 APP_CMD (CMD55) 的后面。如果后面紧跟 APP_CMD (CMD55) 的命令不是已定义的应用程序特定的命令,则会使用标准命令。例如,如果卡具有 SD_STATUS(ACMD13) 的定义并且接收到了后跟 APP_CMD (CMD55) 的 CMD13,则此命令被解释为SD_STATUS (ACMD13)。但是,如果卡接收到后跟 APP_CMD (CMD55) 的 CMD7,但是卡没有 ACMD7 的定义,则此命令被解释为标准的 (SELECT/DESELECT_CARD) CMD7。
要执行制造商特定的ACMD,SD卡主机必须执行以下步骤

  • 发送APP_CMD(CMD55).卡对多媒体卡/SD模块进行响应,指示已将APP_CMD位置1,并指示当前需要的是ACMD。
  • 发送所需的ACMD.卡对多媒体卡/SD模块进行响应,指示已将APP_CMD位置1,并指示接收的命令被解释为ACMD.如果发送的非ACMD,则卡将其作为普通多媒体卡命令进行处理,卡状态寄存器中的APP_CMD位保持清零.

响应也是一个令牌,它作为对先前接收命令的应答,从卡发送到主机。响应包含48位短响应和136位长响应。响应的长度由所接收到的命令决定,卡根据命令索引和类型进行不同长度的响应。
48位短响应格式为:
在这里插入图片描述136位长响应格式为:
在这里插入图片描述

  • 命令与响应传输格式

命令与响应都以串行的方式在SDIO_CMD上传输。格式如下:
在这里插入图片描述

  • 命令路径状态机(CPSM)

命令路径即为主机向卡发送命令并从卡接收响应。命令路径由命令路径状态机(CPSM)控制,写入命令寄存器并且将使能位置1后,命令传输开始。发送命令后,CPSM将状态标志置1,并且在不需要响应时进入空闲状态。如果需要响应。则等待响应。收到响应时,将比较生成的CRC代码和内部生成代码,并且将相应的状态标志置1.CPSM如下所示:
在这里插入图片描述2、数据路径

  • 数据令牌格式

数据可从卡发送到主机,或从主机发送到卡。数据通过数据线来传输。数据令牌格式为:
在这里插入图片描述

  • 数据传输格式

可以对卡数据总线宽度进行编程。如果使能了4位宽度的总线模式,则使用所有四个数据信号线(SDIO_D[3:0])在每个时钟周期内传输4个数据为。如果使能8个宽度的总线模式,则使用所有八个数据信号线(SDIO_D[7:0])在每个时钟周期内传输8个数据位。如果未使能宽总线模式,则每个时钟周期仅传输一位,且使用SDIO_D0传输。

  • 数据路径状态机(DPSM)

根据传输方向(发送或接收),数据路径状态机将变为Wait_S(发送)或Wait_R(接收)状态。当处于Wait_S状态,若FIFO内有数据,则DPSM变为发送状态并且数据路径子单元开始向卡发送数据;当DPSM变为Wait_R状态并等待起始位,在DPSM收到起始位时,将变为接收状态,并且数据路径子单元开始从卡中接收数据。DPSM以SDIO_CK频率运行,卡总线信号上的数据与SDIO_CK上的上升沿保持同步。
DPSM含有6个状态,其中

  • 空闲:数据路径处于无效状态,SDIO_D输出处于高阻态。当写入数据控制寄存器并将使能位置1后,DPSM将使用新值来加载数据计数器,根据数据方向位,将变为Wait_S或Wait_R转态;
  • Wait_R状态:如果数据计数器等于零,则 DPSM 会在接收 FIFO 为空时变为空闲状态。如果数据计数器不为零,则 DPSM 等待 SDIO_D 上的起始位。如果 DPSM 在超时之前收到了起始位,则 DPSM 变为接收状态,并加载数据块计数器。如果 DPSM 尚未检测到起始位便已超时或者发生起始位错误,则变为空闲状态并且将超时标志置1;
  • 接收:从卡收到的串行数据以字节为单位打包,并写入到数据FIFO。在块模式下,当数据块计数器达到零时,DPSM将等待直至其收到CRC代码。如何收到的代码与内部生成的CRC代码相匹配,则DPSM变为Wait_R状态。如果不匹配,则将CRC失败状态标志置1并且DPSM变为空闲状态。
  • 如果数据计数器为零,则 DPSM 变为空闲状态。如果不为零,则 DPSM 将等待直至停止发出 FIFO 空标志,并变为发送状态;
  • 发送:DPSM开始向卡发送数据,在块模式中,当数据块计数器达到零是,DPSM会发送一个内部生成的CRC代码和结束位并变为繁忙状态。
    数据路径状态机如下所示: 在这里插入图片描述

4、SD存储卡初始化及读写流程

1、卡初始化与识别
卡初始化与辨识流程如下图所示
在这里插入图片描述
(1)初始化SDIO后等待74个时钟周期后,发送CMD0使SD卡复位处于IDLE状态;
CMD0无参数与响应,格式如下:
在这里插入图片描述
(2)发送CMD8检查是否支持SD2.0协议;
CMD8有参数与响应,响应为短响应R7 。如果收到响应,则为SD2.0或更高协议且供电电压满足要求,否则为供电电压不满足要求、或者是低版本协议SD或不是SD卡。规定如下
在这里插入图片描述
CMD8的索引为8,参数的[39:20] 保留,[19:16]位指示供电电压值。
在这里插入图片描述

(3)发送CMD55和ACMD41检查SD卡工作电压是否与主机提供的一致、SD卡类型和初始化是否完成;
发送ACMD41之前,需要先发送CMD55以置位APP_CMD,CMD55的格式如图,在初始化时不需要指定RCA.
在这里插入图片描述如果发送CMD55后,没有响应则不是SD卡或电压不符合,如果上一步骤CMD8无响应但是该步骤下CMD55有响应则为低协议版本SD卡。
在发送CMD55之后,若收到响应,则可以发送ACMD41(保险起见,发送ACMD41之前可以再发送一次CMD55并等待响应)。
ACMD41命令含有参数并且需要响应,响应为短响应R3。
参数中SDSC、SDHC和SDXC是内存的容量类别。容量分类如下:
在这里插入图片描述总线速度模式如下:
在这里插入图片描述
ACMD41的参数与响应格式如下:
在这里插入图片描述收到ACMD41的回应后,检测第31位Busy Status,若为1则初始化完成,可进入下一阶段。
(4)发送CMD2获取卡识别号(CID)并进入识别状态。
一般S18R和S18A均为0,所以不用发送CMD11,可直接发送CMD2。CMD2无参数但需要响应,响应为R2且为长响应。格式如下:
在这里插入图片描述(5)发送CMD3获取卡相对地址。CMD3无参数有响应,响应为短响应R6。
在这里插入图片描述CMD3的R6响应中[39:8]的32位字段中的高16位为RCA。格式如下:
在这里插入图片描述
(6)发送CMD9获取卡CSD寄存器,CMD9有参数且需要响应。32参数的高16位为要获取CSD卡的RCA,响应为R2长响应。格式如下:
在这里插入图片描述CSD协议版本1格式及含义如下:
在这里插入图片描述主要位的含义为:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述CSD协议版本2格式及含义如下:
在这里插入图片描述主要特性为:
在这里插入图片描述在这里插入图片描述
2、数据块的读取与写入
在数据的读取与写入时,对应SDSC标志容量卡地址是指字节地址,但对于SDHC或SDXC,地址是块地址,以512字节为单位。
SD协议规定如下:
在这里插入图片描述
(1)块读取
在块读取模式中,数据传输的基本单位是块,其最大大小在 CSD (READ_BL_LEN) 中定义。如果将 READ_BL_PARTIAL 置 1,则还可以传输更小的块,这些块的开始和结束地址全部包含在一个物理块中(如 READ_BL_LEN 所定义)。在每个块的结尾会追加一个 CRC,以确保数据传输完整性。 CMD17 (READ_SINGLE_BLOCK) 会启动块读取,在完成传输后,卡将返回到传输状态。CMD18 (READ_MULTIPLE_BLOCK) 会启动多个连续块的传输。
单块读取的流程为:主机发送CMD16设置块大小,等待短响应R1,然后发送CMD17设置块地址,然后等待短响应R1,R1成功响应且无错误,则读取数据。多块的读取与单块类似,只是将CMD17替换为CMD18.
(2)块写入
在块写入 (CMD24 - 27) 期间,一个或多个数据块从主机传输到卡,并且由主机在每个块的结尾追加一个 CRC。支持块写入的卡始终可以接受 WRITE_BL_LEN 所定义的数据块。如果 CRC 失败,卡将在 SDIO_D 线上指示失败,已传输的数据将废弃而不会写入,并且将忽略所有进一步传输的块(在多块写入模式中)。
单块的写入流程为发送CMD16设置块大小,然后等待短响应R1,然后发送CMD13然后等待短响应R1确认卡状态正常,再然后发送CMD24设置块地址等待短响应R1。R1响应正常且无错误,则向FIFO写入数据发送给卡。多块写入时将CMD24替换为CMD25且当数据发送完成后需要发送CMD12终止写入操作。
所用到的CMD格式如下所示:
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值