SD存储卡是一种可移动存储介质,通常用于相机、手机、平板电脑等设备中存储照片、视频、音乐等数据。SD存储卡的全称为Secure Digital Memory Card,是由SD Card Association制定的一种标准格式。它具有体积小、存储容量大、读写速度快、价格低廉等优点。目前,市场上常见的SD存储卡有SD、SDHC、SDXC等不同类型,其存储容量也从几百MB到几十GB不等。
图 1. MAXQ2000 与SD 存储卡的接口非常简单
图 1 的电路图给出了一个典型应用电路。SD 卡要求全双工、8 位 SPI 操作。数据 从 MAXQ2000 的 MOSI 引脚同步输入SD卡的DI 引脚,并由SD卡的DO线同步输入MAXQ2000的MISO 引脚。数据在CLK信号的上升沿同步输入和输出。在每次数据传输的末尾还必须提供8个额外的时钟,以允许SD完成任何未完结的操作。对应这些额外时钟的输入数据必须全为 1.识别阶段的时钟频率必须限定在 400kHz 以内,但SD 卡一经识别后,时钟频率便可提高到 25MHz。
MAXQ2000 的 SPI 模块
MAXQ2000包含一个硬件SPI模块,可以方便地针对SD卡接口进行配置.为了配置时钟极性和数据长度,需将SPICF寄存器置为全零。这种SPI模块配置在时钟的上升沿锁存数据,并将数据长度设置为8位。对于本应用, MAXQ2000的系统时钟频率为16MHz.在这种情况下,需要将SPICK寄存器置为Ox28,从而使SPI时钟频率接近380kHz.必须将 SPICN 寄存器的低 2 位置位,以使能 SPI 主机模式。
SD SPI 数据格式
SD卡的SPI协议与SD总线协议相似。如果一片SD卡没有数据要发送,则将DO引脚保持在全1的空闲状态,因此不是在每个时钟沿都从SD卡的DO引脚接收有效数据。当SD卡有数据要回送给主机时,要在数据之前先发送一些以0 为起始位的特定令牌。当这些令牌发送完毕之后,SD 卡要发送的所有定长数据立即被发送出去。由于接收器事先已经知道要接收的字节数,因而响应中不包含表征长度的字节。此外,由于在起始令牌和数据都发送完毕后才会进入空闲状态,所以全部数据字节都以不带前缀的原始形式发送。和总线上其它所有通信过程一样,令牌大小也要和SPI 传输的8 位边界对齐。主机发送给 SD卡的指令和数据都进循类似的格式,以全 1 指示总线空闲。除了状态令牌以外,所有传输都由附加在数据末尾的循环冗余校验(CRC)码进行保护,系统提供两种CRC算法: CRC-7用于小数据块, CRC-16则用于大数据块。CRC 是SD SPI 接口的可选部分,但除非应用系统限制它的使用,否则应该使用 CRC 来确保数据的完整性。
循环冗余校验
CRC 算法通常用于检测由不可靠的通信通道引起的误差。特定CRC类型的选择根据需要保护的数据长度来决定。对于基于 SD 存储介质的数据,采用CRC-7 和 CRC-16 编码方式.
CRC 算法将被保护的数据用选中的除数进行除法运算,产生一个余数。因为该算法中用得的是多项式,所以该除法运算不含进位逻辑。无需考虑进位时,除法运算可通过逻辑XOR操作来实现。所选中的除数通常用CRC的多项式来表示。接着,计算出的余数和数据一起传输,接收器用此余数来检查确认数据在传输过程中是否正常
对于 CRC-7,余数可通过一个 7 位移位寄存器在软件中计算。计算开始时,将该移位寄存器初始化置为全零。当受保护数据的每一位(MSB在先)被移入移位寄存器的LSB 时,移出移位寄存器的MSB,并进行检查。如果移出的位为 1则用CRC-7多项式系数0x09进行异或运算,以此来修正移位寄存器的内容。如果从移位寄存器中移出的位为0.则无需XOR操作。受保护数据的最后一位被移入移位寄存器且完成了条件XOR操作后,必须按此类似方式移入6个或更多 0. 这一过程称作扩张并完成多项式除法运算。此时,CRC-7 值可从移位寄存器直接读出。
图2.通过移位寄存器架构计算CRC-7.
当接收器收到所有受保护的数据后,接收器可计算基于受保护数据的CRC-7值并将改值与接收到的CRC-7值进行比较.如果这两个值不同,接收器就能判断出受保护数据在传输过程中出现错误。如果这两个值相同,则接收器可完全判定通信通道上的数据是完整的.
CRC-16 算法可用同样的方式来构建。在这种情况下,移位寄存器长度为 16 位而不是 7 位:多项式系数改为 0×1021.且输入数据通过 16 个 0 位来扩张。
SD 命令格式
发送给 SD 卡的命令采用 6 字节的格式(图 3)。命令的第1 个字节可通过将6 位命令码与 16 进制码 0x40 进行或运算得到。如果命令需要,则在接下来的 4 个字节中提供一个 32 位的参数:最后 1 个字节包含了从第 1 个字节到第 5 个字节的CRC-7校验和。表 1 列出了一些重要的SD命令.
图3. 发送给存储卡的SPI 模式SD 命令采用6 字节格式。
表 1. 部分 SD 存储卡命令