本文主要是介绍如何使用MMC / SDC以及SPi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如何使用MMC / SDC
该安全数字存储卡(以下SDC)是一个用于移动设备的事实上的标准存储卡。SDC被开发为与多媒体卡(下面的MMC)的上部兼容。在大多数情况下,SDC完井设备也可以使用MMC。还有缩小尺寸的版本,例如RS-MMC,miniSD和microSD,具有相同的功能。MMC / SDC中有一个微控制器。闪存控制(块大小转换,纠错和磨损级别 - 称为FTL)在存储卡内部完成。数据以512字节为单位作为数据块在存储卡和主机控制器之间传输,因此从上层层的视点可以看作是像通用硬盘驱动器那样的块设备。
本页介绍了使用MMC / SDC和小型嵌入式系统时所了解的基本知识和其他内容。我相信这些信息对于将要在电子手工项目中使用MMC / SDC的人来说必须是一个有用的入门说明。
- 引脚
- SPI模式
- SPI模式的初始化过程
- 数据传输
- 对公共汽车浮动和热插入的考虑
- 对多从配置的考虑
- 最大SPI时钟频率
- 文件系统
- 写性能的优化
- 执照
- 链接
引脚
miniSD | 的microSD
右图显示了SDC / MMC的接触面。MMC有七个接触垫。SDC有九个接触垫,与MMC有两个额外的接触点。三个触点被分配用于供电,因此有效信号的数量是四个(MMC)和六个(SDC)。因此,主机和卡之间的数据传输是通过同步串行接口完成的。
工作电源电压范围由操作条件寄存器(OCR)指示,应在读卡时确认卡初始化时的工作电压范围。但是,电源电压也可以固定在3.0到3.3伏之间,而不需要任何确认,因为所有MMC / SDC的工作电压至少为2.7到3.6伏。请勿向卡提供5.0伏电压,否则卡会立即损坏。写入操作的电流消耗可达到大约10毫安,因此主机系统应考虑向该卡提供100毫安。
SPI模式
SPI模式的最小设置
本文档介绍了用于控制MMC / SDC的SPI模式。SPI模式是一种替代操作模式,定义为在没有本机主机接口的情况下使用MMC / SDC。与其本机操作模式相比,SPI模式的通信协议有点简单。MMC / SDC可通过通用SPI接口或某些GPIO端口连接到大多数微控制器。因此,SPI模式适用于低成本嵌入式应用,无需本机主机接口。有四种不同的SPI模式,0到3,取决于时钟相位和极性。SPI模式0是为SDC定义的。对于MMC,它不是SPI规范,锁存和移位操作都是在SCLK的上升沿定义的,但它似乎在SPI模式下工作在模式0。因此SPI模式为0(CPHA = 0,CPOL = 0)是控制MMC / SDC的正确设置,但模式3(CPHA = 1,CPOL = 1)在大多数情况下也能正常工作。DO上的上拉不能被省略,或者某些卡将无法初始化过程。
命令和响应
在SPI模式下,信号线上的数据方向是固定的,数据以字节为单位的串行通信传输。从主机到卡的命令帧是固定长度的数据包,如下所示。当卡驱动DO为高时,该卡已准备好接收命令帧。在向卡发送命令帧之后,从卡发回对命令(R1,R2,R3或R7)的响应。由于数据传输由主机控制器生成的串行时钟驱动,因此主机控制器必须继续读取数据,发送0xFF并获取接收字节,直到检测到有效响应。在读传输期间,DI信号必须保持高电平(发送0xFF并获取接收的数据)。响应在命令响应时间内发回(N CR),SDC为0到8个字节,MMC为1到8个字节。在发送命令帧之前必须将CS信号从高电平变为低电平,并在事务期间将其保持为低电平(命令,响应和数据传输,如果存在)。在SPI模式下,CRC功能是可选的。卡不会检查命令帧中的CRC字段。
SPI命令集
每个命令都以缩写形式表示,如GO_IDLE_STATE或CMD <n>,<n>是命令索引的编号,值可以是0到63.下表仅描述了通常用于通用读/写和卡的命令初始化。有关所有命令的详细信息,请参阅MMCA和SDA的规格表。
指挥 指数 | 争论 | 响应 | 数据 | 缩写 | 描述 |
---|---|---|---|---|---|
CMD0 | 无(0) | R1 | 没有 | GO_IDLE_STATE | 软件重置。 |
CMD1 | 无(0) | R1 | 没有 | SEND_OP_COND | 启动初始化过程。 |
ACMD41(* 1) | * 2 | R1 | 没有 | APP_SEND_OP_COND | 仅适用于SDC。启动初始化过程。 |
CMD8 | * 3 | R7 | 没有 | SEND_IF_COND | 仅适用于SDC V2。检查电压范围。 |
CMD9 | 无(0) | R1 | 是 | SEND_CSD | 读CSD寄存器。 |
CMD10 | 无(0) | R1 | 是 | SEND_CID | 读CID寄存器。 |
CMD12 | 无(0) | R1B | 没有 | STOP_TRANSMISSION | 停止阅读数据。 |
CMD16 | 块 长[31:0] | R1 | 没有 | SET_BLOCKLEN | 更改R / W块大小。 |
CMD17 | 地址[31:0] | R1 | 是 | READ_SINGLE_BLOCK | 读一个街区。 |
CMD18 | 地址[31:0] | R1 | 是 | READ_MULTIPLE_BLOCK | 读多个块。 |
CMD23 | 块数[15:0] | R1 | 没有 | SET_BLOCK_COUNT | 仅适用于MMC。 使用下一个多块读/写命令定义要传输的块数。 |
ACMD23(* 1) | 块数[22:0] | R1 | 没有 | SET_WR_BLOCK_ERASE_COUNT | 仅适用于SDC。 使用下一个多块写入命令定义要预擦除的块数。 |
CMD24 | 地址[31:0] | R1 | 是 | WRITE_BLOCK | 写一个块。 |
CMD25 | 地址[31:0] | R1 | 是 | 识别卡一旦 | 写多个块。 |
CMD55(* 1) | 无(0) | R1 | 没有 | APP_CMD | ACMD <n>命令的主要命令。 |
CMD58 | 无(0) | R3 | 没有 | READ_OCR | 阅读OCR。 |
* 1:ACMD <n>表示CMD55-CMD <n>的命令序列。 * 2:Rsv(0)[31],HCS [30],Rsv(0)[29:0] * 3:Rsv(0)[31:12],电源电压(1)[11:8],检查图案(和0xAA)[7:0] |
SPI响应
有一些命令响应格式,R1,R2,R3和R7,取决于命令索引。对于大多数命令,返回一个响应字节R1。R1响应的位字段显示在右图中,值0x00表示成功。发生任何错误时,将设置响应中的相应状态位。R3 / R7响应(R1 +尾随32位数据)仅适用于CMD58和CMD8。
某些命令花费的时间比N CR长,并且它响应R1b。它是一个R1响应,后跟忙标志(只要内部进程正在进行,DO就会被驱动为低电平)。主机控制器应等待进程结束,直到DO变为高电平(接收到0xFF)。
SPI模式的初始化过程
上电复位后,MMC / SDC进入其本机工作模式。要将其设置为SPI模式,必须按照此流程执行以下过程。
电源开启或卡片断裂
电源电压达到2.2伏后,至少等待一毫秒。将SPI时钟速率设置在100 kHz和400 kHz之间。将DI和CS设置为高电平,并向SCLK施加74或更多时钟脉冲。该卡将进入其本机操作模式并准备接受本机命令。
软件重置
发送CS为低电平的CMD0以复位卡。CMD0上的卡样本CS信号被成功接收。如果CS信号为低电平,则卡进入SPI模式,并以In空闲状态位(0x01)响应R1。由于CMD0必须作为本机命令发送,因此CRC字段必须具有有效值。当卡进入SPI模式时,CRC功能被禁用,并且卡不会检查CRC,因此可以使用仅对CMD0和CMD8有效且参数为零的硬编码CRC值写入命令传输例程。CRC功能也可以通过CMD59进行切换。
初始化
在空闲状态下,卡仅接受CMD0,CMD1,ACMD41,CMD58和CMD59。任何其他命令都将被拒绝。此时,读取OCR寄存器并检查卡的工作电压范围。如果系统的电压超出工作电压范围,则必须拒绝该卡。请注意,所有卡的供电电压范围至少为2.7至3.6伏,因此如果电源电压在此范围内,主机控制器无需检查OCR。当接收到CMD1时,卡启动初始化过程。要检测初始化过程的结束,主机控制器必须发送CMD1并检查响应,直到初始化结束。当卡成功初始化时,R1响应中的空闲状态位被清除(R1 resp将0x01更改为0x00)。初始化过程可以采取数百毫秒(大卡往往更长),因此这是确定超时值的考虑因素。在空闲状态位清零后,将能够接受通用读/写命令。
因为建议SDM使用ACMD41而不是CMD1,所以首先尝试使用ACMD41,如果被拒绝则重试CMD1,这对于支持两种类型的卡都是理想的选择。
应尽可能快地将SCLK速率更改为最大化读/写性能。CSD寄存器中的TRAN_SPEED字段表示卡的最大时钟速率。在大多数情况下,MMC的最大时钟频率为20MHz,SDC的最大时钟频率为25MHz。请注意,在SPI模式下,时钟速率可以固定为20 / 25MHz,因为没有开漏条件限制时钟速率。
初始读/写块长度可以在2GB卡上设置为1024,因此应使用CMD16将块大小重新初始化为512以与FAT文件系统一起使用。
初始化高容量卡
卡通过CMD0进入空闲状态后,发送参数为0x000001AA 的CMD8,并在初始化过程之前纠正CRC。如果CMD8因illigal命令错误(0x05)而被拒绝,则该卡为SDC版本1或MMC版本3.如果接受,将返回R7响应(R1(0x01)+ 32位返回值)。返回值0x1AA中的低12位表示该卡是SDC版本2,它可以在2.7到3.6伏的电压范围内工作。如果不是这种情况,则应拒绝该卡。然后使用带有HCS标志的ACMD41启动初始化(第30位)。初始化完成后,使用CMD58读取OCR寄存器并检查CCS标志(第30位)。设置时,该卡是一种称为SDHC / SDXC的高容量卡。下面描述的数据读/写操作在字节寻址的块寻址中被命令。块寻址模式下数据块的大小固定为512字节。
数据传输
数据包和数据响应
在具有数据传输的事务中,在命令响应之后将发送/接收一个或多个数据块。数据块作为由令牌,数据块和CRC组成的数据包传输。数据包的格式显示在右图中,有三个数据令牌。Stop Tran令牌是终止多块写入事务,它用作没有数据块和CRC的单字节数据包。
单块读取
参数指定以字节或块为单位开始读取的位置。必须正确缩放上层指定的LBA中的扇区地址。当接受CMD17时,启动读操作,并将读数据块发送到主机。在检测到有效数据令牌之后,主机控制器接收以下数据字段和CRC。即使不需要,也必须接收CRC字节。如果在读取操作期间发生任何错误,将返回错误令牌而不是数据包。
多块读取
CMD18将从指定位置读取序列中的多个块。读取操作继续以开放式结束。要终止交易,请将CMD12发送到卡。CMD12之后接收到的字节immediataly是一个填充字节,它应该在接收CMD12的响应之前被丢弃。对于MMC,如果在CMD18之前CMD23已经指定了传输块的数量,则读取事务作为预定义的多块传输启动,并且读取操作在最后的块传输时终止。
单块写入
单块写入将块写入卡。在接受CMD24之后,主机控制器将数据包发送到卡。数据包格式与块读取操作相同。大多数卡不能改变写入块大小,并且固定为512.除非启用CRC功能,否则CRC字段可以具有任何固定值。该卡响应来自主机的数据包的数据响应immediataly。数据响应跟踪忙标志,主机控制器必须等待卡准备就绪。
原则上,SPI模式必须在事务期间保持CS信号有效。但是这个规则有一个例外。当卡忙时,主机控制器可以取消CS,以释放总线上其他SPI设备的SPI总线。在内部过程中重新选择时,卡将再次将DO驱动为低电平。因此,在前面的繁忙检查中,检查每个命令和数据包之前卡是否繁忙,而不是等待后等待可以消除繁忙的等待时间。此外,内部写过程在数据响应后的一个字节处启动,这意味着需要8个SCLK时钟来启动内部写操作。后时钟期间CS信号的状态可以是低或高,因此可以通过下面描述的总线释放过程来完成。
多块写入
Multiple Block Read命令从指定位置写入序列中的多个块。在接受CMD25之后,主机控制器将一个或多个数据包发送到卡。除数据令牌外,数据包格式与块读取操作相同。写操作继续,直到使用Stop Tran令牌终止。busy标志将在每个数据块和Stop Tran令牌之后输出。对于MMC,要写入的块数可以在CMD25之前由CMD23预定义,写入事务在最后一个数据块处终止。对于SDC,可以在CMD25之前由ACMD23指定在写入事务开始时预擦除的扇区数。始终需要Stop Tran令牌来终止写入事务。
阅读CSD和CID
除数据块长度外,它们与单块读取相同。CSD和CID作为16字节数据块发送到主机。有关CMD,CID和OCR的详细信息,请参阅MMC / SDC规范。
对公共汽车浮动和热插入的考虑
可以浮动的SPI信号应通过电阻器正确拉低或拉高。这是CMOS器件上的通用设计规则。因为DI和DO通常很高,所以应该将它们拉高。根据SDC / MMC规范,建议将上拉寄存器的值从50k到100k欧姆。但是SDC / MMC规范中没有提到时钟信号,因为它总是由主机控制器驱动。当有可能浮动时,它应该被拉到正常状态,低。
MMC / SDC可以热插入/移除。但是需要对主机电路进行一些考虑以避免不正确的操作。例如,如果系统电源(Vcc)直接连接到卡插槽,则由于卡的内置电容器的充电电流,Vcc将在卡插入的瞬间下降。右图中的“A”是示波器视图,它表明发生的电压骤降约为600 mV。这是触发掉电探测器的足够水平。右图中的“B”表示插入电感器以阻止浪涌电流,电压骤降降至200 mV。低ESR电容,例如OS-CON,可以像'C'中所示的那样消除电压骤降。然而,低ESR电容会引起LDO稳压器的振荡。
对多从配置的考虑
在SPI总线中,每个从器件都选择有独立的CS信号,多个器件可以连接到SPI总线。通用SPI从设备通过CS信号异步驱动/释放其DO信号以共享SPI总线。但是,MMC / SDC驱动/释放DO信号与SCLK同步。这意味着与MMC / SDC以及连接到SPI总线的任何其他SPI从设备存在总线冲突的可能性。右图显示了MMC / SDC的驱动/释放时序(DO信号被拉至1/2 vcc以查看总线状态)。因此,为了让MMC / SDC释放DO信号,主器件必须在CS信号置为无效后发送一个字节。
最大SPI时钟频率
MMC / SDC可以在高达20/25 MHz的时钟频率下工作。当然,所有本机接口都保证以最大时钟频率工作。但是,由于时序问题,集成在微控制器中的通用SPI接口可能无法在高时钟频率下工作。右图显示了SPI接口的时序图。在SPI模式0/3中,数据在SCLK的下降沿移出,并在下一个上升沿锁存。td是SDC的SCLK到DO传播延迟,最大值为14ns。tsu是MISO输入的最小设置时间。因此,最大允许SCLK频率可通过以下公式计算:
F SCLK(max) = 0.5 /(td + tsu)
根据时序规范,我使用的一些微控制器限制在10 MHz左右的允许时钟频率。
文件系统
MMC / SDC上使用的文件系统是FAT。MMC / SDC规范将FAT类型定义为:FAT12为64MB或更小,FAT16为128MB到2GB,FAT32为4GB到32GB,exFAT为64GB到2TB。使用FDISK分区的卡上只能存在FAT卷,不允许使用像软盘那样的补丁表。当然,除了MMC / SDC规范定义之外的不同文件系统和分区可以用作PC的通用存储介质。然而,这些具有illigal格式的卡可能不被DSC,便携式摄像机和电视接受。
写性能的优化
大多数MMC / SDC采用NAND闪存作为存储器阵列。NAND闪存具有成本效益,并且可以快速读/写大数据,但另一方面,存在重写一部分数据效率低的缺点。通常,闪存需要在写入新数据之前擦除现有数据,并且最小擦除操作单元(称为擦除块)大于写入块大小。典型的NAND闪存具有512 / 16K字节的块大小用于写入/擦除操作,并且最近的怪物卡采用大块芯片(2K / 128K)。这意味着即使只写扇区(512字节),也可以在卡中重写擦除块中的整个数据。
基准
我假设一个内存大小有限的嵌入式系统,我用一个便宜的8位MCU(ATmega64 @ 9.2MHz)检查了一些MMC / SDC的读/写性能。出于内存大小的原因,write()和read()一次以2048字节执行。结果是:写入:77kB /秒,读取:128MB SDC为 328kB /秒,写入:28kB /秒,读取:512MB SDC为234kB /秒,写入:182kB /秒,读取:128MB为 312kB /秒MMC。
通过稍后的一些基准测试,我猜MMC在写入吞吐量方面往往比SDC更快。
因此,512MB SDC的写入性能非常差,即128MB SDC的三分之一值。通常,大容量存储设备的读/写性能与其记录密度成比例地增加,但是有时在存储卡上出现相反的趋势。至于MMC,它似乎比SDC快几倍,性能也不差。在那之后,我检查了不同制造商提供的一些SDC,我发现PQI的SDC和日立的MMC一样快,但松下和东芝的SDC表现非常糟糕。
擦除块大小
为了分析写操作的细节,在发送写数据之后的忙时(轮询周期数)在低级磁盘写功能中输入到控制台。一行中的多个数字表示由多个块写入事务发出的数据块和Stop Tran令牌。
在分析结果中,128MB SDC和512MB SDC之间存在不同的内部过程。128MB SDC在多块写入事务结束时重写擦除块。512MB SDC似乎具有4K字节数据缓冲区,并且每4K字节边界重写擦除块。因此,它不能直接比较,但是对于128MB SDC,重写擦除块的处理时间可以被读取3800,而对于128MB SDC,可以读取512MB SDC 30000比8倍长的处理时间。从这个结果来看,似乎128MB SDC使用小块芯片,512MB SDC使用大块或MLC芯片。当然,较大的块大小会降低相应块重写的性能。在512MB SDC中,只有从内存顶部512K字节的区域相对较快。这可以从close()中的写入时间读取。可能会对此区域应用任何特殊处理以快速进行FAT跟踪。
提高写性能
为避免此瓶颈并提高写入性能,每个写入事务的块数必须尽可能大。当然,应用程序和媒体之间的所有层都必须支持多扇区写入功能。对于低级SDC / MMC写入功能,它应该在写入事务之前通知卡的写入扇区的数量,以进行有效的内部写入过程。这种方法称为“预定义多块写入”。MMC(CMD23)和SDC(ACMD23)之间的预定义命令不同。
最初对存储卡进行修补和格式化以使分配单元与擦除块边界对齐。当使用不兼容MMC / SDC的设备重新格式化或重新格式化存储卡(这只是一台PC)时,优化将被破坏,写入性能可能会丢失。我尝试使用PC的通用格式功能在FAT32中重新格式化512MB SDC,在文件副本中测量的写入性能降低到几个。因此,应使用SD格式实用程序或符合SDC / MMC标准的设备重新格式化卡。
执照
MMC规范由MMCA(多媒体卡协会)提供,然后转移到JEDEC。开发和销售MMC产品不需要任何许可证。但是,MMC规范不向公众开放,您需要加入JEDEC以获取技术文档。
SD规范是由SDA(SD卡协会)和SD-3C,LLC开发和提供的产品。销售任何SD规格产品的每个组织或个人都必须获得SDA的许可。例如,需要HALA(主机和辅助产品许可协议)来销售任何表明支持SD卡的SD主机产品,无论使用哪种接口,SD模式或SPI模式。对于中间产品,例如嵌入式模块,模块销售商或最终产品需要许可证。只有被许可人才能在产品,包装和手册上放置SD徽标。普通会员的入场费为2,000美元,HALA的许可费为每年1,000美元。
每个产品都声明支持SD卡需要获得许可。换句话说,该产品不支持SD卡不需要许可,即使它实际上支持SD卡。为了避免许可证问题,一些吝啬的设备制造商包括主要公司“支持MMC”,“支持MMC和兼容机”或“支持TF卡”。多么废话!
链接
- e.MMC | JEDEC
- SDA - SD卡协会
- SDHC物理层规范 由SDA
- 关于SPI
- 通用FAT文件系统模块,带有控制MMC / SDSC / SDHC的示例代码
这篇关于如何使用MMC / SDC以及SPi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!