如何使用MMC / SDC以及SPi

2023-11-09 13:20
文章标签 使用 spi mmc sdc

本文主要是介绍如何使用MMC / SDC以及SPi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何使用MMC / SDC

安全数字存储卡(以下SDC)是一个用于移动设备的事实上的标准存储卡。SDC被开发为与多媒体卡(下面的MMC)的上部兼容。在大多数情况下,SDC完井设备也可以使用MMC。还有缩小尺寸的版本,例如RS-MMCminiSDmicroSD,具有相同的功能。MMC / SDC中有一个微控制器。闪存控制(块大小转换,纠错和磨损级别 - 称为FTL)在存储卡内部完成。数据以512字节为单位作为数据块在存储卡和主机控制器之间传输,因此从上层层的视点可以看作是像通用硬盘驱动器那样的块设备。

本页介绍了使用MMC / SDC和小型嵌入式系统时所了解的基本知识和其他内容。我相信这些信息对于将要在电子手工项目中使用MMC / SDC的人来说必须是一个有用的入门说明。

  1. 引脚
  2. SPI模式
  3. SPI模式的初始化过程
  4. 数据传输
  5. 对公共汽车浮动和热插入的考虑
  6. 对多从配置的考虑
  7. 最大SPI时钟频率
  8. 文件系统
  9. 写性能的优化
  10. 执照
  11. 链接

引脚

SDC / MMC接触面
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字段。

cmd框架

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)* 2R1没有APP_SEND_OP_COND仅适用于SDC。启动初始化过程。
CMD8* 3R7没有SEND_IF_COND仅适用于SDC V2。检查电压范围。
CMD9无(0)R1SEND_CSD读CSD寄存器。
CMD10无(0)R1SEND_CID读CID寄存器。
CMD12无(0)R1B没有STOP_TRANSMISSION停止阅读数据。
CMD16
长[31:0]
R1没有SET_BLOCKLEN更改R / W块大小。
CMD17地址[31:0]R1READ_SINGLE_BLOCK读一个街区。
CMD18地址[31:0]R1READ_MULTIPLE_BLOCK读多个块。
CMD23
块数[15:0]
R1没有SET_BLOCK_COUNT仅适用于MMC。
使用下一个多块读/写命令定义要传输的块数。
ACMD23(* 1)
块数[22:0]
R1没有SET_WR_BLOCK_ERASE_COUNT仅适用于SDC。
使用下一个多块写入命令定义要预擦除的块数。
CMD24地址[31:0]R1WRITE_BLOCK写一个块。
CMD25地址[31:0]R1识别卡一旦写多个块。
CMD55(* 1)无(0)R1没有APP_CMDACMD <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响应

MMC和SDC

有一些命令响应格式,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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376345

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

flask 中使用 装饰器

因为要完成毕业设计,我用到fountain code做数据恢复。 于是在github上下载了fountain code的python原代码。 github上的作者用flask做了fountain code的demo。 flask是面向python的一个网站框架。 里面有用到装饰器。 今天笔试的时候,我也被问到了python的装饰器。

mathematica的使用

因为做实验用到Bloom filter这一技术,Bloom filter里面的数学公式可以用来画图。 那么用什么画图软件比较好呢? 当然是Mathematica啦。 利用代码Plot[{y=x},{x,0,100}] 就可以画出比较好的图 简直nice