本文章主要讲解关于SD2.0写保护功能的内容,基础概念和其它内容请参考以下文章。
SD2.0 Specification简述
SD卡可支持3种写保护管理方式。
1 机械开关写保护(由主机负责实现效果)
在卡的一侧有一个机械滑台,滑动这个滑台可以选择写保护或者不保护。这个机械滑台没有任何内部电路,即跟SD卡内部没有任何关联。在插入卡槽时,主机根据滑台的位置决定要不要进行写保护。
2 卡内部写保护(由卡负责实现)
通过设置CSD寄存器的写保护位,使相应的地址进入写保护状态。
注:大容量卡不支持这种方式。
3 密码加解锁写保护
这种保护方式通过设置密码进行锁定或者解锁来实现的。当上锁时,SD卡只对特定的一些命令(class0命令/ACMD41/CMD16/CMD42)做出反应,只有使用密码解锁成功,才能像使用普通SD卡那样操作。打个比方,就像是设置了锁屏密码的手机,只有输入正确解锁密码,手机才能正常使用。
该功能通过CMD42(lock/unlock command )实现,主要包括设置密码、清除密码、锁定卡、解锁卡、强制擦除功能。CMD42是带数据包的命令,每次发送命令,所有功能要求以及密码都包含在数据包中。
3.1 数据包结构
ERASE:置1表示定义一个强制擦除操作。
LOCK/UNLOCK:置1表示锁定卡,置0表示解锁卡。
CLR_PWD:置1表示清除密码。
SET_PWD:置1表示要设置密码。
PWDS_LEN:记录密码长度。如果是初次设置密码,则直接记录该密码长度,最长为16byte,如果是修改密码,则记录新旧密码的总长度,最大为32byte。
Password data:密码保存区域。如果修改密码,则新密码跟在旧密码后面。
由数据包的结构定义可以看出,该数据包的大小是可以变化的,所以主机端需要通过CMD16修改SD端的数据包接收能力。
3.2 密码设置
- 主机通过CMD7命令寻址要操作的SD卡。
- 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
- 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中SET_PWD位要置1,PWDS_LEN和Password data都要设置好。如果是修改密码,则Password data区域需要包含新旧密码,相应的,PWDS_LEN则是新旧密码的总长度。
- 如果是初次设置密码,则SD卡将保存密码长度(PWDS_LEN值)和Password data区域的密码。如果是修改密码,SD卡首先判断旧密码是否正确,如果不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记,同时密码不作修改;如果旧密码正确,则保存新密码以及新密码的长度(由旧密码长度和当前PWDS_LEN值计算得到)。
注:
- 如果SD卡中的密码长度值为0,表明没有设置密码;如果不为0,则在上电的时候,SD会自动锁定。
- 在不断电的情况下,若在设置密码时将LOCK/UNLOCK位置1或者之后再发命令将LOCK/UNLOCK位置1,将直接锁定SD卡。
3.3 清除密码
- 主机通过CMD7命令寻址要操作的SD卡。
- 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
- 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中CLR_PWD位要置1,密码以及密码长度要设置好。如果SD卡判断密码正确,则将SD卡上的密码以及密码长度都将清除;如密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
3.4 锁定卡
- 主机通过CMD7命令寻址要操作的SD卡。
- 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
- 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中LOCK/UNLOCK位要置1,密码以及密码长度要设置好。如果密码正确,则SD卡会被锁定并且在状态寄存器对应的位置会标记已锁定;如果密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
注:
- 如果设置密码和锁定卡要一起完成,则主机在设置密码的同时,数据包中的LOCK/UNLOCK位也要置1。
- 如果SD卡已经设置过密码,则在上电或者复位后将自动锁定。
- 如果锁定一个已锁定或者没有密码的卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
3.5 解锁卡
- 主机通过CMD7命令寻址要操作的SD卡。
- 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
- 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中LOCK/UNLOCK位要置0,密码以及密码长度要设置好。如果密码正确,则SD卡会被解锁并且在状态寄存器对应的位置会标记已解锁;如果密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
注:
- 解锁只在当前上电周期有效,重新上电后又会自动锁定。
- 如果去解锁一个已解锁的SD卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
3.6 强制擦除
强制擦除功能可以在用户忘记SD卡的解锁密码时使用,该功能将擦除掉所有用户数据和密码相关内容,相当于一张空卡。
- 主机通过CMD7命令寻址要操作的SD卡。
- 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度为1byte。
- 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。这里只需发1byte,数据中将ERASE位置1,其它位都置0。
注:
- 如果除了ERASE位还有其它位被置1,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记,并且不执行擦除功能。
- 如果去强制擦除没有上锁的卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。