四.SDIO功能框图(重点)
SDIO包含2个部分:
● SDIO适配器模块:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。
● AHB总线接口:操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设),并产生中断和DMA请求信号
复位后默认情况下SDIO_D0用于数据传输,初始化后主机可以改变数据总线的宽度(SD卡1根或4根数据线)。
如果一个SD卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0或SDIO_D[3:0] (使用一根或四根数据线)。所有的数据线都工作在复用推挽模式。
命令线也都工作在复用推挽模式
时钟
SDIO使用两个时钟信号:
● SDIO适配器时钟(SDIOCLK=HCLK)
● AHB总线时钟(HCLK/2)经过了分频
SDIO_CK是卡的时钟线:每个时钟周期上升沿在命令和数据线上传输1位命令或数据。对于SD卡,时钟频率可以在0MHz至25MHz间变化。
引脚定义
接下来就是将SDIO框图拆分研究各个模块:
1.SDIO适配器
● SDIO适配器模块:实现所有SD卡的相关功能,如时钟的产生、命令和数据的传送,而STM32可以通过AHB接口读写适配器寄存器从而控制SDIO外设读写SD卡(发送命令,接收响应,数据传输)。
适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK)
SDIO适配器包含以下5个部分
● 适配器寄存器模块
● 控制单元
● 命令通道
● 数据通道
● 数据FIFO
1.适配器寄存器模块
适配器寄存器模块包含所有系统寄存器。
2.控制单元
时钟管理子单元产生和控制SDIO_CK信号。SDIO_CK输出可以使用时钟分频或时钟旁路模式。
在电源关闭和电源启动阶段,电源管理子单元会关闭卡总线上的输出信号则下述情况下没有时钟输出:
● 复位后
● 在电源关闭和电源启动阶段
● 当启动了省电模式并且卡总线处于空闲状态(命令通道和数据通道子单元进入空闲阶段后的8个时钟周期)
3.命令通道(重点)
命令通道单元向SD卡发送命令,并接收SD卡的响应,命令与响应都使用SDIO_CMD(命令线)进行传输。
1.主机(STM32SDIO外设)发送命令给SD卡
1)命令参数寄存器
2)命令寄存器(命令索引(6位),命令使能位ENCMDcompl)
SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)。
命令的主体包括:命令号,命令参数/地址信息,其他的(起始位,传输标志,CRC校验,终止位)不管,后面再讲。
如果命令不带参数,那SDIO参数寄存器默认为全1就好了
2.主机(STM32SDIO外设)接收SD卡的响应
1)命令响应寄存器
2)SDIO相应寄存器1~4
SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。(关于响应与命令后面马上讲)
现在只需要知道,响应由SD卡也是通过CMD(命令线)传输到SDIO(响应中的命令号存放在SDIO的命令响应寄存器中(如果响应不带命令号则不用管就好了),SD卡的状态则存放在SDIO 响应寄存器1~4)
主机接收SD卡响应的流程:
3.命令通道状态机(CPSM)
当写入命令寄存器并设置了使能位,开始发送命令。命令发送完成时,命令通道状态机(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。
一般发送命令接收响应过程
如果命令寄存器中设置挂起位,CPSM进入挂起(Pend)状态并等待数据通道子单元发出的CmdPend信号,在检测到CmdPend信号时,CPSM进入发送(Send)状态,这将触发数据计数器发送停止命令的功能
当进入等待(Wait)状态时,命令定时器开始运行,当CPSM进入接收(Receive)状态之前,产生了超时,则设置超时标志并进入空闲(Idle)状态。
注: 命令超时固定为64个SDIO_CK时钟周期。
然后那些状态机CPSM被关闭,CRC校验失败等都会回到空闲状态
最后这个发送命令等待响应的过程,有很多状态感觉会很复杂,其实我们只有启用了CPSM状态机可以不用管这些状态转化,我们只管发送命令,CPSM状态机会帮我们处理好这些状态。
4.命令通道状态标志
5.CRC校验
CRC发生器计算CRC码之前所有位的CRC校验和,包括开始位、发送位、命令索引和命令参数或卡状态)。对于长响应格式,CRC校验和计算的是CID或CSD的前120位;注意,长响应格式中的开始位、传输位和6个保留位不参与CRC计算。
CRC反正不用管,硬件会帮我们自动校验
4.数据通道
在时钟控制寄存器中可以配置卡的数据总线宽度。如果选择了4位总线模式,则每个时钟周期四条数据信号线(SDIO_D[3:0])上将传输4位数据;如果没有选择宽总线模式,则每个时钟周期只在SDIO_D0上传输1位数据。(数据传输可以选择1根或4根数据线关于SD卡)
1.数据FIFO
数据FIFO(先进先出)子单元是一个具有发送和接收单元的数据缓冲区。
FIFO包含一个每字32位宽、共32个字的数据缓冲区,和发送与接收电路。因为数据FIFO工作在AHB时钟区域(HCLK/2),所有与SDIO时钟区域(SDIOCLK)连接的信号都进行了重新同步。依据TXACT和RXACT标志,可以关闭FIFO、使能发送或使能接收。TXACT和RXACT由数据通道子单元设置而且是互斥的:
─ 当TXACT有效时,发送FIFO代表发送电路和数据缓冲区
─ 当RXACT有效时,接收FIFO代表接收电路和数据缓冲区
发送FIFO:当使能了SDIO的发送功能,数据可以通过AHB接口写入发送FIFO。
发送FIFO有32个连续的地址。发送FIFO中有一个数据输出寄存器,包含读指针指向的数据字。当数据通道子单元装填了移位寄存器后,它移动读指针至下个数据并传输出数据。如果未使能发送FIFO,所有的状态标志均处于无效状态。当发送数据时,数据通道子单元设置TXACT为有效。
接收FIFO:当数据通道子单元接收到一个数据字,它会把数据写入FIFO。
写操作结束后,写指针自动加一;在另一端,有一个读指针始终指向FIFO中的当前数据。如果关闭了接收FIFO,所有的状态标志会被清除,读写指针也被复位。在接收到数据时数据通道子单元设置RXACT。
下表列出了接收FIFO的状态标志。通过32个连续的地址可以访问接收FIFO。
2.数据通道状态机(DPSM)
根据传输的方向(发送或接收),使能时数据通道状态机(DPSM)将进入Wait_S或Wait_R状态:
● 发送:DPSM进入Wait_S状态。如果发送FIFO中有数据,则DPSM进入发送状态,同时数据通道子单元开始向卡发送数据。
接收:DPSM进入Wait_R状态并等待开始位;当收到开始位时,DPSM进入接收状态,同时数据通道子单元开始从卡接收数据
DPSM工作在SDIO_CK频率,卡总线信号与SDIO_CK的上升沿同步。DPSM有6个状态(这下有的看了),如下图所示:
数据控制寄存器
● 空闲(Idle):数据通道不工作,SDIO_D[7:0]输出处于高阻状态。当写入数据控制寄存器并设置使能位时,DPSM为数据计数器加载新的数值,并依据数据方向位进入Wait_S或Wait_R状态。
● Wait_R:如果数据计数器等于0,当接收FIFO为空时DPSM进入到空闲(Idle)状态。如果数据计数器不等于0,DPSM等待SDIO_D上的开始位。如果DPSM在超时之前接收到一个开始位,它会进入接收(Receive)状态并加载数据块计数器。如果DPSM在检测到一个开始位前出现超时,或发生开始位错误,DPSM将进入空闲状态并设置超时状态标志。
下面数据长度寄存器与数据计数寄存器详情看图就不在赘述了,关于这些寄存器会在最后的结构章节详细讲解。
● 接收(Receive):接收到的串行数据被组合为字节并写入数FIFO。根据数据控制寄存器中传输模式位的设置,数据传输模式可以是块传输或流传输:
─ 在数据块传输模式下,当数据块计数器达到0时,DPSM等待接收CRC码,如果接收到的代码与内部产生的CRC码匹配,则DPSM进入Wait_R状态,否则设置CRC失败状态标志同时DPSM进入到空闲状态。
● Wait_S:如果数据计数器为0,DPSM进入空闲状态;否则DPSM等待数据FIFO空标志消失后,进入发送状态
● 发送(Send):DPSM开始发送数据到卡设备。根据数据控制寄存器中传输模式位的设置,数据传输模式可以是块传输或流传输:
─ 在块模式下,当数据块计数器达到0时,DPSM发送内部产生的CRC码,然后是结束位,并进入繁忙状态
● 繁忙(Busy):DPSM等待CRC状态标志:
─ 如果没有接收到正确的CRC状态,则DPSM进入空闲状态并设置CRC失败状态标志。
─ 如果接收到正确的CRC状态,则当SDIO_D0不为低时(SD卡不繁忙)DPSM进入Wait_S状态。(一般情况)
当DPSM处于繁忙状态时发生了超时,DPSM则设置数据超时标志并进入空闲状态。
当DPSM处于Wait_R或繁忙状态时,数据定时器被使能,并能够产生数据超时错误:
─ 发送数据时,如果DPSM处于繁忙状态超过程序设置的超时间隔,则产生超时。
─ 接收数据时,如果未收完所有数据,并且DPSM处于Wait_R状态超过程序设置的超时间隔,则产生超时
数据可以从主机传送到卡,也可以反向传输。数据在数据线上传输。数据存储在一个32字的FIFO中,每个字为32位宽,SD卡可以拉低SDIO_D0数据线表示卡正在忙碌.
最后反正数据传输中的状态怎么复杂,其实数据通道状态机(DPSM)会帮我们处理好这些状态的转换,我们只需要准备好发送和接收数据就好了
实在理不清清楚就了解一下,大概知道用那些寄存器位控制。
五.命令与响应
SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备(SD卡)发送的,寻址命令是指定某个地址设备进行命令传输。
1.命令格式
SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)
1.起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。
2.传输标志:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD 卡,该位为 0 时表示响应,方向为 SD 卡传输到主机。
3.命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。
命令号:它固定占用 6bit,所以总共有 64 个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于 SD 卡操作,只是专门用于 MMC 卡或者SD I/O 卡。(有些命令具有参数有些命令没有参数)
地址/参数:每个命令有 32bit 地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit 用于指定参数,而寻址命令这 32bit 用于指定目标 SD 卡的地址。
CRC7 校验:长度为 7bit 的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。
2.命令类型
SD 命令有 4 种类型:
1.广播命令(bc),无响应 — 广播命令只有当所有的 CMD 线都一起连到主机上时才会用。如果是分开的,那么每张卡单独处理命令。
2.广播命令,带响应(bcr) — 所有卡同时响应,既然 SD 卡没有开漏模式,这种命令应该是所有的命令线都是分开的,命令也会每张卡分开接收和响应。
3.寻址命令(ac,点对点) — 没有数据在 DAT 线上
4.寻址数据传输命令(adtc) — 有数据在 DAT 线上
所有命令和响应都是通过 SD 卡的 CMD 线发送的。命令的发送总是从最左边的那一位开始
另外,SD 卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为实现这些功能,在标准中定义了两种类型的通用命令:
特定应用命令(ACMD)和常规命令(GEN_CMD)。要使用 SD 卡制造商特定的 ACMD 命令如ACMD6,需要在发送该命令之前无发送 CMD55 命令,告知 SD 卡接下来的命令为特定应用命令(因为特定应用命令ACMD6与CMD6都表示为 000110 所以要区别的话发送特定命令之前先发送CMD55表示后面的 000110 表示ACMD6 )。
CMD55 命令只对紧接的第一个命令有效,SD 卡如果检测到 CMD55 之后的第一条命令为 ACMD 则执行其特定应用功能,如果检测发现不是 ACMD 命令,则执行标准命令。
3.命令描述
反正下面的命名基本上用的到,这里记也记不住,先熟悉一下,后面讲SD卡识别模式,SD传输模式,以及后面写代码的时候,用到的命令在提及。
4.响应类型
命令寄存器包含命令索引(发至卡的6位)和命令类型;命令本身决定了是否需要响应和响应的类型、48位还是136位。
应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈 SD 卡的状态。SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。
R1(正常命令响应)
长度 48bit。bit [45:40]代表响应的命令号(什么命令造成的响应)。卡的状态存储在 bit [39:8]。很多命令基本是R1类型的响应。
R1b响应:
R1b 就是 R1 响应命令,同时数据线上有busy信号(SDIO_D0被拉低)。卡在收到这些命令后可能会变为busy。主机应该在响应中检查 busy。
R2(CID,CSD 寄存器)长响应
长度为 136bit。CID 寄存器的内容作为 CMD2 和 CMD10 的响应发送。CSD 寄存器的内容作为 CMD9 的响应发送。只传输 CID 和 CSD 寄存器的[127:1]位,这些寄存器的第[0]位被响应的结束位替代了
R3(OCR 寄存器
长度 48bit,OCR 寄存器的值作为 ACMD41 的响应发送
5 R6(发布的 RCA 寄存器响应)
长度 48bit。[45:40]是响应的命令号,这里就是‘000011’,即 CMD3。参数中的 16 位MSB 用于产生 RCA 号
R7(卡接口条件)
长度 48bit。卡支持的电压信息通过 CMD8 的响应发送。Bit[19:16]表明卡支持的电压范围。卡接受提供的电压范围就返回 R7 响应。卡会在响应的参数中返回电压范围和检查模式。
总结:
1.命令本身决定了是否需要响应和响应的类型
2.响应中除了 R3 类型之外,其他响应都使用 CRC7 校验来校验,对于 R2 类型是使用 CID 和CSD 寄存器内部 CRC7(如果响应不包含CRC(如CMD1的响应),设备驱动应该忽略CRC失败状态)。
3.有些响应不一定返回命令号
六.SD卡/SD NAND功能描述(重重点)
SD 卡系统定义了两种操作模式:
● 卡识别模式
在复位后,查找总线上的新卡的时候,主机会处于“卡识别模式”。卡在复位后会处于识别模式,直到收到 SEND_RCA(CMD3)命令.
● 数据传输模式
当 RCA (相当于SD卡的ID号)第一次发布后,卡会处于“数据传输模式”。主机会在总线上所有的卡都被识别后进入这个模式
上面看不懂不要紧,接着往下看
1.操作条件确认
在主机和卡交互之初,主机可能不知道卡支持的电压,卡也可能不知道是否支持当前的电压。主机会先假设 SD 卡支持某个电压,并以这个电压发送一个复位命令 CMD0。为了验证电压,“Physical Layer Specification V2.0”又定义了一个新的命令 CMD8。
CMD8(发送接口条件命令)是用来依照 SD2.0 标准初始化 SD 卡的。CMD8 要在 SD 卡处于“idle”状态下使用。
此命令有两个功能:
1.电压检测:
检测卡是否能在主机提供的电压下工作。
2.使能已存在命令的扩展和响应:
恢复 CMD8 就能够通过从定义之前预留的 bit,为一些已存在的命令扩展新的功能。
当卡在“idle”状态时,主机应该先发送 CMD8,再发送 ACMD41。参数中“电压支持”bit 被设置为主机支持的电压,而“检测模式”bit 被设置为任意的 8bit 模式(推荐使用‘10101010b) b代表位的意思。
①:这里是卡实际返回的内容(响应传输中不包含错误)
②:匹配意思是同时满足下面的 a)和 b)。不匹配是其他情况。
a) VHS(支持的电压)中只有 1 个 bit 被设置了
b)卡支持主机提供的电压
CMD8用于验证 SD 卡接口操作条件。SD卡会通过分析 CMD8 的参数来检测操作条件的正确性,而主机会通过分析 CMD8 的响应来检查正确性,支持的电压是由参数里的 VHS 区指定的。SD卡会假设 VHS 里面指定的电压是当前支持的电压。每一次命令VHS 里面只有 1 位能被设置为 1。主机会通过 CRC 和检查模式来确认通信的有效性。
如果卡能够在支持电压下操作,响应会传回命令参数里设置的支持的电压和检测模式。
如果卡不能在支持电压下操作,就不会发送响应,并保持在“空闲(idle)”状态。
强制要求:
在发送第一个 ACMD41 之前要先发送 CMD8,以便初始化高容量 SD 卡。SD 卡如果收到 CMD8,就会知道主机支持 V2.0,就可以使能新的功能。
总结一句话:CMD8用来识别不同版本的卡和检测卡是否能在主机提供的电压下工作。
如果发送CMD8无响应:
1.电压不匹配的 2.0 以上 SD 卡
2.1.0 的 SD 卡
3.不是 SD 卡
如果发送CMD8有响应:
电压匹配的 2.0 以上 SD 卡(就是我们即将要使用的SD卡)
ACMD41是用来提供给主机一种机制来识别和拒绝那些不匹配它期望的 VDD 范围的卡,主机通过发送需求的 VDD 电压范围来完成这个命令,这个范围作为命令的参数。不能支持指定电压范围的卡应该自动放弃后续的总线操作,并且进入无效状态。OCR 寄存器里面的标准应该响应的定义。
注意:ACMD41 是应用特定命令,在发送 ACMD41 之前需要发送CMD55。
2.卡识别模式
在卡识别模式,主机复位所有的卡、检测操作电压范围、识别卡并为总线上每个卡设置相对地址(RCA(Relative Card Address):靠这个地址确认与主机与哪个SD卡通信)。在卡识别模式下,所有数据通信只使用命令信号线(CMD)。
在卡识别过程中,卡应该在识别时钟频率 FOD (400KHZ)下的 SD 时钟频率中工作,在数据传输模式时钟频率为Fpp(最大25MHZ),所以在卡识别模式完成之后进入数据传输模式需要转换频率。
在卡识别模式期间,主机应该保持在 Fod 频率,因为某些卡可能在卡识别模式中有频率限制。在数据传输模式,主机可以在 Fpp 频率范围操作卡
卡会检查自己能不能在主机提供的电压下工作。如果能够,就会返回 R7 响应。响应参数中卡反馈了电压范围和检测模式设置。
SD_SEND_OP_COND(ACMD41)作为开始,通过设置操作条件和 OCR 的 HCS 位来进行。
HCS(HighCapacity Support)位为 1,表示主机支持高容量 SD 卡。
HCS(HighCapacity Support)位为 0,表示主机不支持高容量 SD 卡。
HCS 会被不回应 CMD8 的卡忽视掉。然而,如果卡不回应 CMD8,主机应该设置 HCS 为 0。标准容量卡会忽略 HCS。如果 HCS 设置为 0,那么高容量 SD 卡永远都不会返回 ready 状态(保持 busy 位为 0)。
卡通过 OCR 的 busy 位来通知主机 ACMD41 的初始化完成了。
设置 busy 位为 0 表示卡仍然在初始化。
设置 busy 位为 1,表示已经完成初始化。主机会重复发送 ACMD41,直到 busy 为被设置
R3作为ACMD41命令的响应返回,OCR寄存器的值
OCR 寄存器
32 位的操作条件寄存器(OCR)存储了卡的 VDD 电压描述。另外,还包括了状态信息位。如果卡的上电程序完成,一个状态位会被设置。寄存器还包括另一个状态位,在设置上电状态位后,用来表明卡的容量状态。
Bit31(busy位) – 卡上电状态位,这个状态位在卡的上电流程完成后设置。
Bit30(CCS位) – 卡容量状态位,如果是高容量卡,设置为 1,如果是标准卡,设置为 0。
卡容量状态位只有在上电流程完成,且 Bit31 设置为 1 之后才有效。
主机可以读取这个状态位来判断卡的种类。
如果卡响应了 CMD8,那么 ACMD41 的响应就包括了 CCS 字段信息。当卡返回“ready”的时候,CCS 是有效的(busy 位设置为 1)。
CCS=1 表示卡是高容量 SD 卡;CCS=0 表示卡是普通 SD 卡
总结:ACMD41命令,是用来SD卡的工作电压是否匹配,确定SD的容量(是标准卡还是高容量的卡)。
在系统中,主机遵照相同的初始化顺序来初始化所有的新卡。不兼容的卡会进入“Inactive(无效)”状态。
主机接着就会发送命令 CMD2给每一个卡,来得到他们的 CID 号,未识别的卡(处于 Ready 状态的)发送自己的 CID 作为响应。当卡发送了 CID 之后,它就进入“Identification(识别状态)”状态。
之后主机发送CMD3命令,通知卡发布一个新的相对地址(RCA),这个地址比 CID 短,用于作为将来数据传输模式的地址。一旦收到 RCA,卡就会变为“Stand-by(待机状态)”状态。
这时,如果主机想要分配另一个 RCA 号,它可以再发送一个 CMD3,通知卡重新发布一个 RCA 号。最后一个产生的 RCA 才是有效的。
卡识别模式流程图(重点重点)
一定一定要结合图去理解上面的文字叙述,卡的识别过程就豁然开朗了
3.数据传输模式
在卡识别模式期间,主机应该保持在 Fod (400KHZ)频率,因为某些卡可能在卡识别模式中有频率限制。在数据传输模式,主机可以在 Fpp (最高25MHZ)频率范围操作卡
主机发送命令CMD9来获得“SD卡具体数据(Card Specific Data)”,比如“块长度”,“存储容量”数据传输模式所有状态等(这些数据会用于后面对SD卡的读写操作)。
广播命令 CMD4会配置所有已识别卡的驱动范围(电压)。它会根据应用总线布局(长度)、总线上卡的数量以及数据传输频率来配置它们的 DSR 寄存器。
CMD7 的作用是选择一张SD卡,然后把它从卡识别模式切换到数据传输模式,每次只能有一张卡处于传输模式,如果一张处于传输模式的SD卡同主机的连接被释放,那么它会回到“Stand-by(待机)”状态。当 CMD7 带着参数RCA=0x0000 发送的时候,所有的卡都会回到“Stand-by(待机)状态。
主机读数据(SD卡处于发送数据状态)
所有数据读命令可以在任何情况下通过停止命令(CMD12)来中止。数据传输会中止,卡会回到传输状态。读命令有:块读(CMD17),多块读(CMD18),发送写保护(CMD30),发送SCR(ACMD51)以及读模式的通用命令(CMD56)
一般就用CMD17块读,多块读(CMD18)
主机写数据(SD卡处于接收数据状态)
所有数据写命令同样也可以通过 CMD12 来中止。在发送 CMD7 取消选定卡之前,应该先停止写命令。写命令有:块写(CMD24,CMD25),编程 CSD(CMD27),锁定/解锁命令(CMD42)。
CMD24:
1.对于标准卡写入写入 SEL_BLOCK_LEN长度字节的块。
2.对于 SDHC卡(高容量SD卡>2GB),写入512 字节的块。
CMD25:
连续写入数据,直到被CMD12命令打断。