SD介质格式扩展了MAXQ2000的非易失性数据存储空间

描述

本文演示如何使用安全数字(SD)介质格式扩展MAXQ2000的非易失性数据存储。

低功耗、低噪声MAXQ2000微控制器适用于多种应用。MAXQ2000将非易失数据存储在闪存中,具有32k字(64kB)闪存容量,与用户代码空间共享。但是,如果您的应用程序需要更多非易失性存储,该怎么办?本文演示如何使用安全数字 (SD™)介质格式,以扩展MAXQ2000的非易失性数据存储。

外部存储的设计注意事项

应用的首要设计考虑因素是电源电压和电流要求。在典型的MAXQ2000应用中,采用双通道线性稳压器来运行处理器内核电压(VDD) 以所选设计时钟速率所需的最低电压。The MAXQ2000 VDD电源可低至 1.8V。MAXQ2000上的I/O引脚由V供电迪奥,其允许的较低范围为 VDD上限为3.6V。外部存储的可接受电流消耗取决于电源的额定电流,如果是电池供电设备,则取决于电池系统的容量。

其次,用于连接外部存储器的MAXQ2000 I/O线数量必须保持在最低限度,同时仍能为预期应用提供足够的带宽。例如,Atmel AT29LV512 闪存芯片在与主机微控制器连接时需要 15 条地址线、2000 条数据线和 2000 条控制线。由于MAXQ<>没有外部地址/数据总线,因此在该示例中需要软件控制总线事务。对于某些应用,该方法不能有效利用MAXQ<>的I/O引脚。

SPI™和我2然而,基于 C 的外部闪存设备只需要三个或四个接口引脚。MAXQ2000具有硬件SPI模块,而2C必须由用户在MAXQ2000上软件中实现(即“位敲击”)。这种集成功能意味着SPI接口是访问外部非易失性存储器的主要途径。

SD 存储卡格式

SD介质格式是一种非易失性外部存储器,可满足许多应用的上述考虑因素。SD格式是“多媒体卡”格式或MMC的继承者。SD卡存储器通常采用3.3V电源供电,电流要求适中。SD卡容量范围从几兆字节到最大容量4GB。这种广泛的可用尺寸为许多应用提供了充足的外部存储空间。

乍一看,SD似乎不能轻易与MAXQ2000连接,因为前者专有的共享总线。但是,SD继承了MMC的辅助总线格式SPI。因此接口很简单,因为MAXQ2000包含对SPI的硬件支持。

嵌入式

图1.MAXQ2000可轻松连接至SD存储卡。

图1所示为典型应用电路。SD 卡需要全双工 8 位 SPI 操作。数据从MAXQ2000的MOSI引脚输入卡的DI引脚,从卡的DO线进入MAXQ2000的MISO引脚。数据在CLK线的上升沿同时输入和传出卡。每笔交易结束时必须提供八个额外的时钟,以允许SD卡完成任何未完成的操作。这些额外时钟期间的输入数据必须全部为 400。在识别阶段,时钟速率必须限制为最大25kHz,但一旦识别SD卡,时钟速率可以增加到<>MHz。

MAXQ2000 SPI模块

MAXQ2000包含一个硬件SPI模块,易于配置为SD卡接口。为了配置时钟极性和数据长度,SPICF寄存器被编程为全零。这将SPI模块配置为在上升时钟边沿锁存数据,并将数据长度设置为2000位。对于该应用,MAXQ16的系统时钟频率为0MHz。在这种情况下,SPICK寄存器被编程为28x380,从而产生大约<>kHz的SPI时钟。必须通过设置 SPICN 寄存器的两个较低位来启用 SPI 主模式。

标清 SPI 数据格式

SD 卡的 SPI 协议类似于其 SD 总线协议。没有数据要发送的卡不会在每个时钟边沿从SD卡的DO引脚接收有效数据,而是将DO引脚保持在所有时钟边沿的空闲状态。当卡有数据要发送回主机时,在数据之前发送起始位为零的专用令牌。从SD卡传输的所有数据都会在这些令牌之后立即发送,并且长度固定。由于接收方事先知道预期的字节数,因此响应中不包含长度字节。此外,由于在发送启动令牌和数据之前不会发生空闲状态,因此所有数据字节都将原封不动地传输,并且没有前缀。与总线上的所有其他流量一样,令牌在 SPI 事务的 8 位边界上对齐。从主机到卡的命令和数据遵循类似的格式,所有 7 都表示空闲总线。除状态令牌之外的所有事务都受附加到数据末尾的循环冗余校验 (CRC) 代码的保护。提供了两种CRC算法:CRC-16用于短数据块,CRC-<>用于较长的数据块。CRC 是 SD SPI 接口的可选部分,但应用于保证数据完整性,除非应用限制阻止其使用。

循环冗余校验

CRC算法通常用于检测由不可靠的通信信道引起的错误。特定CRC的选择取决于要保护的数据大小。对于标清介质,指定了CRC-7和CRC-16。

CRC算法将受保护的数据除以选定的除数并产生余数。由于算法中使用的多项式数学,这种除法是在没有进位逻辑的情况下完成的。由于不需要进位,因此可以通过逻辑异或运算完成除法。选定的除数通常称为CRC多项式。然后,生成的余数与数据一起传输,接收器可以使用该余数来检查数据在传输过程中是否未损坏。

对于CRC-7,余数可以使用软件中的7位移位寄存器进行计算。此移位寄存器在计算开始时初始化为所有零。当受保护数据的每个位(MSB优先)移入移位寄存器的LSB时,移位寄存器的MSB被移出并检查。如果刚刚移出的位是 7,则移位寄存器的内容通过 XOR 与 CRC-0 多项式值 09x7 进行修改。如果移出移位寄存器的位为零,则不执行异或。一旦受保护数据的最后一位被移入并且条件异或完成,就必须以类似的方式再移入七个零。此过程称为增强,并完成多项式除法。此时,可以直接从移位寄存器读取CRC-<>值。

嵌入式

图2.CRC-7可以使用移位寄存器架构进行计算。

当接收器拥有所有受保护的数据时,接收器可以计算受保护数据的CRC-7值,并将其与接收到的CRC-7值进行比较。如果值不同,接收方知道受保护的数据在传输过程中已损坏。如果值匹配,接收方可以高度确定地知道数据完整性不会受到通信信道的影响。

CRC-16算法可以用同样的方式构建。在这种情况下,移位寄存器的长度为16位而不是7位,多项式值更改为0x1021,输入数据增加了16个零位。

SD 命令格式

命令以6字节格式发送到卡(图3)。命令的第一个字节可以通过使用十六进制6x0对 40 位命令代码进行 OR 运算来构造。接下来的四个字节提供单个 32 位参数(如果命令需要);最后一个字节包含字节 7 到 1 的 CRC-5 校验和。表 1 列出了重要的 SD 命令。

嵌入式

图3.SPI 模式 SD 命令以 6 字节格式发送到卡。

 

命令 记忆 论点 描述
0 (0x00) GO_IDLE_STATE 没有 R1 重置 SD 卡。
9 (0x09) SEND_CSD 没有 R1 发送特定于卡的数据。
10 (0x0a) SEND_CID 没有 R1 发送卡标识。
17 (0x11) READ_SINGLE_BLOCK 地址 R1 读取字节地址处的块。
24 (0x18) WRITE_BLOCK 地址 R1 在字节地址处写入块。
55 (0x37) APP_CMD 没有 R1 应用程序命令的前缀。
59 (0x3b) CRC_ON_OFF 仅位 0 R1 参数将 CRC 设置为 (1) 或关闭 (0)。
41 (0x29) SEND_OP_COND 没有 R1 启动卡初始化。

 

在 SPI 模式下初始化 SD 卡

上电时,SD 卡默认采用专有的 SD 总线协议。要将卡切换到 SPI 模式,主机发出命令 0 (GO_IDLE_STATE)。SD 卡通过观察卡选择 (CS) 引脚在GO_IDLE_STATE命令期间保持低电平来检测 SPI 模式选择。卡以响应格式R1响应(图4)。空闲状态位设置为高,表示卡已进入空闲状态。为了保持与MMC卡的兼容性,在此阶段SPI时钟速率不得超过400kHz。

嵌入式

图4.响应格式 R1 指示发出的命令成功或失败。

现在 SD 卡处于 SPI 模式,SD 规范要求主机先发出初始化命令,然后才能处理任何其他请求。为了区分 MMC 和 SD 卡,SD 卡实现了 MMC 卡不响应的备用初始化命令。向卡发送命令 55 (APP_CMD) 后跟应用程序命令 41 (SEND_OP_COND) 即可完成此重要步骤。MMC 卡不响应命令 55,该命令可用于拒绝 MMC 卡作为无效介质。重复此命令序列,直到来自卡的R1响应中的所有位都为零(即空闲位变低)。

嵌入式

清单 1.代码必须使用 SEND_OP_COND 标识 SD 和 MMC 卡。

SD 卡包含几个重要的寄存器,这些寄存器提供有关 SD 卡的信息。最重要的寄存器是卡特定数据寄存器(CSD)。对于我们的示例应用程序,我们对内存的块大小和总大小感兴趣。我们还必须注意卡识别数据寄存器(CID),因为它包含有关卡制造商和序列号的详细信息。图 5 显示了 CSD 和 CID 寄存器的布局。

嵌入式

图5.CSD 和 CID 寄存器提供有关 SD 卡的信息。

检查 SD 卡响应

要从卡中读取卡寄存器或块,我们必须首先了解卡如何响应我们的查询。在 SPI 模式下,SD 卡使用 R9 格式回复命令SEND_CSD (10)、SEND_CID (17) 和READ_SINGLE_BLOCK (1)。接下来是开始令牌、请求的数据,最后是数据的 CRC-16 校验和。我们不能假设 R1 回复和数据启动令牌一个接一个地立即发生,因为总线可以在这两个事件之间进入空闲状态一段时间。图 6 详细介绍了数据响应。

嵌入式

图6.从 SD 卡到主机的数据传输以启动令牌为前缀。

读取惩教署和国际舞蹈委员会寄存器元数据

SEND_CSD 和 SEND_CID 命令发回用于确定 SD 卡参数的寄存器内容。这些命令返回固定数量的字节,分别对应于 CSD 或 CID 寄存器的大小。这些 SEND 命令的 SD 卡将忽略命令字节中包含的参数。

从 SD 卡读取数据块

从SD卡读取数据块非常简单。主机发出 READ_SINGLE_BLOCK 命令,并将起始字节地址作为参数。此地址必须与介质上块的开头对齐。然后,SD 卡评估此字节地址,并使用 R1 命令回复进行响应。命令回复中指示超出范围的地址。

如果从 SD 介质完成读取而没有错误,则会发送一个起始数据令牌,后跟固定数量的数据字节和两个字节用于 CRC-16 校验和。如果 SD 卡遇到硬件故障或介质读取错误,则不会发送启动数据令牌。相反,将发送错误令牌并中止数据传输。

将数据块写入 SD 卡

写入数据块类似于读取,因为主机必须提供与 SD 卡块边界对齐的字节地址。写入块大小必须等于 READ_BL_LEN,通常为 512 字节。通过发出 WRITE_BLOCK (24) 命令来启动写入,SD 卡使用 R1 命令响应格式响应该命令。如果命令响应指示写入可以继续,则主机将传输数据开始令牌,后跟固定数量的数据字节,并以发送数据的 CRC-16 校验和结束。SD 卡返回一个数据响应令牌,指示接受或拒绝要写入的数据。

如果数据被接受,SD卡在卡繁忙时将DO线持续保持低电平。主机没有义务在繁忙时段保持卡选择低电平,如果 CS 被取消断言,SD 卡会释放 DO 线路。当多个器件连接到SPI总线时,此过程非常有用。主机可以等待 SD 卡释放忙音指示,也可以通过定期断言芯片选择来检查卡。如果卡仍然繁忙,它将把 DO 线拉低以指示此状态。否则,卡将 DO 线返回到空闲状态(请参阅图 7)。

嵌入式

图7.从主机到 SD 卡的数据传输涉及更复杂的握手。

SPI 命令和数据错误检测

CRC-7 和 CRC-16 校验和可用于检测主机和 SD 卡之间通信中的错误。错误检测允许在发生物理引起的错误时进行可靠的错误恢复,例如插入和移除过程中的触点反弹或可拆卸介质固有的不理想的触点配接情况。强烈建议使用校验和,方法是使用参数中设置的最低位发出 CRC_ON_OFF (59) 命令。

嵌入式

清单 2.强烈建议启用 CRC 校验和。

结论

SD介质卡格式代表了一种紧凑、低功耗的非易失性存储器解决方案,适用于嵌入式系统。通过使用MAXQ2000微控制器提供的硬件SPI支持,可以以很小的开销访问SD介质卡。Maxim提供的参考软件演示了最小实现,其中包括从SD卡读取模块和向SD卡写入模块所需的基本操作。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分