1.简介
OCR 是一个 32位(4字节) 的只读寄存器,位于 SD 卡内部。它的主要作用有两个:
1、报告 SD 卡支持的工作电压范围。
2、指示上电初始化过程是否完成。
当主机(例如单片机、树莓派、手机)与 SD 卡通信时,首先需要读取 OCR 寄存器来确认双方是否“兼容”,并等待卡准备好接受后续命令。
2.位定义
| bit | 解析 |
|---|---|
| 31 | 卡上电状态位。0:卡仍在初始化过程中,繁忙。1:卡初始化过程完成,准备就绪。这是主机在发送 ACMD41(SD Memory Card)或 CMD1(MMC 卡)命令时,需要轮询检查的关键位。只有当此位变为 1 时,主机才能继续进行下一步操作。 |
| 24 | switching to 1.8v(request/accepted),对应的内核宏为:SD_OCR_S18R/SD_ROCR_S18A |
| 23 | VDD voltage 3.5 ~ 3.6,参考内核宏MMC_VDD_35_36 |
| 22 | VDD voltage 3.4 ~ 3.5,参考内核宏MMC_VDD_34_35 |
| 21 | VDD voltage 3.3 ~ 3.4,参考内核宏MMC_VDD_33_34 |
| 20 | VDD voltage 3.2 ~ 3.3,参考内核宏MMC_VDD_32_33 |
| 19 | VDD voltage 3.1 ~ 3.2,参考内核宏MMC_VDD_31_32 |
| 18 | VDD voltage 3.0 ~ 3.1,参考内核宏MMC_VDD_30_31 |
| 17 | VDD voltage 2.9 ~ 3.0,参考内核宏MMC_VDD_29_30 |
| 16 | VDD voltage 2.8 ~ 2.9,参考内核宏MMC_VDD_28_29 |
| 15 | VDD voltage 2.7 ~ 2.8,参考内核宏MMC_VDD_27_28 |
| 14 | VDD voltage 2.6 ~ 2.7,参考内核宏MMC_VDD_26_27 |
| 13 | VDD voltage 2.5 ~ 2.6,参考内核宏MMC_VDD_25_26 |
| 12 | VDD voltage 2.4 ~ 2.5,参考内核宏MMC_VDD_24_25 |
| 11 | VDD voltage 2.3 ~ 2.4,参考内核宏MMC_VDD_23_24 |
| 10 | VDD voltage 2.2 ~ 2.3,参考内核宏MMC_VDD_22_23 |
| 9 | VDD voltage 2.1 ~ 2.2,参考内核宏MMC_VDD_21_22 |
| 8 | VDD voltage 2.0 ~ 2.1,参考内核宏 MMC_VDD_20_21 |
| 7 | VDD voltage 1.65 - 1.95,参考内核宏MMC_VDD_165_195 |
3.如何读取ocr寄存器
3.1 主机发送 CMD58。
SD 卡响应,并在数据线上返回一个 R3 响应。
R3 响应包含 5 个字节:
第1个字节:CMD58 的响应字节。
第2-5个字节:就是 32 位的 OCR 寄存器值。
3.2 acmd41指令
4.实际应用示例
4.1 字节粒度
假设你通过 CMD58 读取到一个 OCR 值为:0x80FF8000(这是一个非常典型的返回值)。
我们将其分解为二进制来分析:
0x80FF8000 的二进制是:1000 0000 1111 1111 1000 0000 0000 0000
位 31:是 1。这意味着卡已经上电完成,准备就绪。
位 7:是 1。这意味着卡支持 2.7-3.6V 的标准电压。
所以,这个值告诉主机:
“我已经准备好了(位31=1)。”
“我可以在 2.7V 到 3.6V 的电压下工作(位7=1)。”
主机看到这个响应后,就知道可以开始进行后续的识别、读写等操作了。
4.2 通信流程粒度
OCR 寄存器的读取和检查是 SD 卡初始化流程的核心部分,特别是与 ACMD41 命令配合使用。
简化版的 SD 卡初始化流程:
主机发送 CMD0 使卡进入空闲状态。
主机发送 CMD8 检查卡是否支持 SDHC/SDXC(Ver2.00+)。
主机循环发送 ACMD41,并将主机支持的电压范围(例如,将 OCR 的位7置1)作为命令参数发送给卡。
卡在初始化过程中,会不断返回它的 OCR 寄存器值(通过 ACMD41 的响应)。
主机每次收到响应,都检查:
位31 是否为 1?如果不是,回到步骤3,继续发送 ACMD41。
如果是 1,则初始化完成。同时,主机还可以检查返回的电压窗口,确认卡是否支持主机提供的电压。
1418

被折叠的 条评论
为什么被折叠?



