Stm32F103R6之SDIO

概述

SD/SDIO MMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和CE-ATA设备间提供了操作接口。

MMC、CE-ATA、SD、TF、SDIO的异同请点击 。

主要功能

● 与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。

● 与较早的多媒体卡系统规格版本全兼容(向前兼容)。

● 与SD存储卡规格版本2.0全兼容。

● 与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4位。

● 完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。

● 8位总线模式下数据传输速率可达48MHz。

● 数据和命令输出使能信号,用于控制外部双向驱动器。

需要注意的是:

1.SDIO没有SPI兼容的通信模式

2.在多媒体卡系统规格书版本2.11中,定义SD存储卡协议是多媒体卡协议的超集。只支持I/O模式的SD卡或复合卡中的I/O部分不能支持SD存储设备中很多需要的命令,这里有些命令在SD I/O设备中不起作用,如擦除命令,因此SDIO不支持这些命令。另外,SD存储卡和SD I/O卡中有些命令是不同的,SDIO也不支持这些命令。细节可以参考SD I/O卡规格书版本1.0。使用现有的MMC命令机制,在MMC接口上可以实现CE-ATA的支持。SDIO接口的电气和信号定义详见MMC参考资料。

SDIO总线拓扑

总线上的通信是通过传送命令和数据实现。

在多媒体卡/SD/SD I/O总线上的基本操作是命令/响应结构,这样的总线操作在命令或总线机制下实现信息交换,换句话说主机做主导,外部SDIO设备配合;另外,某些操作还具有数据令牌。

在SD/SDIO存储器卡上传送的数据是以数据块的形式传输;在MMC上传送的数据是以数据块或数据流的形式传输;在CE-ATA设备上传送的数据也是以数据块的形式传输。

SDIO包含2个部分:

● SDIO适配器模块:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。

● AHB总线接口:操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。

Stm32F103R6之SDIO

图 1SDIO框图

Stm32F103R6之SDIO

图 2SDIO引脚定义

SDIO适配器

Stm32F103R6之SDIO

图 3SDIO适配器

SDIO适配器是多媒体/加密数字存储卡总线的主设备(主机),用于连接一组多媒体卡或加密数字存储卡,它包含以下5个部分:

● 适配器寄存器模块

● 控制单元

● 命令通道

● 数据通道

● 数据FIFO

适配器寄存器模块

适配器寄存器模块包含所有系统寄存器。该模块还产生清除多媒体卡中静态标记的信号,当在SDIO清除寄存器中的相应位写’1’时会产生清除信号。

控制单元

控制单元包含电源管理功能和为存储器卡提供的时钟分频。

共有三种电源阶段:

● 电源关闭

● 电源启动

● 电源开

命令通道

命令通道单元向卡发送命令并从卡接收响应。

Stm32F103R6之SDIO

图 4SDIO适配器命令通道

命令通道状态机(CPSM)

当写入命令寄存器并设置了使能位,开始发送命令。命令发送完成时,命令通道状态机(CPSM)设置状态标志并在不需要响应时进入空闲状态(见下图)。当收到响应后,接收到的CRC码将会与内部产生的CRC码比较,然后设置相应的状态标志。

Stm32F103R6之SDIO

图 5命令通道状态机

当进入等待(Wait)状态时,命令定时器开始运行;当CPSM进入接收(Receive)状态之前,产生了超时,则设置超时标志并进入空闲(Idle)状态。

如果在命令寄存器设置了中断位,则关闭定时器,CPSM等待某一个卡发出的中断请求。如果命令寄存器中设置挂起位,CPSM进入挂起(Pend)状态并等待数据通道子单元发出的CmdPend信号,在检测到CmdPend信号时,CPSM进入发送(Send)状态,这将触发数据计数器发送停止命令的功能。

Stm32F103R6之SDIO

图 6SDIO命令传输

命令格式

命令是用于开始一项操作。主机向一个指定的卡或所有的卡发出带地址的命令或广播命令(广播命令只适合于MMC V3.31或之前的版本)。命令在CMD线上串行传送。所有命令的长度固定为48位,下表给出了多媒体卡、SD存储卡和SDIO卡上一般的命令格式。

CE-ATA命令是MMC V4.2命令的扩充,所以具有相同的格式。 命令通道操作于半双工模式,这样命令和响应可以分别发送和接收。如果CPSM不处在发送状态,SDIO_CMD输出处于高阻状态。

Stm32F103R6之SDIO

图 7命令格式

响应是由一个被指定地址的卡发送到主机,对于MMC V3.31或以前版本所有的卡同时发送响应;响应是对先前接收到命令的一个应答。响应在CMD线上串行传送。

SDIO支持2种响应类型,2种类型都有CRC错误检测:

● 48位短响应

● 136位长响应

Stm32F103R6之SDIO

图 8短响应格式

Stm32F103R6之SDIO

图 9长响应格式

数据通道

Stm32F103R6之SDIO

图 10数据通道

在时钟控制寄存器中可以配置卡的数据总线宽度。如果选择了4位总线模式,则每个时钟周期四条数据信号线(SDIO_D[3:0])上将传输4位数据;如果选择了8位总线模式,则每个时钟周期八条数据信号线(SDIO_D[7:0])上将传输8位数据;如果没有选择宽总线模式,则每个时钟周期只在SDIO_D0上传输1位数据。

根据传输的方向(发送或接收),使能时数据通道状态机(DPSM)将进入Wait_S或Wait_R状态:

● 发送:DPSM进入Wait_S状态。如果发送FIFO中有数据,则DPSM进入发送状态,同时数据通道子单元开始向卡发送数据。

● 接收:DPSM进入Wait_R状态并等待开始位;当收到开始位时,DPSM进入接收状态,同时数据通道子单元开始从卡接收数据。

数据通道状态机(DPSM)

DPSM工作在SDIO_CK频率,卡总线信号与SDIO_CK的上升沿同步。DPSM有6个状态,如下图所示:

Stm32F103R6之SDIO

图 11数据通道状态机

● 空闲(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进入到空闲状态。

─ 在流模式下,当数据计数器不为0时,DPSM接收数据;当计数器为0时,将移位寄存器中的剩余数据写入数据FIFO,同时DPSM进入Wait_R状态。 如果产生了FIFO上溢错误,DPSM设置FIFO的错误标志并进入空闲状态。

● Wait_S:如果数据计数器为0,DPSM进入空闲状态;否则DPSM等待数据FIFO空标志消失后,进入发送状态。

● 发送(Send):DPSM开始发送数据到卡设备。根据数据控制寄存器中传输模式位的设置,数据传输模式可以是块传输或流传输:

─ 在块模式下,当数据块计数器达到0时,DPSM发送内部产生的CRC码,然后是结束位,并进入繁忙状态。

─ 在流模式下,当使能位为高同时数据计数器不为0时,DPSM向卡设备发送数据,然后进入空闲状态。 如果产生了FIFO下溢错误,DPSM设置FIFO的错误标志并进入空闲状态。

● 繁忙(Busy):DPSM等待CRC状态标志:

─ 如果没有接收到正确的CRC状态,则DPSM进入空闲状态并设置CRC失败状态标志。

─ 如果接收到正确的CRC状态,则当SDIO_D0不为低时(卡不繁忙)DPSM进入Wait_S状态。 当DPSM处于繁忙状态时发生了超时,DPSM则设置数据超时标志并进入空闲状态。 当DPSM处于Wait_R或繁忙状态时,数据定时器被使能,并能够产生数据超时错误:

─ 发送数据时,如果DPSM处于繁忙状态超过程序设置的超时间隔,则产生超时。

─ 接收数据时,如果未收完所有数据,并且DPSM处于Wait_R状态超过程序设置的超时间隔,则产生超时。

● 数据:数据可以从主机传送到卡,也可以反向传输。数据在数据线上传输。数据存储在一个32字的FIFO中,每个字为32位宽。

数据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为有效。

SDIO AHB接口

AHB接口产生中断和DMA请求,并访问SDIO接口寄存器和数据FIFO。它包含一个数据通道、寄存器译码器和中断/DMA控制逻辑。

SDIO中断

当至少有一个选中的状态标志为高时,中断控制逻辑产生中断请求。有一个屏蔽寄存器用于选择可以产生中断的条件,如果设置了相应的屏蔽标志,则对应的状态标志可以产生中断。

SDIO/DMA接口:在SDIO和存储器之间数据传输的过程

在下面的例子中,主机控制器使用CMD24(WRITE_BLOCK)从主机传送512字节到MMC卡,DMA控制器用于从存储器向SDIO的FIFO填充数据。

1. 执行卡识别过程

2. 提高SDIO_CK频率

3. 发送CMD7命令选择卡

4. 按下述步骤配置DMA2:

a) 使能DMA2控制器并清除所有的中断标志位

b) 设置DMA2通道4的源地址寄存器为存储器缓冲区的基地址,DMA2通道4的目标地址寄存器为SDIO_FIFO寄存器的地址

c) 设置DMA2通道4控制寄存器(存储器递增,非外设递增,外设和源的数据宽度为字宽度)

d) 使能DMA2通道4

5. 发送CMD24(WRITE_BLOCK),操作如下:

a) 设置SDIO数据长度寄存器(SDIO数据时钟寄存器应该在执行卡识别过程之前设置好)

b) 设置SDIO参数寄存器为卡中需要传送数据的地址

c) 设置SDIO命令寄存器:CmdIndex置为24(WRITE_BLOCK);WaitRest置为1(SDIO卡主机等待响应);CPSMEN置为1(使能SDIO卡主机发送命令),保持其它域为他们的复位值。

d) 等待SDIO_STA[6]=CMDREND中断,然后设置SDIO数据寄存器:DTEN置为1(使能SDIO卡主机发送数据);DTDIR置为0(控制器至卡方向);DTMODE置为0(块数据传送);DMAEN置为1(使能DMA);DBLOCKSIZE置为9(512字节);其它域不用设置。

e) 等待SDIO_STA[10]=DBCKEND

6. 查询DMA通道的使能状态寄存器,确认没有通道仍处于使能状态。

卡功能描述

卡识别模式

在卡识别模式,主机复位所有的卡、检测操作电压范围、识别卡并为总线上每个卡设置相对地址(RCA)。在卡识别模式下,所有数据通信只使用命令信号线(CMD)。

卡复位

GO_IDLE_STATE命令(CMD0)是一个软件复位命令,它把多媒体卡和SD存储器置于空闲状态。IO_RW_DIRECT命令(CMD52)复位SD I/O卡。上电后或执行CMD0后,所有卡的输出端都处于高阻状态,同时所有卡都被初始化至一个默认的相对卡地址(RCA=0x0001)和默认的驱动器寄存器设置(最低的速度,最大的电流驱动能力)。

卡识别过程

多媒体卡和SD卡的卡识别过程是有区别的;对于多媒体卡,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为开路驱动,允许在这个过程中的卡的并行连接,识别过程如下:

1. 总线被激活

2. SDIO卡主机广播发送SEND_OP_COND(CMD1)命令,并接收操作条件

3. 得到的响应是所有卡的操作条件寄存器内容的“线与”

4. 不兼容的卡会被置于非激活状态

5. SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡

6. 所有激活的卡同时串行地发送他们的CID号,那些检测到输出的CID位与命令线上的数据不相符的卡必须停止发送,并等待下一个识别周期。最终只有一个卡能够成功地传送完整的CID至SDIO卡主机并进入识别状态。

7. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令至这个卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机状态,并不再响应新的识别过程,同时它的输出驱动从开路转变为推挽模式。

8. SDIO卡主机重复上述步骤5至7,直到收到超时条件。

对于SD卡而言,卡识别过程以时钟频率Fod开始,所有SDIO_CMD输出为推挽驱动而不是开路驱动,识别过程如下:

1. 总线被激活

2. SDIO卡主机广播发送SEND_APP_OP_COND(ACMD41)命令

3. 得到的响应是所有卡的操作条件寄存器的内容

4. 不兼容的卡会被置于非激活状态

5. SDIO卡主机广播发送ALL_SEND_CID(CMD2)至所有激活的卡

6. 所有激活的卡发送回他们唯一卡识别号(CID)并进入识别状态。

7. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机状态。SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值。

8. SDIO卡主机对所有激活的卡重复上述步骤5至7。

对于SD I/O卡而言,卡识别过程如下:

1. 总线被激活

2. SDIO卡主机发送IO_SEND_OP_COND(CMD5)命令

3. 得到的响应是卡的操作条件寄存器的内容

4. 不兼容的卡会被置于非激活状态

5. SDIO卡主机发送SET_RELATIVE_ADDR(CMD3)命令和一个地址到一个激活的卡,这个新的地址被称为相对卡地址(RCA),它比CID短,用于对卡寻址。至此,这个卡转入待机状态。SDIO卡主机可以再次发送该命令更改RCA,卡的RCA将是最后一次的赋值。

写数据块

执行写数据块命令(CMD24-27)时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个CRC码。一个支持写数据块命令的卡应该始终能够接收由WRITE_BL_LEN定义的数据块。如果CRC校验错误,卡通过SDIO_D信号线指示错误,传送的数据被丢弃而不被写入,所有后续(在多块写模式下)传送的数据块将被忽略。

如果主机传送部分数据,而累计的数据长度未与数据块对齐,当不允许块错位(未设置CSD的参数WRITE_BLK_MISALIGN),卡将在第一个错位的块之前检测到块错位错误(设置状态寄存器中的ADDRESS_ERROR错误位)。当主机试图写一个写保护区域时,写操作也会被中止,此时卡会设置WP_VIOLATION位。

设置CID和CSD寄存器不需要事先设置块长度,传送的数据也是通过CRC保护的。如果CSD或CID寄存器的部分是存储在ROM中,则这个不能更改的部分必须与接收缓冲区的对应部分相一致,如果有不一致之处,卡将报告一个错误同时不修改任何寄存器的内容。有些卡需要长的甚至不可预计的时间完成写一个数据块,在接收一个数据块并完成CRC检验后,卡开始写操作,如果它的写缓冲区已经满并且不能再从新的WRITE_BLOCK命令接受新的数据时,它会把SDIO_D信号线拉低。主机可以在任何时候使用SEND_STATUS(CMD13)查询卡的状态,卡将返回当前状态。READY_FOR_DATA状态位指示卡是否可以接受新的数据或写操作是否还在进行。主机可以使用CMD7(选择另一个卡)不选中某个卡,而把这个卡置于断开状态,这样可以释放SDIO_D信号线而不中断未完成的写操作;当重新选择了一个卡,如果写操作仍然在进行并且写缓冲区仍不能使用,它会重新通过拉低SDIO_D信号线指示忙的状态。

读数据块

在读数据块模式下,数据传输的基本单元是数据块,它的大小在CSD中(READ_BL_LEN)定义。如果设置了READ_BL_PARTIAL,同样可以传送较小的数据块,较小数据块是指开始和结束地址完全包含在一个物理块中,READ_BL_LEN定义了物理块的大小。为保证数据传输的正确,每个数据块后都有一个CRC校验码。CMD17(READ_SINGLE_BLOCK)启动一次读数据块操作,在传输结束后卡返回到发送状态。

CMD18(READ_MULTIPLE_BLOCK)启动一次连续多个数据块的读操作。

主机可以在多数据块读操作的任何时候中止操作,而不管操作的类型。发送停止传输命令即可中止操作。

如果在多数据块读操作中(任一种类型)卡检测到错误(例如:越界、地址错位或内部错误),它将停止数据传输并仍处于数据状态;此时主机必须发送停止传输命令中止操作。在停止传输命令的响应中报告读错误。

如果主机发送停止传输命令时,卡已经传输完一个确定数目的多个数据块操作中的最后一个数据块,因为此时卡已经不在数据状态,主机会得到一个非法命令的响应。如果主机传输部分数据块,而累计的数据长度不能与物理块对齐同时不允许块错位,卡会在出现第一个未对齐的块时检测出一个块对齐错误,并在状态寄存器中设置ADDRESS_ERROR错误标志。

数据流操作,数据流写入和数据流读出(只适用于多媒体卡)

在数据流模式,数据按字节传输,同时每个数据块后没有CRC。

数据流写(只适用于多媒体卡)

WRITE_DAT_UNTIL_STOP(CMD20)开始从SDIO卡主机至卡的数据传输,从指定的地址开始连续传输直到SDIO卡主机发出一个停止命令。如果允许部分数据块传输(设置了CSD参数WRITE_BL_PARTIAL),则数据流可以在卡的地址空间中的任意地址开始和停止,否则数据流只能在数据块的边界开始和停止。因为传输的数据数目没有事先设定,不能使用CRC校验。如果发送数据时达到了存储器的最大地址,即使SDIO卡主机没有发送停止命令,随后传输的数据也会被丢弃。

数据流读(只适用于多媒体卡)

READ_DAT_UNTIL_STOP(CMD11)控制数据流数据传输。

这个命令要求卡从指定的地址读出数据,直到SDIO卡主机发送STOP_TRANSMISSION (CMD12)。因为串行命令传输的延迟,停止命令的执行会有延迟,数据传送会在停止命令的结束位后停止。如果发送数据时达到了存储器的最大地址,SDIO卡主机没有发送停止命令,随后传输的数据将是无效数据。

擦除:成组擦除和扇区擦除

多媒体卡的擦除单位是擦除组,擦除组是以写数据块计算,写数据块是卡的基本写入单位。擦除组的大小是卡的特定参数,在CSD中定义。

主机可以擦除一个连续范围的擦除组,开始擦除操作有三个步骤。

首先,主机使用ERASE_GROUP_START(CMD35)命令定义连续范围的开始地址,然后使用ERASE_GROUP_END(CMD36)命令定义连续范围的结束地址,最后发送擦除命令ERASE(CMD38)开始擦除操作。擦除命令的地址域是以字节为单位的擦除组地址。卡会舍弃未与擦除组大小对齐的部分,把地址边界对齐到擦除组的边界。

如果未按照上述步骤收到了擦除命令,卡在状态寄存器中设置ERASE_SEQ_ERROR位,并重新等待第一个步骤。

如果收到了除SEND_STATUS和擦除命令之外的其它命令,卡在状态寄存器中设置ERASE_RESET位,解除擦除序列并执行新的命令。

如果擦除范围包含了写保护数据块,这些块不被擦除,只有未保护的块被擦除,同时卡在状态寄存器中设置WP_ERASE_SKIP状态位。

在擦除过程中,卡拉低SDIO_D信号。实际的擦除时间可能很长,主机可以使用CMD7解除卡的选择。

宽总线选择和解除选择

可以通过SET_BUS_WIDTH(ACMD6)命令选择或不选择宽总线(4位总线宽度)操作模式,上电后或GO_IDLE_STATE(CMD0)命令后默认的总线宽度为1位。SET_BUS_WIDTH(ACMD6)命令仅在传输状态时有效,即只有在使用SELECT/DESELECT_CARD(CMD7)命令选择了卡后才能改变总线宽度。

保护管理

SDIO卡主机模块支持三种保护方式:

1. 内部卡保护(卡内管理)

2. 机械写保护开关(仅由SDIO卡主机模块管理)

3. 密码管理的卡锁操作

内部卡的写保护

卡的数据可以被保护不被覆盖或擦除。在CSD中永久地或临时地设置写保护位,生产厂商或内容提供商可以永久地对整个卡施行写保护。对于支持在CSD中设置WP_GRP_ENABLE位从而提供一组扇区写保护的卡,部分数据可以被保护,写保护可以通过程序改变。写保护的基本单位是CSD参数WP_GRP_SIZE个扇区。SET_WRITE_PROT和CLR_WRITE_PROT命令控制指定组的保护,SEND_WRITE_PROT命令与单数据块读命令类似,卡送出一个包含32个写保护位(代表从指定地址开始的32个写保护组)的数据块,跟着一个16位的CRC码。写保护命令的地址域是一个以字节为单位的组地址。

卡将截断所有组大小以下的地址。

机械写保护开关

在卡的侧面有一个机械的滑动开关,允许用户设置或清除卡的写保护。当滑动开关置于小窗口打开的位置时,卡处于写保护状态,当滑动开关置于小窗口关闭的位置时,可以更改卡中内容。在卡的插槽上的对应部位也有一个开关指示SDIO卡主机模块,卡是否处于写保护状态。卡的内部电路不知道写保护开关的位置。

密码保护

密码保护功能允许SDIO卡主机模块使用密码对卡实行上锁或解锁。密码存储在128位的PWD寄存器中,它的长度设置在8位的PWD_LEN寄存器中。这些寄存器是不可挥发的,即掉电后它们的内容不丢失。已上锁的卡能够响应和执行相应的命令,即允许SDIO卡主机模块执行复位、初始化和查询状态等操作,但不允许操作卡中的数据。当设置了密码后(即PWD_LEN的数值不为0),上电后卡自动处于上锁状态。正如CSD和CID寄存器写命令,上锁/解锁命令仅在传输状态下有效,在这个状态下,命令中没有地址参数,但卡已经被选中。卡的上锁/解锁命令具有单数据块写命令的结构和总线操作类型,传输的数据块包含所有命令所需要的信息(密码设置模式、PWD内容和上锁/解锁指示)。在发送卡的上锁/解锁命令之前,命令数据块的长度由SDIO卡主机模块定义。

位的设置如下:

● ERASE:设置该位将执行强制擦除,所有其它位必须为0,只发送命令字节。

● LOCK_UNLOCK:设置该位锁住卡,LOCK_UNLOCK与SET_PWD可以同时设置,但不能与CLR_PWD同时设置。

● CLR_PWD:设置该位清除密码数据。

● SET_PWD:设置该位将密码数据保存至存储器。

● PWD_LEN:以字节为单位定义密码的长度。

● PWD:密码(依不同的命令,新的密码或正在使用的密码)

以下几节列出了设置/清除密码、上锁/解锁和强制擦除的命令序列。

设置密码

1. 选择一个卡(SELECT/DESELECT_CARD,CMD7)。

2. 定义要在8位的卡上锁/解锁模式下发送的数据块长度(SET_BLOCKLEN,CMD16),8位的PWD_LEN,新密码的字节数目。当更换了密码后,发送命令的数据块长度必须同时考虑新旧密码的长度。

3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC码。数据块包含了操作模式(SET_PWD=1)、长度(PWD_LEN)和密码(PWD)。当更换了密码后,长度数值(PWD_LEN)包含了新旧两个密码的长度,PWD域包含了旧的密码(正在使用的)和新的密码。

4. 当旧的密码匹配后,新的密码和它的长度被分别存储在PWD和PWD_LEN域。如果送出的旧密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,同时密码不变。

密码长度域(PWD_LEN)指示当前是否设置了密码,如果该域为非零,则表示使用了密码,卡在上电时自动上锁。在不断电的情况下,如果设置了密码,可以通过设置LOCK_UNLOCK位或发送一个额外的上锁命令,立即锁住卡。

清除密码

1. 选择一个卡(SELECT/DESELECT_CARD,CMD7)。

2. 定义要在8位的卡上锁/解锁模式下发送的数据块长度(SET_BLOCKLEN,CMD16),8位的PWD_LEN,当前使用密码的字节数目。

3. 当密码匹配后,PWD域被清除同时PWD_LEN被设为0。如果送出的密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,同时密码不变。

卡上锁

1. 选择一个卡(SELECT/DESELECT_CARD,CMD7)

2. 定义要在8位的卡上锁/解锁模式(见表142的字节0)下发送的数据块长度(SET_BLOCKLEN,CMD16),8位的PWD_LEN,和当前密码的字节数目。

3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC码。数据块包含了操作模式(LOCK_UNLOCK=1)、长度(PWD_LEN)和密码(PWD)。

4. 当密码匹配后,卡被上锁并则设置状态寄存器中的CARD_IS_LOCKED状态位。如果送出的密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,同时上锁操作失败。

设置密码和为卡上锁可以在同一个操作序列中进行,此时SDIO卡主机模块按照前述的步骤设置密码,但在发送新密码命令的第3步需要设置LOCK_UNLOCK位。

如果曾经设置过密码(PWD_LEN不为0),卡会在上电复位时自动地上锁。对已经上锁的卡执行上锁操作或对没有密码的卡执行上锁操作会导致失败,并设置状态寄存器中的LOCK_UNLOCK_FAILED错误位。

卡解锁

1. 选择一个卡(SELECT/DESELECT_CARD,CMD7)

2. 定义要在8位的卡上锁/解锁模式(见表142的字节0)下发送的数据块长度(SET_BLOCKLEN,CMD16),8位的PWD_LEN,和当前密码的字节数目。

3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC码。数据块包含了操作模式(LOCK_UNLOCK=0)、长度(PWD_LEN)和密码(PWD)。

4. 当密码匹配后,卡锁被解除,同时状态寄存器中的CARD_IS_LOCKED位被清除。如果送出的密码与期望的密码(长度或内容)不吻合,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,同时卡仍保持上锁状态。

解锁状态只在当前的供电过程中有效,只要不清除PWD域,下次上电后卡会被自动上锁。

试图对已经解了锁的卡执行解锁操作会导致操作失败,并设置状态寄存器中的LOCK_UNLOCK_FAILED错误位。

强制擦除

如果用户忘记了密码(PWD的内容),可以在清除卡中的所有内容后使用卡。强制擦除操作擦除所有卡中的数据和密码。

1. 选择一个卡(SELECT/DESELECT_CARD,CMD7)

2. 设置发送的数据块长度(SET_BLOCKLEN,CMD16)为1,仅发送8位的卡上锁/解锁字节(见表142的字节0)。

3. 以合适的数据块长度在数据线上发送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC码。数据块包含了操作模式(ERASE=1)所有其它位为0。

4. 当ERASE位是数据域中仅有的位时,卡中的所有内容将被擦除,包括PWD和PWD_LEN域,同时卡不再被上锁。如果有任何其它位不为0,则设置状态寄存器中的LOCK_UNLOCK_FAILED错误位,卡中的数据保持不变,同时卡仍保持上锁状态。

试图对已经解了锁的卡执行擦除操作会导致操作失败,并设置状态寄存器中的LOCK_UNLOCK_FAILED错误位。


分享到:


相關文章: