小卡和大卡没什么区别,大卡在左侧有一个锁,剥下来之后是禁止写入(好像没什么用),看图可知32GB的存储卡写了SDHC,而64GB的写了HDXC。上边的小圆圈 “10” 是存储卡的读写速度。
SD卡是 nand flash 存储器具有容量较大,必须以块为单位进行读写 ,改写速度快等优点,适用于大量数据的存储。
一张SD卡包括存储单元、存储单元接口、电源检测、卡及接口控制单元、接口驱动器组成。
SD卡有8个寄存器,这些寄存器只能通过命令来访问,有点像SPI操作flash的样子.SDIO 一共定义了64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改。在程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
SDIO与SD卡使用9根线通讯,3根电源线,1根时钟线,1根命令线、4根数据线。
SDIO在通讯时,SDIO不管是从主机传网SD卡还是从SD卡传网主机,都是以SCL线的上升沿为有效。
SD卡在操作过程中会有两种不同频率的时钟同步数据,一个是识别卡阶段,,时钟频率为FOD,最高400KHZ,另一个是数据传输模式下的时钟频率FPP,默认最高25MHZ, 但是如果配置相关寄存器使SDIO工作在高速模式,传输速度最高可达50MHZ。
命令的响应交互:
SDIO总线通讯是基于命令和数据传输的,通讯由一个起始位0,由一个停止位1结束,一般是主机发送一个命令,从设备接收到命令之后做出响应,如果需要会有数据的传输参与
CMD命令线,如果发送的命令不需要主机返回,那么发完命令之后无响应。又比如我读取ID号,发完命令,大多数 SD卡的应答信号会通过SDIO返回给主机,当然也有特殊情况,后边详细说明。
SD卡的写入:
SD卡是以块的形式传输,SDHC卡一个数据块的长度一般是512KB,数据可以从主机到卡,也可以从卡到主机。
数据传输的时候呢还有CRC校验位来确定数据传输的准确性。以起始位0开始,然后是各种各样的数据,然后校验位,最后以结束为1结束,传输过程中全都是通过D0~D3这四根线传输的。
这个图是这么理解的:主机发送一个命令,收到SD的响应之后,主机就把这个数据块写入到SD卡里,通过把D0线拉低,表示SD卡处于忙碌状态,正在写入,写完之后这个忙碌标志就去掉了,然后就可以接着写入另一块数据了。传输完之后主机会发送一个停止命令。命令这块后面会详细说明。
SD卡的读取:
SD的数据传输支持单块和多块的读写操作,多块写入的时候需要使用停止命令来停止整个写入操作,数据写入之前需要检测SD卡的忙碌状态,每写入一块都需要等待SD卡的忙碌状态。读操作与写类似,只是没有检测忙的标志,因为数据直接传输出去了,不需要擦除,不需要等待很长时间,基本上接收到读命令SD卡就直接出数据了,没有忙碌的标志,就不用去检测。
使用四根线传输,每次可以传输4个位,没跟数据线都有起始位、数据位、校验位、终止位。
SD卡数据包有两种格式,一种是常规格式(8bit宽),它先发低字节,再发高字节。而每个字节是先发先发高位再发低位,如图所示
另一种叫做 宽位数据包格式,宽位数据包是针对SD卡的SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512位。主机在发送出ACMD13命令后,SD卡会将SSR寄存器的内容通过DAT线发送给主机,这就比较特殊,上边说主机通过CMD线发送的命令,如果需要SD卡做出响应,SD卡一般也会通过CMD线返回去,这就不是了,在读取SSR内容的时候,这512个字节是通过数据线返回给主机的。 发送的命令至于ACMD13是啥?后面再说
SD命令由主机发出,有广播命令和寻址命令两种,广播命令是针对于SD主机总线相连的所有设备发出的,我们知道SDIO总线支持多张卡,只是stm32限制了只能插一张卡,寻址命令就只指定某个设备进行命令传输
SD命令格式固定为48位,都是通过CMD线传输的,数据线不参与命令的传输
SD命令有四种类型:
SD卡有两种操作模式:卡识别模式,数据传输模式。顾名思义卡识别模式就是识别卡的种类,卡的标准容量等等。
在每种操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换
卡在上电之后就进入空闲状态,或者通过命令CMD0进入空闲状态(复位),如果是V2.0版本的卡,在空闲状态要先发送一个CMD8,返回这个卡的电压状态。接着发送ACMD41带参数的给他一些电压值,要求返回这张卡的一些信息和OCR寄存器的值,如果返回信息不支持这个电压,那就在传给他另一个电压,继续询问是否支持,如果一直不行,那这张卡只能处于空闲状态了(也有可能使卡处于无效状态,如图所示)。通过上边的几个命令就可得到这张卡支持的电压,卡的版本信息,SDHC还是别的卡,等信息。如果一切正常,接着输入命令CMD2,进入识别状态,卡会返回它的CID号,接着CMD3,要求返回卡的相对地址,完事之后就进入待机模式了,到这这张卡就识别完了,之后就可以进行数据的传输
从卡的识别模式到数据传输模式,通过CMD3,使卡处于待机状态,如果处于了待机状态,卡就可以开始传输数据了,通过发送CMD7(就是先选中这张卡,CMD带有参数,相对地址,选择是那张卡进入传输状态),进入传输状态,传输状态是数据发送状态和数据接收状态的前置状态。意思就是说在真正的数据传输开始,必须先进入这个传输状态。进入传输状态之后如果在发送一个相同的CMD7,带的参数也相同,那么就从传输状态返回到了待机状态,取消选中这张卡。进入发送状态之后,通过CMD6,17……读取一个或几个数据块,进入发送数据状态,注意这个发送数据是针对SD的,所以是主机从SD卡读出数据,读完数据时候有两条分支,一个是CMD7进入待机状态,另一个是使用CMD12命令,强制卡停止传输,传输完成,返回传输状态。如果数据要从主机发往SD卡就走下边的分路,通过CMD16、32……设置CD卡块的长度,因为SD的读写操作都是按照块进行的,不同容量的卡块大小不同,所以在发送数据之前,必须先设置块大小,仍然处于传输状态,然后通过命令CMD24、25……进入写状态,写入一个块或者多个块,数据暂时存放在卡及控制单元(这有缓存),以CMD12结束,传输完成之后进入编程模式(真正的数据写入状态,数据写完之后直接退出到传输状态 ),在从缓存把数据传输到SD卡的存储单元。在传输状态还有另一条分路CMD28、29……数据擦除,擦除指定的块,完成之后同样进入传输状态。另外在编程状态,也可以通过CMD7取消选中这张卡,就会处于断开连接状态,回到待机状态。
只有SD卡处于数据传输模式时,才能进行数据的读写操作(上边已经说得很清楚了),在数据传输模式下可以将SD卡的时钟频率(SCL)设置为FPP,默认最高为25MHZ,可以通过CMD4命令实现
stm32有一个SDIO,由两部分组成SDIO适配器和AHB总线接口,SDIO适配器提供了SDIO主机功能,可以提供SD的时钟、发送命令、数据传输。
SDIO使用两个时钟信号一个是SDIO适配器时钟:SDIOCLK = HCLK = 72M,另一个是AHB总线时钟的二分频366MHZ,SDIO适配器是针对MMC卡和SD卡,SD卡只用4根数据线足够。
SDIO适配器:
SDIO适配器是SD卡系统的主机部分,它是STM32控制器和SD卡数据通信的中间设备。SDIO设备由5个单元组成,分别是 控制单元、命令通道、数据通道、适配器寄存器、FIFO。
发送以及接收命令的过程:
适配器寄存器存放CMD的命令号,参数就是要发送的命令的参数。会把这些命令通过移位寄存器一位一位的发送出去,在发送过程中可以对命令进行控制:状态标志、控制逻辑、命令定时器,可以检测是否传输完成,传输是够正确
CDM在接收命令时,同样通过移位寄存器将返回的响应存储到响应寄存器中,而且是带有CMD号的,通过AHB接口可以读响应寄存器
CPSM命令状态机,在发送CMD命令之后,不会马上发送,我们可以使能这个状态机,他有一个超时处理
发送以及接收数据的过程:
数据路径部件负责与SD卡相互数据传输,SDIO适配器和数据路径状态机(DPSM)来描述SDIO适配器状态变化,也加入了等待超时检测的功能。
SDIO命令寄存器:o~5位是命令索引(CMD号),作为命令的一部分发送出去
标准库建立了三个初始化结构体,
SD卡的命令格式,SD卡支持有R1、R2、R3、R6、R7这五种响应命令,R4和R5是SDIO卡的命令格式,SD卡不支持。
真正响应的内容占32位
基础命令
CMD0:命令号
CMD0 | bc | [31:0] stuff bits | 空 | 进入空闲状态 |
CMD2
CMD2 | bcr | [31:0] stuff bits | R2 | 让所有的SD卡返回CID |
CMD3
CMD3 | bcr | [31:0] stuff bits | R6 | 发送相对地址 |
CMD4
CMD4 | bc | [31:16] DSR的内容 [15:0]stuff bits | 空 | 设置DSR的内容 |
CMD7
CMD7 | ac | [31:16] RCA的内容 [15:0]stuff bits | R1 | 选择/取消某张卡 |
CMD8
CMD8 | ac | [31:12]保留[11:8]supply voitage[7:0]check pattem | R7 | 发送接口环境 |