4015
- 收藏
- 点赞
- 分享
- 举报
SD卡接口规范
总线接口
SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口中:SD模式接口和SPI接口。SD卡在上电初期,卡主控通过检测引脚1(DAT3)来决定使用SD模式还是SPI模式。当此脚接50KOhm上拉电阻时,卡进入SD模式;当此脚为低电平,卡则工作于SPI模式。
SD引脚
SD模式
SPI模式
1
DAT3
CS
2
CMD
DI
3
VSS
VSS
4
VDD
VDD
5
CLK
SCLK
6
VSS
VSS
7
DAT0
DO
8
DAT1
Resvered
9
DAT2
Resvered
表1:SD卡接口定义
1、SPI接口
SPI接口是为嵌入式和手持设备准备的,只使用普通的三线制SPI总线,即可对卡进行一般的慢速的读写等操作。
图一:SPI总线
如上图,由读卡器到卡的数据,在每个时种的上升沿把DO的数据锁存到卡主控,而卡的数据则在每个CLK的上升沿把DI的数据读入读卡器。
2、SD接口
SD接口是为高速专有设备而设计,使设备能对卡进行高速可靠的传输而设计,因SD模式在每个命令及数据转输时,都必须具有正确的CRC校验。因此,此模式下主机一般需要专门设计的硬件模块以产生CRC校验。
在此模式下,SD卡具有四根数据线,且时种速度最大可达50MHz,所以此模式下数据传输速率比SPI模式快得多。
三、总线协议
SD卡命令共分为12类,分别为class0到class11,不同的卡主控根据其功能,支持不同的命令集。主要如下:
class0:卡的识别、初始化命令集。
class2:读卡命令集
class4:写卡命令集
class7:卡的锁定,解锁功能命令集
SD卡只有唯一的主机,所有命令是由主机发出。总线上可传输三种类型数据,分别是命令帧、响应、数据。
命令帧:由总线上唯一的主机发出,由设备响应并执行。
响应:指设备响应主机的命令。
数据:指由主机传给设备,或由设备传给主机的数据实体。
如上图,命令帧一共由48bit组成,其中起始位固定为0,结束位固定为1。每个命令最后1字节包含7bit的CRC校验,第一字节为的另外7bit为命令码,中间的32bit为命令参数。
一个完整的命令由命令帧和响应,或命令帧、响应和数据组合而成。
图二:Mult Block Read
如上图,主机发出command请求,然后卡返回该命令的respond,如果respond响应为正确,则Host通过读取cmd线状态,等待卡准备好数据;如果cmd为低电平,表示卡busy,busy结束后卡会把cmd线拉高,并且发出start token,随即进入数据传输阶段;数据传输结束后,主机发送结束命令停止命令,传输结束。
四、卡的初始化
上电后,卡处于IDLE状态,主机发送CMD0复位SD Card,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。但如果是MMC卡,则不能识别CMD55,所以可以通过此命令的响应正确与否,判断插入的是MMC卡还是SD卡。
得到正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。
此时,卡已进入了传输状态,主机就可通过CMD17/18和CMD24/25对卡进行读写。
继SD1.1之后又推出了SD2.0,主要特性是支持更大容量。SD1.1中卡容量存放于CSD寄存器中,而由于其规范中相关域的值较小,固最大只能表示2G地址。随着Nand容量的大大提高,SD1.1已经不适合潮流,因而推出了SD2.0。
初始化流程大同小义,只需要CMD0之后再加上CMD8命令的识别。SD1.1不支持CMD8,而SD2.0的CMD8能读到卡的接口信息。如果卡响应CMD8为无效命令,则走SD1.1的流程,可能是SD1.1或MMC。如CMD8响应正确,则很可能是SD2.0了。
五、加密
SD卡具有安全加密功能,内置128bit加密位,在加密状态下,用户需提供密码才可以访问卡内的数据。
在卡上电时,若卡包含密码,卡自动进入锁定状态,读写命令均返回错误,以保护卡内容不被读出及修改。
密码设置功能由CMD42实现,其数据包中包括该命令中所有的信息。
Byte
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
0
Erase Card
Lock/UnLock
ClrPwd
SetPwd
1
Psw_Length
2
Pwd Data
PwdLen+1
擦除:此位置1时,卡的密码和内容会被强制擦除,在遗忘密码时可使用此功能。
锁定/解锁:此位置1时,表示命令结束后状态为锁定,为0,表示卡解锁。
清除密码:此位置1,表示清除卡的旧密码,此时数据中必须包含旧密码的正确内容。
加密:此位置1,表示设置卡的新密码,数据中必须包含新密码内容;更改密码时,新密码紧跟随旧密码内容。
注:在CMD42命令之前,首先要使卡工作在传输状态,在SD模式下可使用CMD7进行状态转换,在SPI模式下,可使用初始化序列进行状态切换。
在任意刻,主机可以通过CMD13命令读取卡的内部状态,判断其锁定状态。定义如下:
图略
bit0置1表示卡处于锁定状态。
1、设置密码
使用CMD16设置Block长度为密码长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x01,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
2、清除密码
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x02,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
3、卡的锁定、解锁
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x04,LEN,密码[LEN]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
4、修改密码
使用CMD16设置Block长度为OLD_PWD_LEN+NEW_PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x05,LEN,旧密码[n],新密码[m]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
5、卡擦除
使用CMD16设置Block长度为1;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x08,0xFF,0xFF;
使用CMD16恢复原Block长度。
SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口中:SD模式接口和SPI接口。SD卡在上电初期,卡主控通过检测引脚1(DAT3)来决定使用SD模式还是SPI模式。当此脚接50KOhm上拉电阻时,卡进入SD模式;当此脚为低电平,卡则工作于SPI模式。
SD引脚
SD模式
SPI模式
1
DAT3
CS
2
CMD
DI
3
VSS
VSS
4
VDD
VDD
5
CLK
SCLK
6
VSS
VSS
7
DAT0
DO
8
DAT1
Resvered
9
DAT2
Resvered
表1:SD卡接口定义
1、SPI接口
SPI接口是为嵌入式和手持设备准备的,只使用普通的三线制SPI总线,即可对卡进行一般的慢速的读写等操作。
图一:SPI总线
如上图,由读卡器到卡的数据,在每个时种的上升沿把DO的数据锁存到卡主控,而卡的数据则在每个CLK的上升沿把DI的数据读入读卡器。
2、SD接口
SD接口是为高速专有设备而设计,使设备能对卡进行高速可靠的传输而设计,因SD模式在每个命令及数据转输时,都必须具有正确的CRC校验。因此,此模式下主机一般需要专门设计的硬件模块以产生CRC校验。
在此模式下,SD卡具有四根数据线,且时种速度最大可达50MHz,所以此模式下数据传输速率比SPI模式快得多。
三、总线协议
SD卡命令共分为12类,分别为class0到class11,不同的卡主控根据其功能,支持不同的命令集。主要如下:
class0:卡的识别、初始化命令集。
class2:读卡命令集
class4:写卡命令集
class7:卡的锁定,解锁功能命令集
SD卡只有唯一的主机,所有命令是由主机发出。总线上可传输三种类型数据,分别是命令帧、响应、数据。
命令帧:由总线上唯一的主机发出,由设备响应并执行。
响应:指设备响应主机的命令。
数据:指由主机传给设备,或由设备传给主机的数据实体。
如上图,命令帧一共由48bit组成,其中起始位固定为0,结束位固定为1。每个命令最后1字节包含7bit的CRC校验,第一字节为的另外7bit为命令码,中间的32bit为命令参数。
一个完整的命令由命令帧和响应,或命令帧、响应和数据组合而成。
图二:Mult Block Read
如上图,主机发出command请求,然后卡返回该命令的respond,如果respond响应为正确,则Host通过读取cmd线状态,等待卡准备好数据;如果cmd为低电平,表示卡busy,busy结束后卡会把cmd线拉高,并且发出start token,随即进入数据传输阶段;数据传输结束后,主机发送结束命令停止命令,传输结束。
四、卡的初始化
上电后,卡处于IDLE状态,主机发送CMD0复位SD Card,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。但如果是MMC卡,则不能识别CMD55,所以可以通过此命令的响应正确与否,判断插入的是MMC卡还是SD卡。
得到正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。
此时,卡已进入了传输状态,主机就可通过CMD17/18和CMD24/25对卡进行读写。
继SD1.1之后又推出了SD2.0,主要特性是支持更大容量。SD1.1中卡容量存放于CSD寄存器中,而由于其规范中相关域的值较小,固最大只能表示2G地址。随着Nand容量的大大提高,SD1.1已经不适合潮流,因而推出了SD2.0。
初始化流程大同小义,只需要CMD0之后再加上CMD8命令的识别。SD1.1不支持CMD8,而SD2.0的CMD8能读到卡的接口信息。如果卡响应CMD8为无效命令,则走SD1.1的流程,可能是SD1.1或MMC。如CMD8响应正确,则很可能是SD2.0了。
五、加密
SD卡具有安全加密功能,内置128bit加密位,在加密状态下,用户需提供密码才可以访问卡内的数据。
在卡上电时,若卡包含密码,卡自动进入锁定状态,读写命令均返回错误,以保护卡内容不被读出及修改。
密码设置功能由CMD42实现,其数据包中包括该命令中所有的信息。
Byte
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
0
Erase Card
Lock/UnLock
ClrPwd
SetPwd
1
Psw_Length
2
Pwd Data
PwdLen+1
擦除:此位置1时,卡的密码和内容会被强制擦除,在遗忘密码时可使用此功能。
锁定/解锁:此位置1时,表示命令结束后状态为锁定,为0,表示卡解锁。
清除密码:此位置1,表示清除卡的旧密码,此时数据中必须包含旧密码的正确内容。
加密:此位置1,表示设置卡的新密码,数据中必须包含新密码内容;更改密码时,新密码紧跟随旧密码内容。
注:在CMD42命令之前,首先要使卡工作在传输状态,在SD模式下可使用CMD7进行状态转换,在SPI模式下,可使用初始化序列进行状态切换。
在任意刻,主机可以通过CMD13命令读取卡的内部状态,判断其锁定状态。定义如下:
图略
bit0置1表示卡处于锁定状态。
1、设置密码
使用CMD16设置Block长度为密码长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x01,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
2、清除密码
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x02,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢复原Block长度。
3、卡的锁定、解锁
使用CMD16设置Block长度为PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x04,LEN,密码[LEN]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
4、修改密码
使用CMD16设置Block长度为OLD_PWD_LEN+NEW_PWD_LEN+2;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x05,LEN,旧密码[n],新密码[m]……,0xFF,0xFF;
使用CMD16恢复原Block长度。
5、卡擦除
使用CMD16设置Block长度为1;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x08,0xFF,0xFF;
使用CMD16恢复原Block长度。
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2020-10-07 18:02:38
-
2018-12-05 17:56:08
-
2016-03-27 16:35:14
-
12018-06-29 14:51:12
-
42015-10-08 09:15:23
-
22019-08-16 09:25:39
-
2023-08-29 09:45:44
-
2017-08-10 19:05:41
-
2021-10-25 11:11:24
-
2019-06-24 17:30:54
-
2013-08-25 16:25:40
-
2013-08-24 20:31:08
-
2012-12-04 11:19:53
-
2013-08-26 14:07:33
-
182018-08-10 20:29:34
-
2013-11-22 22:55:42
-
2017-03-01 09:15:37
-
2018-05-09 23:57:33
-
2014-07-31 13:32:21
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认