SD(Secure Digital Memory Card)是SD协会(SD Association, SDA)设计的一种专有的非易失性存储卡格式,广泛应用于各种电子设备。SD标准于 1999 年发布,最初作为多媒体卡MMC(Multi-Media Card)的更新,但最终成为了一个重要的行业标准。2000 年成立的非营利性组织SDA负责推广和管理SD卡标准。SD标准主要涵盖SD存储卡、SD主机以及SD衍生产品。
SD存储卡具有三种尺寸,分布为SD卡、miniSD卡、microSD卡,三种尺寸的卡以特定的方式可以嵌套使用。其中,microSD卡较为通用,一般可直接或采用SD适配器与具有USB接口的SD读卡器连接,如图 7.1。
图 7.1 microSD卡、SD卡适配器和SD读卡器
SD存储卡分为五种系列,分别为SDSC、SDHC、SDXC、SDUC、SDIO。表 7.1 说明了SD存储卡的容量等级。
表 7.1 SD存储卡容量等级
SD存储卡主要分为四部分组成:外部引脚、内部寄存器、接口控制器和内部存储介质。SD存储卡接口除了保留MMC卡的 7 针外,在接口两侧多了 2 针,作为数据线。SD卡外形尺寸为 24mm*32mm*2.1mm或 24mm*32mm*1.4mm,SD卡接口如图 7.2。
图 7.2 SD卡接口
SD 存储卡主要引脚和功能描述如下:CLK时钟信号,控制器或者SD 存储卡在每个时钟周期传输一个命令位或数据位,在默认速度模式下SD 总线的频率可在 0~25MHz 之间变化;CMD命令和响应复用引脚,命令是由控制器发给SD 存储卡,可以是从控制器到单个SD 存储卡,也可以是到 SD 总线上所有卡;响应是存储卡对控制器发送的命令应答,应答可以来自单卡或所有卡;DAT0~3 数据线,数据可以从存储卡传向控制器也可以从控制器传向存储卡。
SD存储卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,需要用到SD卡的 4 根信号线,即CS、SCLK、DI与DO(片选、时钟、数据输入与数据输出)。SD存储卡支持三种传输模式:SPI模式(独立序列输入和序列输出),1 位SD模式(独立指令和数据通道,独有的传输格式), 4 位SD模式(使用保留的针脚以及重新设置的针脚,支持四位宽的并行传输)。SD卡接口信号定义如表 7.2。
表 7.2 SD卡接口信号定义
采用“X”表示法表示SD数据传输速度时,是按CD-ROM的 150kB/s为 1 倍速的速率计算方法来计算的。基本上,它们能够比标准CD-ROM的传输速度快 6 倍(900 kB/秒),而高速的SD卡更能传输 66x(10 MB/秒)以及更高的速度。
普通卡和高速卡的速率定义为Class2、Class4、Class6 和Class10 四个等级。超高速卡,速率定义为UHS-I、UHS-II和UHS-Ⅲ等。SDA对SD Express和视频速度等级也进行了定义。详细信息请参见SD规范以及相关文档。
关于SD存储卡的详细说明,可参考SD规格(SD Specifications)文档 【29】 。
CC3200 上的SD主控制器提供嵌入式处理器等主设备与SD存储卡的接口,以极少的主设备资源实现SD操作。SD主设备工作在 1 位SD模式,实现SD卡访问、处理传输层的SD协议、数据打包、增加CRC循环校验码和启动停止位、以及检测内容的正确性。SD控制器接口发送SD命令,轮询适配器状态或者等待异常状态或操作完成告警的中断请求。SD控制器可配置为产生DMA请求且工作在极小CPU干预的状态。
图 7.3 1 位SD主控制器接口(CC3200)功能框图
SD主设备接口采用 3 根信号线(CLK, CMD, DATA)与SD存储卡通信。CLK信号由SD主控制器内部产生并提供给外部SD存储卡;双向的CMD信号线用于发送命令和接收响应;双向的DATA数据线用于发送数据至SD存储卡或者从SD存储卡接收数据。
SD主控制器和SD存储卡之间的总线协议是基于消息的。每个消息均由命令、响应、数据和忙信号来表示。命令用于启动操作,从SD主控制器到SD存储卡的命令在CMD信号线上串行传输;响应是对命令的回答,从SD存储卡到SD主控制器地响应在CMD信号线上串行传输;采用DATA数据线传输从SD主控制器到SD存储卡的数据,或者从SD存储卡到SD主控制器的数据。
供电、复位和时钟模块(Power, Reset and Clock Module, PRCM)管理时钟和复位功能。片上SD主控制器时钟来源于 120MHz固定时钟,可以采用内部 10 位分频器模块分频,为SD存储卡提供相应的时钟。用户通过采用合适的参数调用PRCM复位接口API复位PRCM模块,这将令该模块内的所有内部寄存器恢复到默认状态。
SD主控制器特点:
鉴于CC3200 平台上外围设备集成的特点,推荐开发者使用外围库API来控制和操作SD主控制器。
基本初始化和配置流程:
1)使用函数PRCMPeripheralClkEnable(PRCM_SDHOST, PRCM_RUN_MODE_CLK)有效SD主控制器时钟;
2)设置并有效合适的SD主控制器引脚;
3)使用函数PinDirModeSet(<PIN_NO>,PIN_DIR_MODE_OUT)设置CLK时钟引脚为输出;
4)使用函数PRCMPeripheralReset(PRCM_SDHOST),SDHostInit(SDHOST_BASE)软复位并初始化SD主控制器;
5)使用函数SDHostSetExpClk(SDHOST_BASE, PRCMPeripheralClockGet(PRCM_SDHOST), XX000000)初始化SD主控制器为SD存储卡提供XXMHz时钟。
用于SD主控制器的外围API功能包括卡检测及初始化、发送命令、读数据块、写数据块等。具体信息请参见CC3200 软件开发套件SDK案例程序,CC3200 Technical Reference Manual技术参考手册 【1】 及CC3200 Peripheral Driver Library User's Guide 【9】 用户指导文档。
SD卡块操作程序流程为引脚设置、串口初始化、SDHOST初始化、SD卡选择、SD卡块读取和SD卡块写入,以及相应信息打印。SD卡块操作时,引脚配置:PIN_07 为CLK,PIN_08 为CMD,PIN_6 为DATA,实物如图 7.4。
图 7.4 SD卡块操作示例
采用图 7.1 所示 16G容量SD卡,进行SD卡块操作。将sdhost示例程序烧录至图 7.4 所示目标板,运行程序,测试结果如图 7.5 所示。从图 7.5 可知,所操作的SD卡为SDHC类型,容量为 15120MB字节,块大小为 512 字节。
图 7.5 SD卡块操作测试结果
CC3200 SDK提供的SD卡块操作示例程序sdhost如下: