SDIO学习(1)--SDIO 2.0协议

目录

1. SDIO介绍 

1.1 SDIO卡类型

1.2 SDIO卡通信方式

1.3 SDIO通信模型 

2. SDIO总线协议

2.1 命令(Command)

2.1.1 命令(Command)格式

2.1.2 命令(Command)分类

2.1.3 命令(Command)使用说明

2.1.4 SDIO卡专用命令(Command)介绍

2.4.1.1 CMD5(IO_SEND_OP_COND Command)

2.1.4.2 CMD52(IO_RW_DIRECT Command)

2.1.4.3 CMD53(IO_RW_EXTENDED Command)

2.2 响应(Response)

2.2.1 响应(Response)格式

2.2.2 响应(Response)分类

2.3 数据(Data)

2.3.1 1线模式数据结构

2.3.2 4线模式数据结构

2.4 SDIO数据传输

2.4.1 SDIO写数据

2.4.2 SDIO读数据

3.SDIO 卡其他功能

3.1 中断

3.2 挂起/恢复功能

3.3 读等待功能

3.4 寄存器映射

3.5 Common I/O Area (CIA)

3.5.1 Card Common Control Registers(CCCR)

3.5.2 Function Basic Registers (FBR)

3.5.3 Card Information Structure (CIS)

3.6 Embedded I/O Code Storage Area (CSA)


1. SDIO介绍 

SDIO(Secure Digital Input and Output),即安全数字输入输出接口。它是在SD卡接口协议的基础上发展而来的一种外设接口,可以兼容之前的SD卡协议,这种兼容性包括机械、电气、电源、信号和软件层的使用;也可以连接支持SDIO传输协议的设备,这些设备也称之为SDIO卡,比如:蓝牙、WIFI、GPS等。

SDIO协议与SD协议相比,主要增加了CMD5、CMD52、CMD53等命令,用于支持SDIO卡的使用。

SDIO应用框图如下图所示:

1.1 SDIO卡类型

从传输速率来看,SDIO 2.0标准协议定义了两种类型的SDIO卡:

(1)全速SDIO卡,工作时钟在0-25MHz,传输率可以超过100Mbps,支持SPI, 1-bit和4-bit模式。

(2)低速SDIO卡,工作时钟在0至400KHz之间;仅要求支持SPI和1-bit模式,4-bit模式是可选的。

1.2 SDIO卡通信方式

SDIO接口的数据传输模式有3种:SPI模式、SD-1bit模式和SD-4bit模式

SDIO协议规定,在 SD-1bit模式下,只使用数据线DATA0来传输数据,DATA1用作中断线;在 SD-4bit模式下,数据线DATA0~3用于传输数据,其中DATA1复用作中断线。

SPI模式使用 SD 总线的 9 线里面的 7 根(DAT1 和 DAT2 不用,DAT3 作为 CS 信号),在 SPI 活动(命令,响应,数据)期间片选信号应该是连续被拉低的。需要注意,如果使用SD模式通信,在SD卡初始化之前,SD主机不能随便拉低DAT3,否则可能导致SD卡进入SPI模式从而影响通信。

SDIO各种传输模式下的管脚接口定义如下图所示:

注意:后续内容如无特殊强调,都是基于SD模式来讲的,SPI模式暂不展开讨论。

1.3 SDIO通信模型 

SDIO总线有两端,其中一端是主机(HOST)端,另一端是设备端(DEVICE)。SDIO 总线的通信是基于命令和数据流的,命令是由SDIO主机(HOST)端发起,SDIO设备端(DEVICE)是被动响应。SDIO总线架构图如下图所示:

CLK:时钟信号线,单向传输,由Host发出,Device接收。

CMD:指令信号线,可双向传输,Host传给Device的指令以及Device给Host的响应。

DAT[3:0]:4根数据信号线,可双向传输,用于传输数据。

注:有些产商的SDIO IP支持8线模式(比如新思的DWC_mshc),可以提升通信速率。

下图是一个多块读操作时序图。 先由host发出读命令,卡接收到命令后回应一个response,接着发送数据给host,数据发送完之后,由host发出停止命令,卡再回应一个response,整个通信结束。

2. SDIO总线协议

SDIO协议包含三个要素:命令(Command),响应(Response)和数据(Data)。所有的通信都是围绕这3者进行。

命令(Command):命令就是一个标记,用于发起一个操作,由HOST发送,DEVICE接收,命令在 CMD 线上是连续传输的,命令的长度为48位。

响应(Response):响应是一个标记,是对接收到的命令的回答,由DEVICE发送,HOST接收,响应也是在CMD信号线上连续传输的,响应的长度有48位或136位。

数据(Data):数据是双向的传送的,数据可以从主机到卡,也可以从卡到主机。。

2.1 命令(Command)

SDIO Host 与 SDIO Device(SDIO卡、SD卡、EMMC等)的所有交互操作均通过命令完成,包括设备初始化、设备寄存器读写、设备状态查询、发起数据传输等。

2.1.1 命令(Command)格式

SDIO 命令(Command)的长度固定为 48bit ,由起始位(1bit)、传输位(1bit)、命令号(6bit)、命令参数(32bit)、 CRC 校验位(7bit)和结束位(1bit)组成,通过CMD线串行发送给设备,命令格式如下表所示:

其中,起始位(固定为0)、传输位、CRC7、结束位(固定为1)均是由SDIO控制器自动添加,而6bit的命令号和32bit的参数需要根据场景确定,由软件填写。

传输位表示传输方向,当由host传给device,传输位为1;当由device传给host,传输位为0。

命令号也叫命令索引,是CMD的编号,如CMD1、CMD52、CMD53等。命令号位宽是6bit,所以总共有64个命令(CMD0-CMD63,其中部分命令协议并没有没有定义,见下表A-14),每个命令都有特定用途,其中部分命令不适用于SD卡操作,只是专门用于MMC卡或者SDIO卡,如CMD52/CMD53。

参数字段则需要根据实际的场景决定,常见的用于设置速率,通信数据大小,输出模式等。

下表A-14显示了SD模式中SD卡和SDIO设备支持的命令,如果命令未被标识为强制或可选,则设备不支持该命令。

2.1.2 命令(Command)分类

官方分类方式

SD协议定义了 4 种命令类型:
(1) 广播命令(bc),无响应 : 广播命令只有当所有的 CMD 线都一起连到主机上时才会用。如果CMD 线是分开的,那么每张卡单独处理命令。
(2) 广播命令,带响应(bcr) :所有卡同时响应,因为 SD 卡没有开漏模式,所以使用这种命令时,CMD 线都是分开的,每张卡也会单独接收和响应命令。
(3)寻址命令(ac,点对点): 没有数据在 DAT 线上。
(4) 寻址数据传输命令(adtc) : 有数据在 DAT 线上。

以上是官方的分类方式,按照个人理解,可以有以下方式分类:

根据命令的用途,命令可分为 2 种:
(1)特殊应用命令(ACMD):ACMD是指由厂商制定、或者有着特殊用途的命令,如 ACMD6、ACMD41。在发送ACMD之前需要发送 CMD55 命令,告知 SDIO Device接下来的命令为特殊应用命令。 CMD55 命令只对紧接的第一个命令有效,SD 卡如果检测到 CMD55 之后的第一条命令为 ACMD 则执行其特定应用功能,如果检测发现不是 ACMD 命令,则执行普通命令。
(2)普通命令(CMD):除了ACMD之外剩下的都是普通 CMD, 比如 CMD2, CMD8 这些等。

根据响应的类型,命令可分为 3 种:
(1)无响应命令: 对于该种命令,设备没有响应,如复位命令CMD0。
(2)短响应命令: 对于该种命令,设备有 48bit 长度的响应返回给 SDIO Host,如数据传输、卡状态查询等命令。
(3)长响应命令: 对于该种命令,设备有 136bit 长度的响应返回给 SDIO Host,如 CID
寄存器的内容作为 CMD2 或 CMD10 命令的响应。

2.1.3 命令(Command)使用说明

下表4-18介绍基础命令CMD0-CMD15的使用,包括参数说明、功能说明。

下表4-19介绍面向块的读操作命令CMD16-CMD23的使用,包括参数说明、功能说明。

下表4-20介绍面向块的写操作命令CMD16、CMD24-CMD27的使用,包括参数说明、功能说明。

下表4-21介绍面向块的写保护命令CMD28-CMD31的使用,包括参数说明、功能说明。 

 

下表4-22介绍擦除命令CMD32-CMD41的使用,包括参数说明、功能说明。 

下表4-23介绍加锁命令CMD16、CMD42-CMD51的使用,包括参数说明、功能说明。 

下表4-24介绍特殊用途命令CMD55-CMD63的使用,包括参数说明、功能说明。 

 下表4-25的命令CMD52-CMD54是SDIO卡专用的命令,SD卡不支持。

2.1.4 SDIO卡专用命令(Command)介绍

2.4.1.1 CMD5(IO_SEND_OP_COND Command)

 SDIO协议要求,当SDIO卡在插入一个不支持I/O操作的主机时,不应该导致该主机发生故障。为了防止在不支持I/O操作的主机中操作I/O功能,需要更改SD卡识别流程。SDIO协议添加了一个新命令(IO_SEND_OP_COND,CMD5)来替换ACMD41,以便支持I/O操作主机进行SDIO初始化。

上图3-4显示了IO_SEND_OP_COND命令(CMD5)的格式。CMD5对SDIO卡的功能类似于SD存储卡的ACMD41,用于查询I/O卡所需的电压范围(I/O OCR)。每个域段的说明如下:

对于的基本通信要求,SDIO 2.0版的卡应支持2.7-3.6V的工作电压范围,不强制要求支持2.0-2.7V的电压范围,支持SDIO 2.0版本的主机也不应该使用2.0-2.7V的电压范围进行基本通信。下表3-1是I/O卡所支持的电压范围说明:

不管是SD模式还是SPI模式,CMD5的正常响应是R4,SD模式R4响应格式如图3-5所示,SPI模式R4响应格式如图3-6所示。

每个域段的介绍如下:

2.1.4.2 CMD52(IO_RW_DIRECT Command)

 CMD52用于访问SDIO卡的单个寄存器,是所有I/O功能中最简单的一个,可以访问128K寄存器空间,包括公共I/O区(CIA)。此命令仅一次可以读取或写入1个字节,常见的用途是初始化寄存器或监视I/O状态。下图是CMD52的命令格式和使用说明。

SD模式的响应

SDIO卡在SD模式下对CMD52的响应是R5,如下图5-2所示。如果操作是读取命令,正在读取的数据作为8bit值返回。此外,还返回15位的状态信息。SD响应的格式如下:

其中的Response Flags有8bit,用于指示SDIO卡的状态,下表5-1显示了每个bit的含义。

SPI模式的响应 

SDIO卡在SPI模式下对CMD52的响应如下图5-3所示。如果操作是读取命令,则读取的数据将作为8bit值返回。此外还返回8位状态信息。

2.1.4.3 CMD53(IO_RW_EXTENDED Command)

 为了用单个命令读取和写入多个SDIO卡寄存器,SDIO协议定义了一个新命令CMD53,此命令允许使用单个命令读取或写入大量SDIO卡寄存器。CMD53格式如下图:

每个域段的介绍如下: 

SDIO卡对CMD53的响应应R5(与CMD52相同)。对于CMD53的响应,8位数据字段作为填充位并且读取为0x00(需要读取或者写入的数据是通过数据线来传输的),ERROR响应位类型应为“ERX"

2.2 响应(Response)

响应由Device通过CMD线发送给Host,作为对command的应答,传输是MSB优先。

2.2.1 响应(Response)格式

响应的格式取决于响应的类型,按照数据长度,响应类型分为短响应长响应

对于短响应,设备有 48bit 长度的响应返回给 SDIO Host,如数据传输、卡状态查询等命令。

对于长响应,设备有 136bit 长度的响应返回给 SDIO Host,如 CID寄存器的内容作为 CMD2 或 CMD10 命令的响应。

长响应和短响应的区别就是:短响应的参数位宽是32bit,而长响应的参数位宽是128bit,如下图所示:

2.2.2 响应(Response)分类

(1)如上一章节所述,根据响应长度,响应可以分为短响应(48bit)和长响应(136bit)。

(2)按照响应的功能,响应还可以有如下分类
SD卡支持5种响应:R1,R1b,R2,R3,R6,R7;
SDIO卡额外支持2种响应:R4,R5。

其中 R1,R1b,R3,R4,R5,R6,R7 长度为48bit ,只有 R2 比较特殊,长度为 136bit,如下图所示 。

2.3 数据(Data)

数据可以在host和device之间传输,可以从host到device(写数据),也可以从device到host(读数据),通过数据线Data0~3来传输。数据传输都是以块(Block)为单位的,为512字节的倍数。数据块后边会紧跟一个crc校验。

数据传输格式如下图所示:

2.3.1 1线模式数据结构

1 线模式传输时,第 1bit 是数据的起始标识位(start bit),恒为 0;其后跟随的 N byte 数据,其中数据的传输顺序是先发低字节再发高字节,而每个字节(byte)内部的传输顺序则是先发高位后发低位(bit7 至 bit0);在数据传输末尾紧跟 16bits 的 CRC 校验码;最后1bit 是结束标识位(end bit),恒为 1。 

2.3.2 4线模式数据结构

4 线传输模式的数据传输格式与 1 线类似,每条数据线上都有起始位、 CRC 校验位及结束位,每条线的 CRC 校验码是独立的,且每条线单独进行 CRC 校验。传输顺序也是从低字节到高字节,同一字节的数据拆分到 4 条线上同时并行传输。 

2.4 SDIO数据传输

SDIO Host 与 SDIO、 SD 和 EMMC 设备之间的数据传输以数据块(block)为基本单位,可以是一次单个数据块,也可以是一次多个数据块,SD 和 EMMC 设备传输数据块最大为 512byte,而 SDIO 设备传输数据块可根据实际应用自定义,每个数据块以 CRC 位来保证数据的正确性。

2.4.1 SDIO写数据

SDIO Host 向 SDIO Device 发送单块或多块写命令,在收到 SDIO Device 返回的响应后,数据随后通过 DAT 线向 SDIO Device 传输, SDIO Device 在接收完数据后,会根据接收到的数据 CRC 检验,并将结果 crc 状态(crc status)返回给 SDIO Host, crc 状态后面会紧跟 busy 信号,busy 信号(DAT0=0)表明 SDIO Device 还没有准备好接收下一个数据块。 DAT0 线拉高,表明 busy 信号消失, SDIO Host 随即可把下一个数据块发送给 SDIODevice。同样,要结束多块写操作需要 SDIO Host 发出数据传输停止命令。

2.4.2 SDIO读数据

SDIO Host 向 SDIO Device 发送单块或多块读命令(command), SDIO Device 收到命令后通过 CMD 线返回响应(response),此外, SDIO Device 也会通过 DAT 线将数据发送给SDIO Host。数据传输以块(data block)为单位,并携带 crc 校验码。单块读操作时,SDIO Host 收到一个数据块后就完成该次数据传输。而多块读操作时, SDIO Host 将会收到多个数据块,数据传输停止则需要 SDIO Host 发出数据传输停止命令。

3.SDIO 卡其他功能

3.1 中断

所有SDIO主机都应支持硬件中断。如果主机不支持中断,则可能难以使用SDIO卡,因为SDIO卡需要对中断条件做出快速响应。

SDIO卡或组合卡内的每个功能可以根据需要实现中断。由于只有一条中断线,因此它可以由多个中断源共享。由于多个中断可能同时处于活动状态,因此主机需要确定中断源并根据需要进行处理。

上述功能通过中断使能和中断挂起实现的。SDIO卡有一个中断使能功能,每个可能产生中断的函数都有一个中断使能位,SDIO卡可控制所有中断的使能,只有使能的中断才能向SD总线发出中断信号。中断挂起告诉主机哪些功能可能正在发出中断信号,每个可以生成中断的函数都有一个中断挂起位,这些比特位于CCCR区域中。

3.2 挂起/恢复功能

在多功能SDIO卡或组合卡中,多个设备(I/O和内存)需要共享对SD总线的访问权限,为了允许在多个设备之间共享对主机的访问,SDIO卡和组合卡实现挂起/恢复的功能。如果卡支持挂起/恢复功能,主机可能会暂时停止向一个功能或内存的数据传输(即挂起),以便释放总线,以便向不同的功能或内存进行更高优先级的传输。一旦此较高优先级的传输完成,原始传输将从中断的位置重新开始(恢复)。主机可以挂起多个事务,并按所需的任何顺序恢复它们。

3.3 读等待功能

SD协议规定,当执行多块读操作时,主机无法接受更多数据时,主机应控制SDCLK停止从卡读取数据。在主机停止SDCLK期间,主机无法发出CMD52,这种限制导致了一个问题,主机设备无法执行其他I/O命令。

为了消除这种限制,SDIO规范添加了读等待功能,以使主机能够在多块读期间发出CMD52。Read Wait(读取等待)使用DAT[2]线,允许主机向卡发出信号,暂时停止卡发送数据。

此功能对于SDIO卡或组合卡是可选的。如果SDIO卡或组合支持读取等待,则所有功能和任何内存都应支持读取等待。读等待仅针对SD 1bit和4bit传输模式,不适用于SPI传输模式。

3.4 寄存器映射

SDIO卡有固定的公共I/O区域(CIA)和功能唯一区域(128k Register Space)。公共I/O区域(CIA)包含有关卡的信息以及某些强制性和可选寄存器,公共I/O区域(CIA)允许任何主机以通用方式获取有关卡的信息并执行简单操作。功能唯一区域是其他功能区域,由IP供应商定义。下图6-1显示了SDIO卡的内部寄存器映射情况。

3.5 Common I/O Area (CIA)

所有SDIO卡都要支持公共I/O区域(CIA),这是协议规定的。主机通过对Function 0的I/O读写访问CIA。CIA内的寄存器用于控制启用/禁用I/O功能的操作,控制中断的生成,并可选地加载支持I/O功能的软件。CIA中的寄存器还提供有关功能能力和要求的信息。CIA内部支持三种不同的寄存器结构。他们是:

1. Card Common Control Registers (CCCR)
2. Function Basic Registers (FBR)
3. Card Information Structure (CIS)
 

3.5.1 Card Common Control Registers(CCCR)

卡公共控制寄存器(CCCR)允许在SDIO主机快速检查和控制I/O卡的启用和中断。CCCR中的bit位是读/写和只读混合的,如果SDIO卡没有提供7个功能(FBR)中的任何一个,则与未使用的功能相对应的bit位都应为只读,并读取为0。所有保留位(RFU)应为只读,并返回值0。通电或重置后,所有可写入位都设置为0。初始化之后,即使在I/O功能被禁用,SDIO主机也可以访问CCCR寄存器。OCCR的具体信息如下表6-1所示。

3.5.2 Function Basic Registers (FBR)

除了CCCR寄存器之外,每个I/O function都有一个256字节的区域,用于让主机快速确定每个function的能力和要求,为每个function选择电源并加载软件。该区域的地址从0x00n00到0x00nFF,其中n是function号(0x1到0x7)。每个function区的结构如下表6-3所示:

3.5.3 Card Information Structure (CIS)

卡信息结构(CIS)提供了更多关于卡和各个功能的信息。CIS在SDIO卡实现,是读取所有I/O功能信息的公共区域,该区域基于PCMCIA的PC Card16标准设计。所有支持I/O的卡应具有一个通用CIS和一个用于每个Function的CIS。CIS通过读取固定区域来访问,如表6-5所示。该区域用作卡的通用CIS,也用作每个功能的存储区域。公共区域和每个函数都有一个指针,指向该内存空间中其CIS的开始。

3.6 Embedded I/O Code Storage Area (CSA)

为了支持SDIO卡的“即插即用”概念,卡中包含的每个Function需要包含一块内存,用于存储驱动程序或应用程序。此外,由于同一SDIO卡可以在多个不同的主机平台上使用,因此每个Function可能需要几个不同版本的代码。有2种方式解决这些问题,一种方式是将这些程序代码存储在组合卡的标准SD内存部分,或者把加载代码的标准访问方式存储在可选代码存储区(CSA)中。

CSA是一个独立的16MB内存区域,可使用FBR寄存器中包含的CSA地址指针和CSA窗口寄存器进行访问。请注意,每个Function可能都有自己的CSA来支持它。CSA数据可以是只读的或可读可写的。SDIO协议没有规定CSA的实际存储方法,由IP厂商决定。

为了让主机访问某个Function的CSA,应首先确定该Function是否支持CSA。SDIO主机读取地址0x00n00处的FBR寄存器,其中n是Function号(0x1到0x7)。如果bit6=1,则该Function支持CSA,并且主机通过写入bit7=1来启用访问。下一步是主机加载24位地址以开始读取或写入。这是通过将24bit(A23-0)写入寄存器0x00n0C到0x00n0E来实现的,其中n是Function号(0x1到0x7)。一旦写入了起始地址,就可以通过访问寄存器0x00n0F(CSA数据窗口寄存器)来读取或写入数据。如果需要读取或写入超过1个字节,则可以使用OP为0(固定地址)执行扩展I/O命令(字节或块实现)。随着每次访问窗口寄存器,地址指针应自动递增,因此能顺序访问CSA的地址。一旦操作完成,NEXT操作的地址应保存在24位地址寄存器中,供主机读取。

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原海青木

你的鼓励将是我创作的最大动力.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值