SD卡的读取分析设计

SD卡的读取分析设计

很多单片机都需要大容量存储设备,用来存储数据。目前常用的有U盘,FLASH芯片,SD卡等。它不仅用量可以做到最大到(32GB以上),支持SPI/SDIO驱动,而且有多重体积的尺寸可供支持,能够满足不同应用需求。

只需要几个IO口就可以外扩一个高达32GB以上的外部存储器,用量从几十个M到几十个G选择尺度很大,更换也很方便。

本章介绍是以STM32F1为主控器,使用所提供的SDIO控制器,来读取SD卡。支持1位,4位和8位数据总线模式。

SDIO控制器包含两个部分:SDIO适配器模块和AHB总线接口。其功能图如下:

SD卡的读取分析设计

一、其中SDIO_D[7:0],是数据线工作在推挽模式。

SDIO_CMD有两种操作模式:

1、用于初始化的开路模式

2、用于命令传输的推挽模式。

二、SDIO的时钟

可以看到SDIO的时钟总共有三种时钟。

1、卡时钟(SDIO_CLK):每个时钟周期在命令或者数据线上传输一位命令或数据。

2、SDIO的适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,其频率等于AHB总线频率(HCLK),并用于产生SDIO_CK时钟。

3、AHB总线接口时钟(HCLK/2):该时钟用于驱动SDIO的AHB总线接口,其频率为HCLK/2.

时钟频率设置:

SDIO_CLK=SDIOCLK/(2+CLKDIV)

其中SDIOCLK是HCLK,一般是72Mhz,二CLKDIV是分配系数,可以通过SDIO的SDIO_CLKCR寄存器进行设置,(确保不要超过卡的最大时钟频率)。在此说一点SD刚初始化的时候,器时钟频率SDIO_CLK不能超过400Khz.

三、SDIO的命令与响应

SDIO的命令分为相关命令(ACMD)和通用命令(CMD),应用相关的命令(ACMD),必须先发送通用命令(CMD55),然后才能发送相关命令(ACMD).SDIO的所有命令和响应都是通过SDIO_CMD引脚传输的,任何命令的固定长度都为48位,SDIO的命令格式如下:

SD卡的读取分析设计

其中开始位、传输位、CRC7和结束位又SDIO硬件控制,我们需要设置的只有命令索引和参数部分。其中命令索引(如CMD0,CMD1之类的)在SDIO_CMD寄存器里面设置,命令参数由SDIO_ARG设置。

响应:一般情况下,选中的SD卡在收到命令后,都会回复一个应答(注意CMD0是无应答的),这个应答我们成为响应,响应也是在CMD线上串行传输的。SDM32F1的SDIO控制器支持两种响应类型,即:短响应(48位)和长响应(136位),这两种响应类型都带CRC错误检测,(如果不带CRC的响应应该会忽略CRC错误标志,如CMD1的响应)。

短响应的格式如下:

SD卡的读取分析设计

长响应的格式如下:

SD卡的读取分析设计

同样硬件为我们滤除了开始位、传输位、CRC7和结束位信息,对于短响应,命令索引放在SDIO_RESPCMD寄存器,参数则放在SDIO_RESP1寄存器里面。对于长响应,则仅保留了CID/CSD位域,存放在SDIO_RESP1-SDIO_RESP4等四个寄存器。

SD卡总共有5类响应(R1,R2,R3,R6,R7),我们这里以R1为例简单介绍一下,R1是普通命令响应,响应类型为短响应,其长度为48位,R1响应的格式如下:

SD卡的读取分析设计

    在收到R1响应后,我们可以从SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分别读出命令索引和卡状态信息。

在这里提一下,如果收到短响应,则数据存放在SDIO_RESP1寄存器里面,其它三个寄存器未用到。长响应就会用到剩下的寄存器。

四、SDIO的数据块的读操作。如下:

SD卡的读取分析设计

SDIO数据块的写操作,如下:

SD卡的读取分析设计

数据块的写操作和读操作很相似,只不过多了个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。这里的繁忙信号由SD卡拉低SDIO_D0,表示繁忙,SDIO硬件自动控制,不需要我们软件处理。

五、SDIO的相关寄存器介绍

第一个,电源控制寄存器(SDIO_POWER),该寄存器定义如下:

SD卡的读取分析设计

好了重要的寄存器就介绍完了,希望能对你有所帮助。

下面我们来看看SD卡的初始化流程,初始化是很重要的对任何一个存储器而言。

SD卡的读取分析设计



好了,卡的初始化流程就介绍完了,只要将卡的初始化搞定,剩下的读写操作就简单了。哈哈SD卡的读取分析设计SD卡的读取分析设计SD卡的读取分析设计