我们先一起了解下sd卡的知识。
SD可分为3类:SD、SDHC、SDXC。
SD是早先的版本的,据说是由MMC演变而来的。最大支持2GB大小容量
SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量SDHC,Secure Digital High Capacity,大容量SD,也就是说,超过2G的SD都叫SDHC,因为早期的SD使用的是FAT16文件系统,并不支持大容量,而SDHC升级为FAT32,才支持2G以上的大容量。
SDXC(SD eXtended Capacity)支持最大2TB的大小容量。SDXC是SD eXtended Capacity的缩写,是新提出的标准,除了容量可以升级为最大2T以外,主要是可以支持300M/s的传输速度,也就是说是“高速SD”卡。不过支持SDXC卡的数码相机并不多,主要都是今年推出的新品,而SDXC又是不可向下兼容的,不支持普通的SD和SDHC卡槽和读卡器。对于大部分数码相机和单反来说,高速SDHC存储卡的速度已经足以实现高速连拍和高清视频拍摄。
1:SD卡上所有的单元由内部时钟发生器( Internal Clock )提供时钟。接口驱动单元
( Internal driver)同步外部时钟的DAT和CMD信号到内部所用的时钟。
2:本卡由6线SD卡接口控制,包括:CMD,CLK,DAT0-DAT3。
3:SD卡垛叠中为了标识SD卡,一个卡标识寄存器(CID)和一个相应地址寄存器(RCA)
预先准备好。
4:一个附加的寄存器包括不同类型操作参数。这个寄存器叫做CSD。
5:如果接到复位命令(CMD0)时,CS信号有效(低电平),SPI模式启用。命令CMD0
就是0,CMD16就是16,其它以此类推
6:使用SD卡线访问存储器还是寄存器的通信由SD卡标准定义。
7:卡有自己的电源开通检测单元, 无需附加的主复位信号来在电源开启后安装卡。 它
防短路,在带电插入或移出卡时,无需外部编程电压, 编程电压卡内生成。
SD卡的内存组织形式:
数据读写的基本单元是一个字节,可以按要求组织成不同的块。
Block:块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD 寄存
器。
Sector:和擦除命令相关,由几个块组成。Sector 的大小对每个设备是固定的,大小信
息存储在CSD 寄存器。
SD卡共支持三种传输模式:
1)SPI模式(独立序列输入和序列输出)
2)1位SD模式 (独立指令和数据通道,独有的传输格式)
3)4位SD模式 (使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)
本实验我们采用的是SPI模式,我们主要对这个模式进行分析。
SD 卡可以通过单数据线(DAT0)或四根数据线(DAT0-DAT3)进行数据传输。单根数据线传输最大传输速率为25 Mbit/s,四根数据线最大传输速率为100 Mbit/s。
SPI模式相对于SD模式的不足之处是丧失了速度性能。SPI模式使用字节传输,所有的数据被融合到一些字节中。SPI模式的优点就是简化主机的设计。
SD卡SPI模式针脚定义如下:
如
SD卡默认为SD模式,要进入SPI模式时,要遵守如下操作:当SD卡接收RESTE命令(CMD0)时,拉低CS即可。命令CMD0就是0,CMD16就是16
SD卡SP
I模式的读写操作
“启动时间”被定义为从0V上升到Vdd_min的时间。在上电后,主机启动SCK及在CMD线上发送74个高电平的信号,接着发送CMD0进入SPI模式,然后发送CMD8激活初始化进程。
上电后,包括热插入,卡进入idle状态。在该状态SD卡忽略所有总线操作直到接收到ACMD41命令。ACMD41命令是一个特殊的同步命令,用来协商操作电压范围,并轮询所有的卡。除了操作电压信息,ACMD41的响应还包括一个忙标志,表明卡还在power-up过程工作,还没有准备好识别操作,即告诉主机卡还没有就绪。主机等待(继续轮询)直到忙标志清除。单个卡的最大上电时间不能操作1秒。
上电后,主机开始时钟并在CMD线上发送初始化序列,初始化序列由连续的逻辑“1”组成。序列长度为最大1毫秒,74个时钟或supply-ramp-up时间。额外的10个时钟(64个时钟后卡已准备就绪)用来实现同步。
每个总线控制器必须能执行ACMD41和CMD1。
“启动时间”被定义为从0V上升到Vdd_min的时间。在上电后,主机启动SCK及在CMD线上发送74个高电平的信号,接着发送CMD0进入SPI模式,然后发送CMD8激活初始化进程。
上电后,包括热插入,卡进入idle状态。在该状态SD卡忽略所有总线操作直到接收到ACMD41命令。ACMD41命令是一个特殊的同步命令,用来协商操作电压范围,并轮询所有的卡。除了操作电压信息,ACMD41的响应还包括一个忙标志,表明卡还在power-up过程工作,还没有准备好识别操作,即告诉主机卡还没有就绪。主机等待(继续轮询)直到忙标志清除。单个卡的最大上电时间不能操作1秒。
上电后,主机开始时钟并在CMD线上发送初始化序列,初始化序列由连续的逻辑“1”组成。序列长度为最大1毫秒,74个时钟或supply-ramp-up时间。额外的10个时钟(64个时钟后卡已准备就绪)用来实现同步。
每个总线控制器必须能执行ACMD41和CMD1。
SD卡支持两种接口访问模式,SDIO模式和SPI模式。我们采用SPI模式,首先程序运行后,初始化实验需要使用的到串口,然后初始化访问SD卡要使用的SPI接口,按照协议要求初始化SD卡,读取SD的信息包括规范标准的版本、卡的容量、卡生产日期等信息,最后串口打印SD的的起始扇区(MBR)数据。
主要步骤是初始化SD卡和从SD卡读取数据,我们分别看一下这两个操作的流程,初始话SD卡基本步骤:
1:初始化与SD卡连接的GPIO管脚,及SPI配置;
2:上电延时(>74个时钟);
3:发送软件重置命令CMD0,进入Idle状态;
4:发送CMD8,检测是否支持2.0协议
5:根据不同类型的SD卡,进行不同的设置
6:取消片选,发送8个时钟,结束初始化
通过SD卡的初始化,我们就可以对SD进行读写操作了。SD卡读数据的典型过程如下:
1:发送CMD17命令;
2:接收SD卡响应R1;
3:接收数据起始令牌0xFE;
4:接收数据;
5:接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉;
6:取消片选,发送8个时钟。
SD卡典型的写操作流程如下:
1:发送CMD24命令;
2:接收SD卡响应R1;
3:发送写数据起始令牌0xFE;
4:发送数据;
5:发送2个字节的伪CRC
6:取消片选,发送8个时钟。
部分代码如下。