文章目录
- 简述
- 命令参数含义
- 状态数据结构及含义
- 功能切换流程
- Mode0(查询功能)步骤
- Mode1(切换功能)步骤
- 示例
本文章主要讲解关于SD2.0功能切换(CMD6)的内容,基础概念和其它内容请参考以下文章。
SD2.0 Specification简述
简述
SD卡将一些功能进行分组,归属于同一组的若干功能,在同一时刻只能有一个生效,也就是组内功能互斥,具体哪一个生效,可通过CMD6命令来指定,每组都会有一个默认生效的功能。断上电或者发送CMD0命令进行复位,都会导致默认功能生效。
目前SD2.0总规划是分成6个功能组,每组可包含16个功能。但当前只使用了2个功能组,其它组预留,方便以后升级扩展。
- 组1是访问模式,只包含2个速度选项,一个是默认速度(12.5 MB/sec),一个是高速(25 MB/sec)。从SD1.10版本开始,SD卡支持高速模式,但上电后,是处于默认速度模式,需要通过切换使得SD卡支持高速模式,让主机能够以50MHz的速度访问。
- 组2是命令系统,包含3个选项,分别是标准命令集、电子商务命令集、供应商特定命令集。该功能组涉及的命令包括CMD34-37, CMD50以及CMD57。在标准命令集下,SD卡不支持这些命令,视为非法命令;在供应商特定命令集下,这些命令的作用由SD卡供应商自行定义;在电子商务命令集下,这些命令按照《SD Specifications Part A1: Mobile Commerce Extension Specification》的规定实现相应功能。标准命令集是默认有的,其它两个是可选项。
CMD6命令既可查询当前功能,也可切换功能,具体使用哪种,会在CMD6的参数里面用1 bit标记出来,让SD卡识别判断。
mode0:查询功能
mode1:切换功能
CMD6的通信过程类似于读命令,SD卡除了会在CMD线上回Response,还会在DAT线上返回512 bits的数据,这些数据表明各功能情况。在收到命令后,SD卡需要在100ms内返回数据,如果是使用切换功能(Mode1),则卡需要在发送完数据后的8个时钟周期内做好切换,主机也至少需要等待8个时钟周期才能使用新功能。
命令参数含义
如上所示,CMD6的32位参数中,[31]用于指定模式,[23:0]用于指定每个功能组要查询或者切换的功能,因为不支持功能组6~功能组3,所以这里对应的值通常是0或者Fh。
状态数据结构及含义
位置 | 描述 | 宽度 |
---|---|---|
511:496 | 最大功耗 | 16 |
495:480 | 第6功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
479:464 | 第5功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
463:448 | 第4功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
447:432 | 第3功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
431:416 | 第2功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
415:400 | 第1功能组信息,位被置1则表示支持该位所对应的功能 | 16 |
399:396 | 对应第6功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 (参考后续状态码的解释,可以更好理解) | 4 |
395:392 | 对应第5功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 | 4 |
391:388 | 对应第4功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 | 4 |
387:384 | 对应第3功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 | 4 |
383:380 | 对应第2功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 | 4 |
379:376 | 对应第1功能组。mode0:表示组内可切换的功能。 mode1:表示切换后的功能, 0xF表示设置出错了 | 4 |
375:368 | 该数据结构的版本 00h-->bits 511:376 都有定义 01h-->bits 511:272 都有定义 02h-FFh-->保留 | 8 |
367:352 | 标记第6功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
351:336 | 标记第5功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
335:320 | 标记第4功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
319:304 | 标记第3功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
303:288 | 标记第2功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
287:272 | 标记第1功能组的busy状态 。位被置1则表示对应的功能正处于busy状态, mode0和mode1都能得到这个信息 | 16 |
271:0 | 保留(全是0) | 272 |
位[367:272] 表示相应功能busy与否,如果功能A处于busy状态,则不能切换到功能A,只有处于ready状态的功能才能切换。
位[399:376] 表示的是Status Code,在mode0和mode1下有差别,以下表格将逐一解释。
参数 | Busy Status | Status Code | 含义 |
---|---|---|---|
0 | 忽略 | 0 | Status Code为默认功能的编码,也就是0 |
支持的功能 | Ready | 等于参数 | 支持参数里面指定的功能并且现在处于ready状态可以切换,所以返回该功能的编码 |
Busy | 当前正在使用的功能编码 | 支持参数里面指定的功能,但现在处于busy状态,无法切换,所以返回的是现在正在使用的功能编码 | |
不支持的功能 | 忽略 | Fh | 不支持参数里面指定的功能,返回Fh值 |
Fh型 | 忽略 | 当前正在使用的功能编码 | 参数指定为Fh,返回的是现在正在使用的功能编码 |
参数 | Busy Status | Status Code | 含义 |
---|---|---|---|
0 | 忽略 | 0 | 默认功能一定是可切换的,所以返回0 |
支持的功能 | Ready | 等于参数 | 支持参数里面指定的功能并且现在处于ready状态,可以切换且切换成功,所以返回切换后的功能编码,也就是参数值 |
Busy | 当前正在使用的功能编码 | 支持参数里面指定的功能,但现在处于busy状态,取消切换,所以返回的是现在正在使用的功能编码 | |
不支持的功能 | 忽略 | Fh | 不支持参数里面指定的功能,返回Fh值。一个功能组切换出错,其它功能组的切换都会取消 |
Fh型 | 忽略 | 当前正在使用的功能编码 | 参数指定为Fh,表示维持原功能,返回的是现在正在使用的功能编码 |
参数 | Busy Status | Status Code | 含义 |
---|---|---|---|
0 | 忽略 | 0 | 总是0 |
Eh-1h | 忽略 | Fh | 总是Fh |
Fh型 | 忽略 | 0 | 总是0 |
功能切换流程
整个功能切换流程如上图所示,可以简单理解为以下3步
- 查询支持哪些功能。
- 检查要切换的功能是否ready以及功耗情况。
- 开始切换。
Mode0(查询功能)步骤
- 配置命令参数
a、配置为mode0模式。
b、每个功能组选择一个要查询的功能编码。 配置成Fh,返回的则是当前在使用的功能编码,
其它效果可参考前面的状态码描述表内容
- 获取512 bits状态数据
数据里面包含可支持的功能、功能的busy状态等等。
Mode1(切换功能)步骤
- 配置命令参数
a、配置为mode1模式。
b、每个功能组选择一个要切换的功能编码。 配置成Fh,返回的则是当前在使用的功能编码,
其它效果可参考前面的状态码描述表内容
- 获取512 bits状态数据
可从得到数据里面判断是否切换成功
示例