SD2.0 Specification之写保护

7 篇文章 0 订阅


本文章主要讲解关于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 密码设置

  1. 主机通过CMD7命令寻址要操作的SD卡。
  2. 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
  3. 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中SET_PWD位要置1,PWDS_LEN和Password data都要设置好。如果是修改密码,则Password data区域需要包含新旧密码,相应的,PWDS_LEN则是新旧密码的总长度。
  4. 如果是初次设置密码,则SD卡将保存密码长度(PWDS_LEN值)和Password data区域的密码。如果是修改密码,SD卡首先判断旧密码是否正确,如果不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记,同时密码不作修改;如果旧密码正确,则保存新密码以及新密码的长度(由旧密码长度和当前PWDS_LEN值计算得到)。

注:

  • 如果SD卡中的密码长度值为0,表明没有设置密码;如果不为0,则在上电的时候,SD会自动锁定。
  • 在不断电的情况下,若在设置密码时将LOCK/UNLOCK位置1或者之后再发命令将LOCK/UNLOCK位置1,将直接锁定SD卡。

3.3 清除密码

  1. 主机通过CMD7命令寻址要操作的SD卡。
  2. 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
  3. 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中CLR_PWD位要置1,密码以及密码长度要设置好。如果SD卡判断密码正确,则将SD卡上的密码以及密码长度都将清除;如密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。

3.4 锁定卡

  1. 主机通过CMD7命令寻址要操作的SD卡。
  2. 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
  3. 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中LOCK/UNLOCK位要置1,密码以及密码长度要设置好。如果密码正确,则SD卡会被锁定并且在状态寄存器对应的位置会标记已锁定;如果密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。

注:

  • 如果设置密码和锁定卡要一起完成,则主机在设置密码的同时,数据包中的LOCK/UNLOCK位也要置1。
  • 如果SD卡已经设置过密码,则在上电或者复位后将自动锁定。
  • 如果锁定一个已锁定或者没有密码的卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。

3.5 解锁卡

  1. 主机通过CMD7命令寻址要操作的SD卡。
  2. 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度。
  3. 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。数据包中LOCK/UNLOCK位要置0,密码以及密码长度要设置好。如果密码正确,则SD卡会被解锁并且在状态寄存器对应的位置会标记已解锁;如果密码不正确,则在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。

注:

  • 解锁只在当前上电周期有效,重新上电后又会自动锁定。
  • 如果去解锁一个已解锁的SD卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。

3.6 强制擦除

强制擦除功能可以在用户忘记SD卡的解锁密码时使用,该功能将擦除掉所有用户数据和密码相关内容,相当于一张空卡。

  1. 主机通过CMD7命令寻址要操作的SD卡。
  2. 主机发送CMD16命令告诉SD卡接下来CMD42命令要发送的数据包长度为1byte
  3. 主机发送CMD42命令以及数据包(数据包采用CRC16校验方式)。这里只需发1byte,数据中将ERASE位置1,其它位都置0。

注:

  • 如果除了ERASE位还有其它位被置1,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记,并且不执行擦除功能。
  • 如果去强制擦除没有上锁的卡,则SD卡会在状态寄存器的LOCK_UNLOCK_FAILED位做好出错标记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值