SDIO_SD卡4bit模式详解
实验描述:MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上打印出
来。
硬件连接:PC12-SDIO-CLK:CLK
PC10-SDIO-D2 :DATA2
PC11-SDIO-D3:CD/DATA3
PD2-SDIO-CMD :CMD
库函数printf详解
PC8-SDIO-D0:DATA0
PC9-SDIO-D1:DATA1
库文件:startup/start_stm32f10x_hd.c
CMSIS/core_cm3.c
CMSIS/system_stm32f10x.c
FWlib/stm32f10x_gpio.c
FWlib/stm32f10x_rcc.c
FWlib/stm32f10x_usart.c
FWlib/stm32f10x_sdio.c
FWlib/stm32f10x_dma.c
FWlib/misc.c
用户文件:  USER/main.c
USER/stm32f10x_it.c
USER/usart1.c
USER/sdio_sdcard.c
野火STM32开发板 MicroSD卡硬件原理图:
SDIO简介->
野火STM32开发板的CPU ( STM32F103VET6 )具有一个SDIO接口。
SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模
式:1位(默认)、4位和8位。在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。SDIO存储卡规范2.0版支持两种数据总线模式:1
位(默认)和4位。
目前的芯片版本只能一次支持一个SD/SDIO/MMC 4.2版的卡,但可以同时支持多个MMC 4.1版或之前版本的卡。除了SD/SDIO/MMC,这个接口完全与CE-ATA数字
协议版本1.1兼容。
知识准备:
大多数人原来没有了解过SD协议,又看到SDIO的驱动有2000多行,感觉无
从下手。所以野火重新写了这个文档进行详细的解释,帮助大家更快地跨过这道槛。
附资料:《Simplified_Physical_Layer_Spec.pdf》,这个资料包含了SDIO协议中SD存储卡的部分。
下面野火结合STM32的SDIO,分析SD协议,让大家对它先有个大概了解,更具体的说明在代码中展开。
SDIO接口图
一.从SDIO的时钟说起。
SDIO_CK时钟是通过PC12引脚连接到SD卡的,是SDIO接口与SD卡用于同步
的时钟。
SDIO选配器挂载到AHB总线上,通过HCLK二分频输入到适配器得到SDIO_CK
的时钟,这时SDIO_CK = HCLK/(2+CLKDIV)。其中CLKDIV是SDIO_CLK(寄存器)
中的CLKDIV位。
另外,SDIO_CK也可以由SDIOCLK通过设置bypass模式直接得到,这时
SDIO_CK = SDIOCLK=HCLK。
通过下面的库函数来配置时钟:
对SD卡的操作一般是大吞吐量的数据传输,所以采用DMA来提高效率,SDIO
采用的是DMA2中的通道4。在数据传输的时候SDIO可向DMA发出请求。
二.讲解SDIO的命令、数据传输方式。
SDIO的所有命令及命令响应,都是通过SDIO-CMD引脚来传输的。
命令只能由host即STM32的SDIO控制器发出。SDIO协议把命令分成了11种,包括基本命令,读写命令还有ACMD系列命令等。其中,在发送ACMD命令前,要先向卡发送编号为CMD55的命令。
参照下面的命令格式图,其中的start bit,transmission bit ,crc7,endbit,都是由STM32中的SDIO硬件完成,我们在软件上配置的时候只需要设置command index 和命令参数argument。Command index就是命令索引(编号),如CMD0,CMD1…被编号成0,1...。有的命令会包含参数,读命令的地址参数等,这个参数被存放在argument段。
SD卡命令格式
可以通过下面的函数来配置、发送命令:
SD卡对host的各种命令的回复称为响应,除了CMD0命令外,SD卡在接收到命令都会返回一个响应。
对于不同的命令,会有不同的响应格式,共7种,分为长响应型(136bit)和短响应型(48bit)。以下图,响应6(R6)为例:
SD卡命令响应格式(R6)
SDIO通过CMD接收到响应后,硬件去除头尾的信息,把command index 保存到SDIO_RESPCMD寄存器,把argument field内容保存存储到SDIO_RESPx寄存器中。这两个值可以分别通过下面的库函数得到。
数据写入,读取。请看下面的写数据时序图,在软件上,我们要处理的只是读忙。另外,我们的实验中用的是Micro SD卡,有4条数据线,默认的时候SDIO采用1条数据线的传输方式,更改为4条数据线模式要通过向卡发送命令来更改。
SD卡的多块写入时序图
三.卡的种类。
STM32的SDIO支持SD存储卡,SD I/O卡,MMC卡。
其中SDI/O卡与SD存储卡是有区别的,SDI/O卡实际上就是利用SDIO接口的一些模块,插入SD的插槽中,扩展设备的功能,如:SDI/O wifi, SDI/O cmos相机等。而SD存储卡就是我们平时常见的单纯用于存储数据的卡。
可使用SDIO接口类型的卡
本实验中使用的Micro SD卡属于SDSC(标准容量,最大两G)卡。介绍卡的种类是因为SD协议中的命令也支持这三种类型的卡,因此对STM32中的SDIO接口进行初始化后,上电后就要对接入的卡进行检测、分类,这个过程是通过向卡发送一系列不同的命令,根据卡不同的响应来进行分类。
下面进入代码展开具体讲解。
实验讲解->
首先要添加用的库文件,在工程文件夹下Fwlib下我们需添加以下库文件:
还要在stm32f10x_conf.h中把相应的头文件添加进来:
保持良好的习惯,从main函数开始分析: