锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

14_TF编程

时间:2023-06-08 15:07:00 4021集成电路x9315wp集成电路451集成电路

第十四章 TF卡编程

14.1 背景知识

多媒体存储卡(英语:Multimedia Card),又译MMC快闪记忆卡是一种标准。西门子和闪迪于1997年联合开发,技术基于东芝NAND因此,基于快闪记忆技术的早期阶段Intel NOR快闪记忆技术的存储卡(如CF卡)更小。MMC卡的大小和一张邮票差不多,大24张mm x 32mm x 1.5mm。MMC卡原本使用1bit串联接口,但更新的标准允许同时发送4 bit或8 bits的数据。近年MMC卡技术几乎完全被卡住了SD但是因为MMC卡片仍然可以兼容SD读取卡的设备仍然有其作用。所有愿意改进或开发产品的公司都可以使用该技术的公开标准。

Secure Digital,缩写为SD,全名为Secure Digital Memory Card,中文翻译成安全数字卡,是一种便携式设备,如数字相机、个人数字助理、多媒体播放器等。SD卡是东芝在MMC由于加密技术硬件被添加到卡技术中,MMC用户复制数字音乐可能很容易,东芝加入了这些技术,希望让音乐行业放心。SD基于卡的技术MultiMedia卡格式上。SD数据发送速度高,标准不断更新。大部分SD卡的侧面设有写作保护控制,以避免意外写入一些数据,少数SD卡甚至支持数字版权管理技术。SD卡的大小为32mm×24mm×2.1mm,但官方标准也记载了薄版1.4mm厚度,与MMC卡相同。

Micro SD卡原本称为TF卡(T-Flash卡或TransFlash),由摩托罗拉和闪迪联合开发,于2004年推出。然而,闪迪不能自己推广它。在早期阶段,只有摩托罗拉的手机支持TransFlash。为了完全拓展市场,闪迪将TransFlash规格并入SD协会,成为SD家族产品之一创造了目前使用最广泛的手机存储卡;重命名为microSD因为被子SD协会(SDA)采纳。TransFlash纳入SD协会结束后,只缩短实体规格的电接触端(印刷电路板的金属端子,俗称金手指),其他部分完全兼容。另一些被SD协会采用的存储卡包括miniSD和SD卡。这种存储卡主要用于移动电话,但由于体积小,容量不断提高,它慢慢开始GPS设备、便携式音乐播放器和一些闪存盘。microSD的体积为 15 毫米 x 11 毫米 x 1 毫米 - 约为SD卡的1/4相当于指甲盖的大小,也可以用转接器连接SD卡或Memory Stick使用插槽。

eMMC (Embedded Multi Media Card)是MMC协会订立、主要针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC控制器集成在包装中,提供标准接口,管理闪存,使手机制造商能够专注于产品开发的其他部分,缩短向市场推出产品的时间。架构标准将是MMC将组件(闪存加控制器)放入小球栅数组包装中(BGA)嵌入式非易失性存储系统主要用于印刷电路板。eMMC与MMC其他版本明显不同,因为eMMC不是用户可以随意移动的卡,而是永久电路板附件。

SD插入的目的不仅仅是插入存储卡。还支持很多SDIO接口外设,像GPS接收器,Wi-Fi或蓝牙适配器、调制解调器、局域网适配器、条码读取器、FM无线电、电视接收器、射频识别读取器、数字相机等SD标准接口的设备。SDIO和SD卡规范之间的一个重要区别是增加了低速标准。SDIO卡只需要SPI和1位SD传输模式。低速卡的目标应用是以最小的硬件支持低速卡I/ O能力。低速卡支持类似的调制解调器、条码扫描仪和GPS接收器等应用。对于组合卡(存储器 SDIO)对于卡内存储器和全速和4位操作SDIO部分是强制性的。

14.2 介绍一般概念和协议

参考协议文件:

JEDEC的JESD84-B451 或者 JESD84-B51,可以在JEDEC在网站上注册用户下载。

SD Card Association 三份文件:

Physical_Layer_Simplified_Specification_Ver6.00,

SD Host_Controller_Simplified_Specification_Ver3.00,

SDIO可以参考SDIO_Simplified_Specification_Ver3.00。

这些文档可以直接使用SD Card Association在网站上下载。

参考资料:芯片手册《Chapter 58 : Ultra Secured Digital Host Controller (uSDHC)》。

14.2.1 系统特性

14.2.1.1 SD系统特性

  • 便携式和固定式应用
  • 卡的容量

(1)SDSC,Standard Capacity SD Memory Card,最大到2GB

(2)SDHC,High Capacity SD Memory Card,2GB到32GB

(3)SDXC, Extended Capacity SD Memory Card ,32GB到2TB

  • 电压范围

(1)高电压SD卡,电压范围2.7-3.6V

(2)UHS-II存储卡,电压范围VDD1:2.7-3.6V,VDD2:1.70V-1.95V

14.2.1.2 eMMC系统特性

eMMC该设备定义了一种非直接存储访问机制。通过一个特殊的控制器实现存储访问。非直接存储访问的优点是可以在设备中执行几个存储管理任务,而无需主机软件的支持。这可以简化主机的闪存管理。eMMC支持特征。

  • 系统电压范围

image-20220112141205032

  • eMMC4.5总线由十条线组成(时钟线,1bit命令线,8bit数据线)和硬件复位线。eMMC5.还有一条数据选择线。

(1)时钟频率范围0~200MHz

(2)三种数据总线宽度模式:1bit(默认),4bit,8bit

14.2.2 总线模式

14.2.2.1 SD卡总线速度模式

Bus speed mode for UHS-I Card

Default Speed Mode 3.3V signaling, Frequency up to 25MHz, up to 12.5MB/sec

High Speed Mode 3.3V signaling, Frequency up to 50MHz, up to 25MB/sec

SDR12 UHS-I 1.8V signaling, Frequency up to 25MHz, up to 12.5MB/sec

SDR25 UHS-I 1.8V signaling, Frequency up to 50MHz, up to 25MB/sec

SDR50 UHS-I 1.8V signaling, Frequency up to 100MHz, up to 50MB/sec

SDR104 UHS-I 1.8V signaling, Frequency up to 208MHz, up to 104MB/sec

DDR50 UHS-I 1.8V signaling, Frequency up to 50MHz, up to 50MB/sec

UHS156 UHS-II RCLK Frequency Range 26MHz~52MHz, up to 1.56Gbps per lane

UHS624 UHS-II RCLK Frequency Range 26MHz~52MHz, up to 6.24Gbps per lane

开发板SD卡槽的电压为3.3v,所以SD卡的模式只能设置为default speed或者High speed模式。

14.2.2.2 eMMC总线速度模式

开发板eMMC的电压为3.3v,所以只能设置成default speed或者high speed模式。

14.2.3 SD卡和eMMC寄存器

14.2.3.1 sd卡的构成

​ 上图显示了标准SD卡的形状和内部的构成。通过VDD、两个GND、CLK、CMD和DAT0~DAT3总共9个外部引脚供获取电源和与主机进行通信。内部由卡接口控制器、寄存器、上电检测模块、存储介质接口和存储介质等构成。卡接口控制器主要对内部的存储核心进行控制和管理,通过接收用户对其发送的命令来进行控制和设置,并根据命令做出响应,执行数据读写等操作。寄存器提供卡的状态信息和反映卡的运行状态。存储介质主要由具有存储功能的flash块组成。

14.2.3.2 sd卡的寄存器

名称 宽度 描述 实现
CID 128 Card identification number,设备识别代码 强制
RCA 16 Relative Card Address,相对设备地址 强制
DSR 16 Driver Stage Register, 可选
CSD 128 Card Specific Data,设备特定数据 强制
SCR 64 SD Configuration Register,SD配置寄存器 强制
OCR 32 Operation Condition Register,运行条件寄存器 强制
SSR 512 SD status,SD状态 强制
CSR 32 Card status,Card状态 强制

14.2.3.3 MMC的构成

​ 从上图可以看出,eMMC是把Nand flash存储阵列和Device Controller模块封装在一起。Device Controller负责flash阵列的管理,提供标准接口与主机进行通信。这样主机软件不用处理繁杂的Nand Flash的兼容性和坏块管理问题,简化软件设计,加快产品上市时间。

14.2.3.4 eMMC的寄存器

名称 宽度(字节) 描述 实现
CID 16 Device Identification number,设备识别代码 强制
RCA 2 Relative Device Address,相对设备地址,在初始化过程中由主机动态分配 强制
DSR 2 Driver Stage Register,用来配置设备的驱动能力 可选
CSD 16 Device Specific Data,设备特定数据,包含设备的操作条件 强制
OCR 4 Operations Conditions Register,运行条件寄存器,特定的广播命令来识别设备的电压类型 强制
EXT_CSD 512 Extended Device Specific Data,扩展的设备特定数据,包含设备的能力和选择的模式,v4.0开始存在 强制

14.2.4 命令(COMMAND)和响应(RESPONSE)

14.2.4.1 命令类型

​ 上图是命令的格式,每个命令令牌都以一个开始位(“ 0”)开头,并以一个结束位(“ 1”)结束。总长度为48个位。每个令牌均受CRC位保护,因此可以检测到传输错误,检测到错误后可以重发命令。

SD和eMMC都是4种类型:

  • bc Broadcast commands,没有响应
  • bcr Broadcast commands,有响应
  • ac addressed(point-to-point)commands,点对点命令,DATA线上没有数据传输
  • adtc addressed(point-to-point)data transfer commands,DATA线上有数据传输

​ 上图中前一个命令CMD线上只传输了command;后一个命令CMD线上主机给卡发送command后,卡给主机回应了一个response;这两个命令都是只用到了CMD线,没有用到DAT线。如果命令参数里没有指定RCA,那么前一个命令就是就是bc类型,后一个命令就是bcr类型。如果后一个命令的参数里指定了RCA,那么就是ac类型。

​ 上图显示了多块读操作,属于adtc类型,这种类型既要在命令参数里指定RCA,CMD线上传输的command后会有response,并且会使用DAT线传输数据。对于读操作,数据由卡发往主机。

​ 上图显示了多块写操作,与读操作类似,属于adtc类型,不过数据由主机发往卡。

14.2.4.2 响应类型

响应通过CMD线发送。

对于SD卡和eMMC卡都有:

  • R1 normal response command 长度48bit
  • R1b 等同于R1,一个可选的在DATA0线上传送忙信号。
  • R2(CID,CSD register)长度136bit,CID寄存器的内容作为CMD2和CMD10的响应,CSD寄存器的内容作为CMD的响应。
  • R3(OCR register)长度48bit,OCR寄存器的内容作为CMD1的响应。

上图显示了SD卡的响应格式,对于SD卡还有:

  • R6 published RCA response 长度48bit
  • R7 Card interface condition长度48bit

上图显示了eMMC卡的响应的格式,对于eMMC卡还有:

  • R4(fast IO)长度48bit
  • R5(Interrupt request)长度48bit

14.3 IMX6ULL的uSDHC控制器

14.3.1 uSDHC控制器特性介绍:

  • 兼容SD Host Controller Standard Specification version 3.0
  • 兼容MMC System Specification version 4.2/4.3/4.4/4.41/4.5
  • 兼容SD Memory Card Specification version 3.0,支持Extended Capacity SD Memory Card
  • 兼容SDIO Card Specification version 3.0
  • 设计成支持SD Memory, miniSD Memory, SDIO, miniSDIO, SD Combo, MMC, MMC plus, and MMC RS cards
  • 卡的时钟频率最高到208MHz
  • 支持1-bit/4-bit SD和SDIO模式,1-bti/4-bit SD/8-bit MMC模式

​ (1)4线SDR(Single Data Rate)模式SDIO卡数据传输速率最高到832Mbps

​ (2)4线DDR(Dual Data Rate)模式SDIO卡数据传输速率最高到400Mbps

​ (3)4线SDR(Single Data Rate)模式SDXC卡数据传输速率最高到832Mbps

​ (4)4线DDR(Dual Data Rate)模式SDXC卡数据传输速率最高到400Mbps

​ (5)8线SDR(Single Data Rate)模式MMC卡数据传输速率最高到416Mbps

​ (6)8线DDR(Dual Data Rate)模式MMC卡数据传输速率最高到832Mbps

  • 支持单块和多块读写
  • 支持的块大小Wie 1~4096字节
  • 对于写操作支持写保护
  • 支持同步和异步终止操作
  • 支持数据块间传输间隙暂停操作
  • 支持SDIO读等待,暂停(suspend)和恢复(resume)操作
  • 对于多块读写支持自动CMD12
  • 主机可以在数据传输的同时初始化没有数据传输的命令
  • 1-bit和4-bit SDIO模式下允许卡中断主机,同时支持中断周期
  • 嵌入可自动配置的128x32-bit FIFO,用来读写数据
  • 支持内部和外部DMA
  • 支持通过配置vendor专用寄存器用于电压选择
  • 支持ADMA进行链式内存操作

14.3.2 数据传输模式

uSDHC可以选择如下模式进行数据传输:

  • SD 1-bit
  • SD 4-bit
  • MMC 1-bit
  • MMC 4-bit
  • MMC 8-bit
  • 识别模式(最高到400 kHZ)
  • MMC全速模式(最高到26MHz)
  • MMC高速模式(最高到52MHz)
  • MMC HS200模式(最高到200MHz)
  • MMC DDR模式(52M)
  • SD/SDIO全速模式(最高到25MHz)
  • SD/SDIO高速模式(最高到50MHz)
  • SD/SDIO UHS-I模式(SDR模式最高到208M,DDR模式最高到50M)

14.3.3 引脚概述

上图是100sdk_imx6ull开发板的SD卡原理图,使用了uSDHC1控制器。

上图是100sdk_imx6ull开发板eMMC的原理图,接在uSDHC2控制器上。

uSDHC有14个I/O管脚,分别是

  • CLK是由内部产生的时钟用来驱动MMC,SD和SDIO卡
  • CMD I/O用来发送命令给卡或者从卡接受响应
  • 8条数据线用来在uSDHC和卡之间传输数据
  • CD和WP用来卡检测和写保护,这两个信号直接来自卡槽。这两个信号都是低有效,CD#脚低表明有卡插入,WP高表明写保护打开
  • LCTL是输出信号,用来驱动外部LED表明控制器正忙
  • RST是输出信号,用来复位MMC卡
  • VSELECT用来改变外部电源提供者的电压
  • CD, WP, LCTL, RST 和VSELECT是可选的。如果uSDHC只需要4bit传输,DATA7~DATA4也是可选的并且拉高

14.3.4 时钟

Clock name Clock Root Description
hclk ahb_clk_root AHB bus clock
ipg_clk ipg_clk_root Peripheral clock
ipg_clk_perclk usdhc_clk_root Base clock
ipg_clk_s ipg_clk_root Peripheral access clock for register accesses

​ 上表是uSDHC的时钟源,hclk提供了AHB总线的时钟,ipg_clk提供了Peripheral的时钟,ipg_clk_perclk提供了uSDHC控制器的时钟,ipg_clk_s提供了访问控制器寄存器的时钟,这些时钟如何配置呢?需要根据时钟树进行配置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PovzPo08-1642060343781)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142122012.png)]

​ 上图是时钟树的片段,来自于imx6ull reference manual的chapter18 Clock Controller Module章节的18.3 CCM Clock Tree。可以看出CCM_CSCMR1[USDHCn_CLK_SEL]选择时钟源,CSCDRn[USDHC1_PODF]来控制分频,最终产生USDHCn_CLK_ROOT时钟。寄存器说明如下:

CCM_CSCMR1寄存器片段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s24dixGd-1642060343781)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142130658.png)]

CSCDR1[USDHC1_PODF]

​ 从上图可以看出,USDHC1和USDHC2的时钟可以来自PLL2PFD0或者PLL2PFD2,由CCM_CSCMR1来控制,然后由CSCDR1[USDHCn_PODF]来控制分频(1,2,…,8)。默认设置使用PLL2PFD0,PLL2PFD0设置为396M,如果USDHCn_PODF都设置为1的话,即对PLL2PFD2进行二分频,这样USDHC1_CLK_ROOT和USDHC1_CLK_ROOT都为198M。

​ Card_clk是由peripheral source clock分成两个阶段产生的,其实就是两个通过两个分频器产生的。

​ 第一个分频是由uSDHCx_SYS_CTRL[DVS]控制产生DIV,它的值可以等于Base,ase/2, Base/3, …, 或者 Base/16。

​ 第二个分频是由uSDHCx_SYS_CTRL[SDCLKFS]控制产生内部工作时钟card_clk。

​ 在SDR模式和DDR模式时,CLK是不同的:SDR模式时,CLK等于内部工作时钟card_clk;DDR模式时,CLK等于card_clk/2。

​ Base是来自USDHCx_CLK_ROOT,如果USDHCx_CLK_ROOT为198M的话,就要由uSDHCx_SYS_CTRL[DVS]和uSDHCx_SYS_CTRL[SDCLKFS]分频产生400K,25M,26M,50M,52M等时钟。

14.3.5 ADMA引擎

​ SD主机控制器标准里定义了一种新的DMA传输算法,该算法被称为ADMA(Advanced DMA)。竟然是advanced,是不是之前还有个算法呢?的确是有的,称为SDMA(Simple DMA)。

​ 对于SDMA,当页边界(page boundary)到达时,会产生DMA中断,然后新的地址需要再次写入到DMA System Address (uSDHCx_DS_ADDR)寄存器。由于每个页边界都会产生中断,SDMA算法会导致性能瓶颈。比如对于一个主机控制器,页边界是512KB,那就意味着每次中断里最多传输512KB的数据,并且一次传输的数据不能跨越512KB的边界,然后需要重新对DMA System addreass进行编程。

​ 为了能达到更高的传输速度,ADMA采用了分散聚集DMA算法(scatter gather algorithm)。在ADMA传输前,主机驱动可以事先在系统内存里准备好一个描述符表(descriptor table),然后将描述符表的地址写入ADMA System Address (uSDHCx_ADMA_SYS_ADDR)寄存器。主机会根据描述符表里的内容进行传输,这减少了DMA的中断频率,在描述符表里指向的内容传输完成前就不用打断CPU,自然地提高了传输的速度。

​ ADMA也有两种,一个是ADMA1,另一个是ADMA2。ADMA1需要内存里传输数据的地址4KB对齐。ADMA2改进了这个限制,传输的数据可以在内存里任何位置,传输的大小也可以设置。主机控制标准第三个版本里对ADMA1已经不支持了,后面说到ADMA都是指ADMA2。

(图来源于PartA2_SD Host_Controller_Simplified_Specification_Ver3.00 page14)

上图是ADMA2的框图,主机驱动在系统内存里创建描述符表。每个描述符行(也就是一个执行单元)包括三个域地址(address),长度(length)和属性(attribute)。属性指定了每个描述符行对应的操作。ADMA2不使用ADMA System Address寄存器,而是使用ADMA System Address寄存器指向描述符表。然后ADMA2会从描述表里逐行提取描述符行,依次执行。

上图是一个ADMA2编程的示例。主机驱动里描述符表每行都表示一段内存里连续的空间,分别是内存里这段区间的起始地址,长度和属性。ADMA2会逐行解析描述符,依次传输每段连续内存空间。

对描述符的编程有3个要求:

(1)最小的地址单元是4字节;

(2)每个描述符行描述的地址长度低于64KB;

(3)总长度(Length1+length2+…+lengthn)等于块大小的倍数。

Block count寄存器限制最大传输65535个块,如果ADMA2操作不大于65535个块,block count可以使用。总长度大小需要等于块大小(block size)与块数目(block count)的乘积。

描述符表

上图是32-bit地址描述符表,一个描述符行需要64字节空间。属性值用来控制传输,Nop表明直接跳过这行描述符,取下一个描述符。Rsv操作与NOP相同。Tran操作表明传输以这行描述里32-bit地址为起始地址,长度为16-bit length指定的内存空间。Link用来指定另一个描述符表,可见描述之间也可以向链表那样串起来。属性里的int为1的话表示操作完该描述行后产生DMA中断。End表明描述符结束了,这是最后一个要传输的描述符。Valid为1表明改行描述符是有效的,为0的话产生ADMA error,并且停止ADMA传输。

14.3.6 寄存器介绍

SD Host_Controller_Simplified_Specification_Ver3.00里的标准的SD主机控制器寄存器:

[外链图片转存中…(img-LT4TaGgc-1642060343785)]

下表示IMX6ULL的寄存器表格:

Absolute address (hex) Register name Width (in bits) Access Reset value Section/ page
219_0000 DMA System Address (uSDHC1_DS_ADDR) 32 R/W 0000_0000h 58.8.1/4014
219_0004 Block Attributes (uSDHC1_BLK_ATT) 32 R/W 0000_0000h 58.8.2/4015
219_0008 Command Argument (uSDHC1_CMD_ARG) 32 R/W 0000_0000h 58.8.3/4017
219_000C Command Transfer Type (uSDHC1_CMD_XFR_TYP) 32 R/W 0000_0000h 58.8.4/4017
219_0010 Command Response0 (uSDHC1_CMD_RSP0) 32 R 0000_0000h 58.8.5/4021
219_0014 Command Response1 (uSDHC1_CMD_RSP1) 32 R 0000_0000h 58.8.6/4021
219_0018 Command Response2 (uSDHC1_CMD_RSP2) 32 R 0000_0000h 58.8.7/4022
219_001C Command Response3 (uSDHC1_CMD_RSP3) 32 R 0000_0000h 58.8.8/4022
219_0020 Data Buffer Access Port (uSDHC1_DATA_BUFF_ACC_PORT) 32 R/W 0000_0000h 58.8.9/4024
219_0024 Present State (uSDHC1_PRES_STATE) 32 R 0000_8080h 58.8.10/ 4024
219_0028 Protocol Control (uSDHC1_PROT_CTRL) 32 R/W 0880_0020h 58.8.11/ 4030
219_002C System Control (uSDHC1_SYS_CTRL) 32 R/W 8080_800Fh 58.8.12/ 4035
219_0030 Interrupt Status (uSDHC1_INT_STATUS) 32 w1c 0000_0000h 58.8.13/ 4038
219_0034 Interrupt Status Enable (uSDHC1_INT_STATUS_EN) 32 R/W 0000_0000h 58.8.14/ 4044
219_0038 Interrupt Signal Enable (uSDHC1_INT_SIGNAL_EN) 32 R/W 0000_0000h 58.8.15/ 4047
219_003C Auto CMD12 Error Status (uSDHC1_AUTOCMD12_ERR_STATUS) 32 R 0000_0000h 58.8.16/ 4050
219_0040 Host Controller Capabilities (uSDHC1_HOST_CTRL_CAP) 32 R 07F3_B407h 58.8.17/ 4053
219_0044 Watermark Level (uSDHC1_WTMK_LVL) 32 R/W 0810_0810h 58.8.18/ 4056
219_0048 Mixer Control (uSDHC1_MIX_CTRL) 32 R/W 8000_0000h 58.8.19/ 4057
219_0050 Force Event (uSDHC1_FORCE_EVENT) 32 W (always reads 0) 0000_0000h 58.8.20/ 4059
219_0054 ADMA Error Status Register (uSDHC1_ADMA_ERR_STATUS) 32 R 0000_0000h 58.8.21/ 4062
219_0058 ADMA System Address (uSDHC1_ADMA_SYS_ADDR) 32 R/W 0000_0000h 58.8.22/ 4064
219_0060 DLL (Delay Line) Control (uSDHC1_DLL_CTRL) 32 R/W 0000_0200h 58.8.23/ 4065
219_0064 DLL Status (uSDHC1_DLL_STATUS) 32 R 0000_0000h 58.8.24/ 4067
219_0068 CLK Tuning Control and Status (uSDHC1_CLK_TUNE_CTRL_STATUS) 32 R/W 0000_0000h 58.8.25/ 4068
219_00C0 Vendor Specific Register (uSDHC1_VEND_SPEC) 32 R/W 2000_7809h 58.8.26/ 4070
219_00C4 MMC Boot Register (uSDHC1_MMC_BOOT) 32 R/W 0000_0000h 58.8.27/ 4073
219_00C8 Vendor Specific 2 Register (uSDHC1_VEND_SPEC2) 32 R/W 0000_0006h 58.8.28/ 4074
219_00CC Tuning Control Register (uSDHC1_TUNING_CTRL) 32 R/W 0021_2800h 58.8.29/ 4076

将两个表格进行对比发现有很多寄存器是类似,甚至寄存器里的很多bit位都是类似的,但是uSDHC与标准SD主机控制器寄存器也有一些差异。

14.3.6.1 DMA System Address (uSDHCx_DS_ADDR)

SDMA传输时的物理内存的地址,用ADMA2时不是设置这个寄存器。

14.3.6.2 Block Attributes (uSDHCx_BLK_ATT)

用来设置块的数目和大小。

BLKCNT当前传输的块数目。

BLKSIZE传输的块的大小。

14.3.6.3 Command Argument (uSDHCx_CMD_ARG)

SD/MMC命令的参数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK5urcQJ-1642060343786)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142404487.png)]

14.3.6.4 Command Transfer Type (uSDHCx_CMD_XFR_TYP)

用来控制数据传输的操作。

Multi/Single Block Select Block Count Enable Block Count Function
0 Don’t Care Don’t Care Single Transfer
1 0 Don’t Care Infinite Transfer
1 1 Positive Number Multiple Transfer
1 1 Zero No Data Transfer
Response Type Index Check Enable CRC Check Enable Name of Response Type
00 0 0 No Response
01 0 1 R2
10 0 0 R3,R4
10 1 1 R1,R5,R6
11 1 1 R1b,R5b

CMDINDEX command index命令的编号

CMDTYPE command type命令类型,大部分都是设置为0,normal command

DPSEL Data Present Select是否包含数据,为1表示会用到数据线,有两种情况,分别为

CICEN command index check enable为1表示检查response里的index

CCCEN command crc check enable 检查response里的CRC

RSPTYP response type response的类型00表示不需要响应,01表示响应长度是136,10表示长度是48,11表示长度是48并且需要检测忙信号

14.3.6.5 Command Response0 (uSDHCx_CMD_RSP0)

14.3.6.6 Command Response1 (uSDHCx_CMD_RSP1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHlOaTRn-1642060343787)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142451825.png)]

14.3.6.7 Command Response2 (uSDHCx_CMD_RSP2)

14.3.6.8 Command Response3 (uSDHCx_CMD_RSP3)

以上四个寄存器分别是从卡发送命令后得到的响应

Response Type Meaning of Response Response Field Response Register
R1,R1b (normal response) Card Status R[39:8] CMDRSP0
R1b (Auto CMD12 response) Card Status for Auto CMD12 R[39:8] CMDRSP3
R2 (CID, CSD register) CID/CSD register [127:8] R[127:8] {CMDRSP3[23:0], CMDRSP2, CMDRSP1, CMDRSP0}
R3 (OCR register) OCR register for memory R[39:8] CMDRSP0
R4 (OCR register) OCR register for I/O etc. R[39:8] CMDRSP0
R5, R5b SDIO response R[39:8] CMDRSP0
R6 (Publish RCA) New Published RCA[31:16] and card status[15:0] R[39:9] CMDRSP0

上图是响应类型与response寄存器的对应关系(来自reference manual P4022)

14.3.6.9 Data Buffer Access Port(uSDHCx_DATA_BUFF_ACC_PORT)

使用外部DMA时会用到,使用ADMA2时,该寄存器一直是0,不用管。

14.3.6.10 Present State (uSDHCx_PRES_STATE)

只读寄存器,

​ DLSL[7:0] data line signal level DATA引脚电平状态,可以用来调试以及检测DATA引脚从错误中恢复的情况。可以检测DATA0引脚电平来反映是否正忙。

​ CLSL CMD line Signal Level CMD引脚的电平状态,可以用来调试以及检测CMD引脚从错误中恢复的情况。

​ WPSPL Write Protect Swith Pin Level 写保护开关引脚电平。反映卡槽WP引脚的状态

​ CDPL Card Detect Pin Level 这个位反映卡槽CD_B引脚的状态,不过与CD_B脚的状态相反,uSDHC不对去抖。

​ CINST Card Inserted 卡插入状态。反映卡是否插入,uSDHC会对该信号去抖动。

​ TSCD Tape Select Change Done。反映延时设置,和tuning有关。

​ RTR Re-Tuning Request 采样时钟是否需要重新tuning,只有SD3.0 SDR104模式会用到。

​ BREN Buffer READ ENABLE 读缓冲区使能,非DMA传输时才会用到。

​ BWEN Buffer Write ENABLE 写缓冲区使能,非DMA传输时才会用到。

​ RTA READ Transfer active 正在进行读操作

​ WTA Write Transfer Active 正在进行写操作

​ SDOFF SDCLOCK Gated Off Internally SD时钟是否关闭

​ PEROFF IPG_PERCLK Gated Off Internally IPG_PERCLK时钟是否关闭

​ HCKOFF HCLK Gated Off Internally HCLK时钟是否关闭

​ IPGOFF IPG_CLK Gated Off Internally IPG_CLK时钟是否关闭

​ SDSTB SD时钟是否稳定,在修改时钟时,需要等待时钟稳定。

​ DLA Data Line Active Data线是否在使用。

​ CDIHB Command Inhabit(Data)当data线正在使用或者读传输正在进行,该位置位。

​ CIHB Command Inhabit 当为0时,表明CMD线不在使用,uSDHC可以发送SD/MMC命令。

14.3.6.11 Protocol Control (uSDHCx_PROT_CTRL)

NON_EXACT_BK_READ 当前块是否是需要读的块,只要SDIO用到。

BURST_ELN_EN

WECRM Wakeup Event Enable On SD Card Removal 移除卡时知否产生唤醒事件

WECINS Wakeup Event Enable On SD Card Insert 插入卡时是否产生唤醒事件

WECINT Wakeup Event Enable On Card Interrupt 不使能时,时钟使能的情况下才能产生卡中断

RD_DONE_NO_8CLK 使用快间隙停止传输时才需要关心这个位

IABG interrupt At Block GAP 仅SDIO 4bit模式使用到,多块传输时是否需要检测中断。

RWCLT READ wait control 读等待控制,仅SDIO模式使用到。

CREQ continue request 继续传输,恢复使用块间隙停止传输的传输

DMASEL DMA select 选择DMA的模式00 不使用DMA或者使用SDMA,01 ADMA1, 10 ADMA2

CDSS Card Detect Signal Selection 选择卡检测信号的来源

CDTL Card Detect Test Level 卡检测测试电平

EMODE Endian Mode 大小端模式选择,一般选择小端

D3CD Data3 as Card Detection Pin data3引脚作为插拔卡检测

DTW Data Transfer Width 数据传输的宽度

LCTL LED控制

14.3.6.12 System Control (uSDHCx_SYS_CTRL)

RSTT Reset Tuning 复位tuning 电路

INITA Initialization Active 置位时,发送80个SDCLK

RSTD Software Reset for DATA Line数据线软复位,数据模块和DMA模块复位。SW等待自清除。

RSTC Software Reset for CMD line 命令电路模块复位,软件等待自清除。

RSTA Software Reset for ALL 复位整个控制器模块,除了卡检测模块

IPP_RST_N 如果卡支持这个特性的话,硬件复位时直接发给卡的引脚

DTOCV Data Timeout Counter Value 数据超时计数器

SDCLKFS SDCLK Frequency Select SDCLK第二阶段分频选择

DVS divisorSDCLK第一阶段分频

14.3.6.13 Interrupt Status (uSDHCx_INT_STATUS)

​ 当Normal Interrupt Signal Enable使能相应的位才能产生相应的中断。所有的位都是写1清除,写0保持不变。一次可以清除多个位。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30SZjICH-1642060343788)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142650887.png)]

Command Complete Command Timeout Error Meaning of the Status
0 0 X
X 1 Response not received within 64 SDCLK cycles
1 0 Response received
Transfer Complete Data Timeout Error Meaning of the Status
0 0 X
0 1 Timeout occurred during transfer
1 X Data Transfer Complete
Command Complete Command Timeout Error Meaning of the Status
0 0 No error
0 1 Response Timeout Error
1 0 Response CRC Error
1 1 CMD line conflict

DMAE DMAError DMA 错误

TNE TuningERROR tuning错误

AC12E Auto CMD12 ERROR Auto CMD12错误

DEBE Data End Bit ERROR 数据结束位错误

DCE Data CRC ERROR 数据CRC错误

DTOE data timeout ERROR 数据超时错误

CIE Command Index Error 命令序号错误

CEBE Command End Bit ERROR 命令结束位错误

CCE Command CRC error 命令crc校验错误

CTOE Command timeout error 命令超时错误

TP tuning pass tuning通过(只有SD3.0 SDR104模式使用)

RTE Re-Tuning Event 重新Tuning事件(只有SD3.0 SDR104模式使用)

CINT card interrupt 卡中断

CRM card remove卡移除

CINS card insert 卡插入

BRR Buffer Read Ready 读缓冲准备好

BWR Buffer Read Ready 写缓冲准备好

DINT DMA interrupt DMA中断

BGE block gap event 块间隙事件

TC Transfer Complete 传输完成

CC Command Complete 命令完成

14.3.6.14 Interrupt Status Enable (uSDHCx_INT_STATUS_EN)

对应的位置位,Interrupt Status对应的位才会在相应的事件产生时置位。如果uSDHCx_INT_STATUS_EN对应的位清0,那么Interrupt Status对应的位也会清除

14.3.6.15 Interrupt Signal Enable (uSDHCx_INT_SIGNAL_EN)

对应的位设置的话,相应的事件发生时才会在中断线上产生中断信号

14.3.6.16 Auto CMD12 Error Status (uSDHCx_AUTOCMD12_ERR_STATUS)

Auto CMD12 CRC Error Auto CMD12 Timeout Error Type of Error
0 0 No Error
0 1 Response Timeout Error
1 0 Response CRC Error
1 1 CMD line conflict

SMP_CLK_SEL Sample Clock Select 采样时钟选择

EXECUTE_TUNING execute tuning 开始tuning

CNIBAC12E Command not Issued By Auto CMD12 Error Auto CMD12错误导致未发送命令

AC12IE Auto CMD12/23 Index Error Auto CMD12响应命令序号错误

AC12CE Auto CMD12/23 CRC Error Auto CMD12响应CRC错误

AC12EBE Auto CMD12/23 End Bit Error Auto CMD12结束位错误

AC12TOE Auto CMD12/23 Timeout Error Auto CMD12超时错误

AC12NE Auto CMD12 Not Executed Auto CMD12没有执行

14.3.6.17 Host Controller Capabilities (uSDHCx_HOST_CTRL_CAP)

主机控制器的功能指示寄存器,不会因为软件复位而变化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZq8TVaK-1642060343790)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142827981.png)]

VS18 Voltage Support 1.8v 是否支持1.8v

VS30 Voltage Support 3.0v 是否支持3.0v

VS33 Voltage Support 3.3v 是否支持3.3v

SRS Suspend/Resume support 是否支持suspend/resume

DMAS DMA support是否支持DMA

HSS high speed support是否支持HS模式

ADMAS ADMA support是否支持ADMA

MBL Max Block Length 最大支持的块长度

RETURNIGN MODE retuning模式

USE_TUNING_SDR50 使用SDR50模式tuning

TIMER_COUNT_RETUNING

DDR50_SUPPORT 是否支持DDR50

SDR104_SUPPORT 是否支持SDR104

SDR50_SUPPORT 是否支持SDR50

14.3.6.18 Watermark Level (uSDHCx_WTMK_LVL)

14.3.6.19 Mixer Control (uSDHCx_MIX_CTRL)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jfuGAIAo-1642060343791)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142848599.png)]

FBCLK_SEL FeedBack clock Source Selection 只要SD3.0 SDR104模式才能使用到

AUTO_TUNE_EN使能自动tune

SMP_CLK_SEL Tuned clk或者fixed clk用来采样data/cmd

EXE_TUNE Execute Tuning (只有SD3.0 SDR104模式使用到)

AC23EN Auto CMD23 Enable Auto CMD23使能

NIBBLE_POS DDR 4bit模式会用到

MSBSEL 单块多个块选择

DTDSEL Data transfer Direction Select 数据传输方向选择

DDR_EN Dual Data rate Mode selection DDR模式选择

AC12EN Auto CMD12 Enable Auto CMD12使能

BCEN Block Count Enable 块数目使能

DMAEN DMA Enable DMA使能

14.3.6.20 Force Event (uSDHCx_FORCE_EVENT)

14.3.6.21 ADMA Error Status Register(uSDHCx_ADMA_ERR_STATUS)

当ADMA错误中断产生时,ADMA Error Status Register保存ADMA状态,ADMA System Address register保存发生错误是描述符所在的地址

ST_STOP ADMA System Address register对应的前一个描述符传输发生错误

ST_FDS ADMA System Address register当前的描述符传输发生错误

ST_CADR change ADDRESS 递增描述符的指针,不会发生错误

ST_TRF ADMA System Address register对应的前一个描述符传输发生错误

ADMA Error State Coding

D01-D00 ADMA Error State (when error has occurred) Contents of ADMA System Address Register
00 ST_STOP (Stop DMA) Holds the address of the next executable Descriptor command
01 ST_FDS (Fetch Descriptor) Holds the valid Descriptor address
10 ST_CADR (Change Address) No ADMA Error is generated
11 ST_TFR (Transfer Data) Holds the address of the next executable Descriptor command

ADMADCE ADMA Descriptor Error ADMA描述符错误,如果描述符有错误该位置位,在编写ADMA描述符生成的程序时很有用

ADMALME ADMA Length Mismatch Error ADMA长度不匹配错误,对应两种情况,如果BLOCK COUNT ENABLE设置了,但是描述符指示的总长度和BLOCK COUNT与BLOCK LENGTH的乘积不匹配;还有一种情况是总长度不能被BLOCK LENGTH整除

ADMAAES ADMA Error State ADMA出错状态。

14.3.6.22 ADMA System Address (uSDHCx_ADMA_SYS_ADDR)

进行ADMA传输的物理地址,其实是ADMA描述符对应的物理地址。

14.3.6.23 DLL (Delay Line) Control (uSDHCx_DLL_CTRL)

14.3.6.24 DLL Status (uSDHCx_DLL_STATUS)

14.3.6.25 CLK Tuning Control and Status (uSDHCx_CLK_TUNE_CTRL_STATUS)

上面三个寄存器是用来tuning的,对于default speed模式和high speed模式使用不到。

14.3.6.26 Vendor Specific Register (uSDHCx_VEND_SPEC)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8iBrDsZF-1642060343791)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112142943366.png)]

使用ADMA是,EXT_DMA_EN需要置0

14.3.6.27 MMC Boot Register (uSDHCx_MMC_BOOT)

BOOT_CLK_CNT 块间隙停止传输自动模式的块数目

DISABLE_TIME_OUT 为0使能超时检测,为1时不检测

AUTO_SABG_EN boot期间,使能块间隙停止传输功能

BOOT_EN fastboot启动模式是否使能

BOOT_MODE 0表示normal boot,1表示Alternative boot

BOOT_ACK boot期间是否要ACK

DTOCVACK BOOT ack超时数器

14.3.6.28 Vendor Specific 2 Register (uSDHCx_VEND_SPEC2)

主要是SDR模式和tuning模式相关的寄存器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUi5S3n4-1642060343792)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112143020040.png)]

14.3.6.29 Tuning Control Register (uSDHCx_TUNING_CTRL)

对于default speed模式和high speed模式使用不到。

14.3.7 命令(CMD)发送和响应(Response)接收的基本操作

14.3.7.1 协议文档里发送命令的流程

注意:14.3.7.1-14.3.7.3来自SD Host_Controller_Simplified_Specification_Ver3.00,需要对照着协议文档里寄存器的介绍来看,因为imx6ull寄存器的位置和命名与协议文档有差异。

(来自PartA2_SD Host_Controller_Simplified_Specification_Ver3.00的figure3-11)

(1)检查Present State寄存器的Command Inhabit(CMD)。重复检查直到Command Inhabit(CMD)变成0。也就是说Command Inhabit(CMD)为1的话,主机不会发送Command。

(2)如果主机发送的command需要用到busy信号的话,转到(3);如果不需要检查的话,转到(5);

(3)如果发送的是abort command,转到(5);如果不是abort command,转到(4)。

(4)检查Present State寄存器的Command Inhabit(DAT)。重复检查直到Command Inhabit(DAT)变成0。

(5)设置除command寄存器的其它寄存器。

(6)设置command寄存器。

注意:写command寄存器的高字节后,主机控制器就会发送command给卡。

(7)执行command complete sequence(后面有说明)。

14.3.7.2 协议文档里命令完成时的操作

(来自PartA2_SD Host_Controller_Simplified_Specification_Ver3.00的figure3-12)

(1)如果在Transfer Mode寄存器的Response Interrupt Disable设置为1(response check使能),转到(4);否则等待Command Complete中断。如果发生了Command Complete中断,转到(2)。

(2)往Normal Interrupt Status寄存器的Command Complete写1,清除掉该bit。

(3)读Response寄存器,获得发送命令需要关注的信息。

(4)判断发送的命令是否使用到了Transfer Complete中断。如果使用的话,转到(5),否则转到(7)。

(5)等待Transfer Complete中断,如果该中断发生,转到(6)。

(6)往Normal Interrupt Status寄存器的Transfer Complete写1,清除掉该bit。

(7)检查Response data中是否有错误,如果没有转到(8);如果有错误转到(9)。

(8)返回状态No ERROR。

(9)返回状态Response Contents Error。

14.3.7.3 协议文档里使用DAT线通过ADMA传输数据

(来自PartA2_SD Host_Controller_Simplified_Specification_Ver3.00的figure3-15)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2y1pxFyn-1642060343793)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/TF_program_bare_metal_image-20220112143230507.png)]

(1)在系统主内存里创建ADMA描述符表。

(2)将ADMA描述符表的地址写入ADMA System Address寄存器。

(3)将要发送数据的一个块的长度写入Block Size寄存器。

(4)将要发送的数据的块的数目写入Block Count寄存器。

(5)将命令的参数写入到Argument寄存器。

(6)设置Transfer Mode寄存器,主机驱动需要设置Multi/Single Block Select,Block Count Enable,Data Transfer Direction,Auto CMD12 Enable和DMA enable。

(7)设置Command寄存器,设置后主机控制器会发送命令给卡。

(8)如果Response check使能,转到(11),否则等待Command Complete中断,如果Command Complete为1,转到(9)。

(9)往Normal Interrupt Status寄存器的Command Complete写1,清除掉该bit。

(10)读Response寄存器获得发送命令需要关注的信息。

(11)等待Transfer Complete中断和ADAM Error中断。

(12)如果Transfer Complete设置为1,转到(13);如果ADAM Error设置为1,转到(14)。

(13)往Normal Interrupt Status寄存器的Transfer Complete写1,清除掉该bit。

(14)往Error Interrupt Status寄存器的ADMA Error Interrupt Status写1,清除掉该bit。

(15)发送abort命令中止ADMA操作,

<

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章