USER GUIDE / MEMORY / EMMC SD / DATA FORMAT

数据格式

数据格式说明

支持 1/4 比特数据位宽。

MSC 数据格式
图 1 MSC 数据格式

MSC 实现了 SD 主机控制器规范中定义的所有寄存器,该规范定义了 SD 模式的寄存器。其中一些寄存器在 eMMC 模式中重复使用。此外,MSC 主机控制器接口中还定义了 eMMC 规范中命令请求部分的寄存器。

在访问 MSC 存储空间内未使用的地址时,读取的数据全为零时读操作成功完成,写入的数据被丢弃时写操作成功完成。

MSC 支持不同类型的卡接口,即 SD 卡和 eMMC 卡。为支持 SD 卡接口,MSC 实现了 SD 主控制器规范中定义的所有寄存器。这些寄存器可用于传统 SD 总线接口模式。用于传统 SD 总线接口模式的大部分寄存器在 eMMC 总线接口模式下也可重复使用。表 1 列出了相应卡接口模式下寄存器的使用情况。

表 1 不同寄存器类型支持的卡接口
寄存器类型特定寄存器类型的可用寄存器在传统 SD 模式下是否支持?在 eMMC 模式下是否支持?
SD/eMMC 生成寄存器BLOCKSIZE_R
BLOCKCOUNT_R
ARGUMENT_R
XFER_MODE_R
CMD_R
yesyes
响应寄存器RESP01_R
RESP23_R
RESP45_R
RESP67_R
yesyes
从机模式内存访问寄存器BUF_DATA_Ryesyes
主机设置和功能寄存器PSTATE_REG
HOST_CTRL1_R
BGAP_CTRL_R
CLK_CTRL_R
SW_RST_R
NORMAL_INT_STAT_R
ERROR_INT_STAT_R
NORMAL_INT_STAT_EN_R
ERROR_INT_STAT_EN_R
NORMAL_INT_SIGNAL_EN_R
ERROR_INT_SIGNAL_EN_R
HOST_CTRL2_R
CAPABILITIES1_R
CAPABILITIES2_R
CURR_CAPABILITIES1_R
CURR_CAPABILITIES2_R
PRESET_INIT_R
PRESET_DS_R
PRESET_HS_R
PRESET_SDR12_R
PRESET_SDR25_R
PRESET_SDR50_R
PRESET_SDR104_R
PRESET_DDR50_R
PRESET_UHS2_R
AT_CTRL_R
AT_STAT_R
MSHC_CTRL_R
TOUT_CTRL_R
AUTO_CMD_STAT_R
FORCE_AUTO_CMD_STAT_R
FORCE_ERROR_INT_STAT_R
yesyes
EMMC_CTRL_Rnoyes
DMA 寄存器SDMASA_R
ADMA_ERR_STAT_R
ADMA_SA_LOW_R
ADMA_SA_HIGH_R
ADMA_ID_LOW_R
ADMA_ID_HIGH_R
yesyes
指针寄存器P_VENDOR_SPECIFIC_AREAyesYes
P_VENDOR2_SPECIFIC_AREnoyes
厂商特定寄存器MSHC_VER_ID_R
MSHC_VER_TYPE_R
yesyes
命令队列寄存器CQVER
CQCAP
CQCFG
CQCTL
CQIS
CQISE
CQISGE
CQIC
CQTDLBA
CQTDLBAU
CQTDBR
CQTCN
CQDQS
CQDPT
CQTCLR
CQSSC1
CQSSC2
CQCRDCT
CQRMEM
CQTERRI
CQCRI
CQCRA
noyes

数据流

主机控制器通过系统总线接口与软件驱动程序通信,通过 SD 总线接口与卡通信。图 2 描述了通过主机控制器的高级数据流。

主机控制器数据流
图 2 主机控制器数据流

主机驱动程序可使用编程输入/输出方法或任何已定义的 DMA 方法传输数据。在编程输入/输出(PIO)数据传输方法中,数据由主机驱动程序传输到系统内存。它可以根据数据块(SD/eMMC)进行传输。在卡写入过程中,控制器会在有一个数据块的空间时提供缓冲区写入就绪中断。根据该中断,主机驱动程序必须通过缓冲区数据端口将一个数据块从系统内存传输到 MSC 缓冲区。控制器将该数据块发送到卡后,在使用缓冲区读就绪中断读卡时,同样的机制将反向使用。PIO 模式速度更慢,会加重处理器的负担。建议在进行大量传输时不要使用 PIO 模式。

以下是 SD 标准中描述的不同 DMA 方法:

  • 单操作 DMA (SDMA)
  • 高级 DMA-2 (ADMA2)
  • 高级 DMA-3 (ADMA3)

功能寄存器的标准由支持 DMA 类型的特定控制器提供。

DMA 支持单块和多块传输。块间隙控制寄存器中的控制位用于停止和重启 DMA 操作。SDMA 模式用于短数据传输,因为它会在页面边界产生中断。ADMA2 和 ADMA3 用于长数据传输,并使用分散收集算法。ADMA2 一次支持单个读取/写入 SD 操作,而 ADMA3 一次支持多个读取/写入 SD 操作。

SD 模式命令通过写入以下寄存器生成:

  • 系统地址
  • 块大小
  • 块计数
  • 传输模式
  • 命令

ADMA2

图 3 显示了主机控制器与系统内存之间的 ADMA2 数据传输,并显示了主机驱动程序创建的描述符表。32 位地址描述符表用于 32 位寻址的系统。在描述符表中,每一行都包含地址信息、长度和指定描述符行操作的属性。ADMA2 使用 64 位 ADMA 地址寄存器作为描述符指针。ADMA2 传输由写入命令寄存器触发,ADMA2 处理描述符表中的每一行。

ADMA2 框图
图 3 ADMA2 框图

描述符表由主机驱动程序在系统内存中创建。ADMA2 抓取一行描述符并执行,直到找到描述符的结束符(属性中的 End = 1)。

图 4 显示了 ADMA2 描述符格式。

ADMA2 描述符表
图 4 ADMA2 描述符表

ADMA3

ADMA3 可视为多个 ADMA2 操作。这是通过使用集成描述符结构实现的,该结构由一对命令描述符和 ADMA2 描述符组成。这对描述符用于从系统内存到 SD 卡的多块数据传输。在 ADMA2 中,主机驱动程序使用主机控制寄存器发出 SD 命令,而 ADMA3 则使用命令描述符发出 SD 命令。

MSC 中的不同命令描述符类型均为 SD 命令描述符类型。

显示了 ADMA3 数据传输示例,将三个数据块(数据 A、数据 B 和数据 C)写入 SD 卡的不同区域。

ADMA3 集成描述符对(命令描述符 +ADMA2 描述符)
图 5 ADMA3 集成描述符对(命令描述符 +ADMA2 描述符)

数据从系统内存传输到 SD 存储卡。在处理完集成描述符指向的所有描述符后,ADMA3 会生成传输完成中断,以指示向主机驱动程序传输数据的完成。

图 6 显示了 ADMA3 命令描述符格式,32 位寄存器字段从 000h 至 00Fh 写入主机控制器寄存器。写入 00Fh 时将发出 SD 命令。

主机控制器寄存器包含一个指向命令描述符和 ADMA2 描述符的描述符行的指针。读取每一行描述符后,该指针都会递增。读取命令描述符的最后一行时,指针指向 ADMA2 描述符的顶端,该行位于命令描述符之后。

ADMA3 命令描述符格式
图 6 ADMA3 命令描述符格式

图 7 显示了 ADMA3 集成描述符格式。在集成描述符表中的每一行,32 位地址的指针被设置为 64 位集成描述符中的第 63-32 位,控制器忽略该描述符中属性的 “Int”。

ADMA3 集成描述符格式
图 7 ADMA3 集成描述符格式

有关这些描述符格式的更多信息,请参见 SD 规范 A2 部分 SD 主机控制器标准规范 4.10 版(2012 年 9 月)。

SDIO 读等待

当主机无法接受更多数据时,主机设备会控制 SDCLK(卡时钟),以停止执行多读命令的卡的读数据块输出。在主机停止 SDCLK 的持续时间内,无法发出 CMD52。这一限制造成的问题是,主机设备无法在多路读取周期内执行 I/O 命令。

为了克服这一限制,MSC 支持读取等待功能,向正在执行多路读取(CMD53)操作的卡发出信号,暂时停止数据传输,同时允许主机向卡内的任何其他功能发送命令。对于 SDIO 卡,读取等待功能是可选的。

如果卡支持读取等待功能,那么 MSC 控制器就可以通过在块边界使用 sd_dat_out[2] 线发出读取等待,而不是停止卡时钟,来停止从卡读取数据。MSC 控制器在数据块的 NAC 期间读等待有效。

  • 控制器被配置为在数据块间隙处停止并使能读等待。
  • 如果控制器的数据包缓冲区没有足够的空间容纳下一个数据块,则使能读取等待。

对于 SDIO 卡,读取等待功能是可选的。该功能仅适用于 SD 1 和 4 位模式,不适用于 SPI 传输模式。

SDIO 卡中断

SD 接口支持中断功能,允许 SDIO 卡中断主机。在 SD 模式下,SDIO 卡使用 sd_dat_in[1] 中断输入提供中断 MSC。该中断用于通知主机错误状态和正常信息,如功能就绪。该中断还可作为唤醒事件源,通知主机从待机模式恢复。当卡/设备停止断言中断时,即应用服务中断条件时,卡中断将被清除。

对于 SD 1 位模式,中断没有时序限制。

对于 4 位模式,MSC 仅在中断期采样卡中断,中断期定义如下:

  • 中断期从传输数据块的命令结束位开始结束(SDR50、SDR104 和 DDR50 模式为 1 至 3 个时钟)。
  • 在最后一个数据块传输完成后恢复两个时钟(SDR50、SDR104 和 DDR50 模式为 2 至 4 个时钟)。
  • 在数据块间隙中,数据块结束位后 2 个时钟开始 2-clock 中断周期(根据设备规范建议,在 SDR50、SDR104 和 DDR50 中禁用块间隙卡中断)
  • 虽然规范规定异步中断周期从同步中断开始后 4 个时钟开始,从数据命令结束位开始后 1 至 3 个时钟结束,但 MSC 并没有区分同步和异步中断周期。
  • 在中止 CMD 的情况下,中断周期在中止 CMD 结束位后 2 个时钟结束,并在响应结束位后 2 个时钟恢复。
  • 异步中断在 SD 4 位模式下有效。当卡时钟停止以节省电能时,从设备产生的异步中断将发送给主机系统。

操作流程

本章讨论以下部分:

  • 概述
  • 主机控制器设置序列
  • 时钟控制
  • 卡接口设置序列
  • 超时设置
  • 终止事务
  • SD/SDIO 事务模式
  • eMMC 事务模式
  • 错误恢复

概述

本节介绍在开始与连接的卡进行数据传输之前,MSC 和卡子系统所需的编程步骤。首先,需要对主控制器和卡进行初始化。

以下是开始与卡进行数据传输前所需的编程顺序:

1 按照 “主机控制器设置序列 ”中的说明设置 MSC 控制器的基本设置。为 SD 卡(“SD 接口”)和 eMMC 卡(“eMMC 设备”)提供了不同的设置序列。

2 使能 MSC 中可用的输入时钟。使能内部时钟(aclk、bclk、tmclk 和 cqetmclk),然后是卡时钟(cclk_tx/cclk_rx),如 “主机控制器时钟设置序列 ”中的编程序列所述。在此阶段,MSC 已准备好与卡通信。

3 执行 “卡接口设置 ”中描述的编程顺序,为卡提供时钟。

4 必须根据所连接卡的类型执行表 2 所示的适当序列。

表 2 不同卡的初始化顺序
卡类型卡初始化序列
SDSD 卡的初始化和识别("SD 卡的初始化和识别)
eMMC初始化和识别 eMMC 卡("初始化和识别 eMMC 设备)

5 主机控制器和卡都初始化后,主机就可以开始向卡发送执行数据传输的命令。控制指令和数据命令是可以向卡发送的两种命令。控制命令用于读取或写入卡中的任何寄存器。数据命令用于向存储卡写入或读出数据。表 3 列出了 SD 卡和 eMMC 卡的控制和数据命令序列。

表 3 不同卡的命令序列
卡类型命令序列
SD/eMMCControlCMD 发布无数据传输的 CMD("发布无数据传输的 CMD)
DataCMD 发布带数据传输的 CMD("发布带数据传输的 CMD)

1 可以使用终止命令(“终止命令序列”)终止数据传输。

2 如果在传输过程中检测到错误,应使用 “错误恢复 ”中描述的序列进行恢复。

主机控制器设置顺序

本节讨论 SD 接口和 eMMC 设备的主机控制器设置顺序。

本节讨论以下顺序:

  • SD Interface
  • eMMC Device
  • SD 接口
  • eMMC 设备

SD 接口

图 8 显示主机控制器设置序列。无论总线速度模式如何变化,在此序列中设置的寄存器参数都将保留其值。

标清主机控制器设置序列
图 8 标清主机控制器设置序列

eMMC 设备

图 9 显示了 eMMC 设备的主机控制器设置序列。除了完成图 8 中的编程顺序外,还必须设置参数 EMMC_CRTL_R.CARD_IS_EMMC =1。

eMMC 接口的主机控制器设置序列
图 9 eMMC 接口的主机控制器设置序列

时钟控制

本节讨论设置 MSC 模块时钟、MSC 供电卡时钟的编程顺序。

  • 主机控制器时钟设置序列
  • Card 时钟供应和停止序列

主机控制器时钟设置序列

主机控制器时钟供应序列
图 10 主机控制器时钟供应序列

卡时钟供应和停止序列

卡时钟供应和停止顺序
图 11 卡时钟供应和停止顺序

卡接口设置顺序

本节讨论为 SD 卡和 eMMC 卡设置卡接口的编程顺序。

卡接口设置顺序
图 12 卡接口设置顺序

超时设置

本节讨论 SD、eMMC 数据线的超时设置。

图 13 显示了 SD/eMMC 总线的超时设置。

SD/eMMC 总线超时设置
图 13 SD/eMMC 总线超时设置

中止交易

向卡发出终止命令可终止正在进行的数据事务。要终止 SD/eMMC 卡上的事务,需要发出 CMD12;而要终止 SDIO 卡上的事务,需要发出 CMD52。

以下是必须发出终止命令的情况:

  • 停止无限块传输
  • 因应用程序请求而停止传输
  • 因检测到错误而停止传输

发出终止命令的顺序如 “终止命令顺序 ”所示。在数据传输过程中,可以同步或异步发出中止命令。

在异步终止中,终止命令作为子命令随时发出,与数据传输状态无关。同步终止则确保在发出终止命令前停止数据传输(在数据块间隙)。这两种方法分别在 “异步终止 ”和 “同步终止 ”中说明。

本节讨论以下序列:

  • 终止命令序列
  • 异步终止

中止命令序列

终止命令序列
图 14 终止命令序列

异步终止

异步终止序列
图 15 异步终止序列

同步终止

同步终止序列
图 16 同步终止序列

SD/SDIO 事务模式

本节包括生成和控制不同类型 SD/SDIO 事务的序列,这些事务可分为不使用 DAT 线传输数据的事务和使用 DAT 线传输数据的事务。本节还讨论了 tuning 流程、更改总线宽度和速度模式、设置 DAT 线超时、初始化和识别 SD 卡以及终止序列的顺序。

本节讨论以下编程顺序:

  • SD 卡初始化和识别
  • SD 更改总线宽度
  • SD 模式 tuning 流程序列
  • 在不传输数据的情况下启动 CMD
  • 发布带数据传输的 CMD
  • SD 更改总线速度模式

SD 卡初始化和识别

SD 卡初始化和识别
图 17 SD 卡初始化和识别
SD 卡初始化和识别(续)
图 18 SD 卡初始化和识别(续)

SD 更改总线宽度

图 19 显示更改标清总线位模式的顺序。

更改总线宽度序列
图 19 更改总线宽度序列

SD 模式 tuning 流程序列

图 20 显示如何在标清模式下执行 tuning。

tuning 程序
图 20 tuning 程序

在不传输数据的情况下发出 CMD

图 21 显示了如何发出并完成 SD 命令的顺序。SD 命令可以使用数据线 (DAT)(用于繁忙信令),也可以不使用数据线 (DAT)。

图 21 显示了在这两种情况下发出命令的步骤。

SD 命令发出和完成
图 21 SD 命令发出和完成

通过数据传输发出 CMD

本节包括在不使用 DMA 和使用 SDMA、ADMA 和 ADMA3 模式的情况下发出带数据传输的命令的顺序。

本节讨论以下编程序列:

  • 通过数据传输发出 CMD(不使用 DMA/PIO)
  • 通过数据传输发出 CMD(使用 SDMA)
  • 通过数据传输发出 CMD(使用 ADMA2)
  • 通过数据传输发出 CMD(使用 ADMA3)

通过数据传输发出 CMD(不使用 DMA/PIO)

不使用 DMA 进行数据传输的事务
图 22 不使用 DMA 进行数据传输的事务
使用 DAT 线路传输数据的事务控制(不使用 DMA)
图 23 使用 DAT 线路传输数据的事务控制(不使用 DMA)

通过数据传输发出 CMD(使用 SDMA)

使用 SDMA 进行数据传输的事务
图 24 使用 SDMA 进行数据传输的事务

通过数据传输发出 CMD(使用 ADMA2)

图 25 显示了使用 ADMA2 通过 DAT 线进行数据传输的事务。

使用 DAT 线路进行数据传输的事务控制(使用 ADMA2)
图 25 使用 DAT 线路进行数据传输的事务控制(使用 ADMA2)
使用 DAT 线路传输数据的事务控制(使用 ADMA)(续)
图 26 使用 DAT 线路传输数据的事务控制(使用 ADMA)(续)

通过数据传输发出 CMD(使用 ADMA3)

图 27 显示了使用 ADMA3 通过 DAT 线路进行数据传输的事务。

使用 DAT 线路进行数据传输的事务控制(使用 ADMA3)
图 27 使用 DAT 线路进行数据传输的事务控制(使用 ADMA3)

SD 更改总线速度模式

SD 改变总线速度模式
图 28 SD 改变总线速度模式

eMMC 事务模式

本节讨论了为 eMMC 接口设置主控制器、初始化和识别卡、使用或不使用 DAT 线发出有/无数据传输命令、切换到各种速度模式和更改数据总线宽度的编程顺序。本节还将讨论如何编程、启动和终止不同的启动速度模式。

本节讨论以下编程顺序:

  • 初始化和识别 eMMC 设备
  • 为 eMMC 设备发出不带数据传输的 CMD
  • 为 eMMC 设备发出带数据传输的 CMD
  • 在 eMMC 设备中切换到各种速度模式
  • 更改 eMMC 设备的数据总线宽度
  • eMMC 设备的 tuning 顺序
  • 命令队列

初始化和识别 eMMC 设备

图 29 显示了初始化和识别 eMMC 设备的编程顺序。

卡初始化和识别编程顺序
图 29 卡初始化和识别编程顺序

为 eMMC 设备发出不带数据传输的 CMD 命令

为 eMMC 设备发出不带数据传输的命令的编程顺序与 “发出不带数据传输的 CMD ”中提到的顺序类似。

为 eMMC 设备发出带数据传输的 CMD

为 eMMC 设备发出带数据传输的命令的编程顺序与 “发出带数据传输的 CMD ”中提到的编程顺序类似。数据传输可在使用或不使用 DMA 的情况下进行。支持的 DMA 模式有 SDMA、ADMA2 和 ADMA3。

在 eMMC 设备中切换到各种速度模式

图 30 显示了在 eMMC 设备中切换到各种速度模式的编程顺序。在图 29 中,请注意 CMD6 仅在传输状态下有效。

在 eMMC 设备中切换到各种速度模式的编程顺序
图 30 在 eMMC 设备中切换到各种速度模式的编程顺序

更改 eMMC 设备的数据总线宽度

图 31 显示了更改 eMMC 设备数据总线宽度的编程顺序。在图 30 中,请注意 CMD6 仅在传输状态下有效。

更改 eMMC 设备数据总线宽度的编程顺序
图 31 更改 eMMC 设备数据总线宽度的编程顺序

eMMC 设备的 tuning 顺序

eMMC 设备的 tuning 顺序与图 32 所示的编程顺序类似,但对于 eMMC 设备,tuning 时发送的是 CMD21,而不是图 32 所述的 CMD19。

命令队列

命令队列引擎初始化

图 32 显示了初始化命令队列引擎的编程顺序。

命令队列引擎初始化
图 32 命令队列引擎初始化

在命令队列引擎中提交和完成任务

图 33 显示了在命令队列引擎中提交和完成任务的顺序。

提交和完成任务
图 33 提交和完成任务

错误恢复

本节包括在 SD、eMMC 和 SD-TRAN 模式下的错误恢复顺序。本节讨论以下编程顺序:

  • SD/eMMC 模式

SD/eMMC 模式

SD/eMMC 模式下的错误恢复
图 34 SD/eMMC 模式下的错误恢复

注:

  • 错误恢复序列返回 “可恢复错误 ”或 “不可恢复错误 ”状态。当返回 “可恢复错误 ”时,错误已完全恢复。如果返回 “不可恢复错误 ”状态,则必须在对卡执行电源循环后重新初始化控制器和卡。
  • 当使能 DMA 时,建议同步发出步骤 10 中的终止命令(如图 34 所示)