打印
[应用相关]

零死角玩转stm32-高级篇之SDIO

[复制链接]
3109|59
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、SDIO(4bit + DMA、支持SDHC)

   1.1 实验描述及工程文件清单
实验描述:MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上 打印出来。
硬件连接:MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上 打印出来。
用到的库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/ stm32f10x_sdio.cFWlib/ stm32f10x_dma.cFWlib/ misc.c
用户编写的文件:USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/ sdio_sdcard.c



使用特权

评论回复
沙发
雨果喝水|  楼主 | 2021-6-29 23:55 | 只看该作者
野火STM32开发板 MicroSD卡硬件原理图:

使用特权

评论回复
板凳
雨果喝水|  楼主 | 2021-6-29 23:55 | 只看该作者
 1.2 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兼容。

使用特权

评论回复
地板
雨果喝水|  楼主 | 2021-6-29 23:56 | 只看该作者
1.3 SD协议

大多数人原来没有了解过SD协议,又看到SDIO的驱动有2000多行,感觉无从下手。所以野火重新写了这个文档进行详细的解释,帮助大家更快地跨过这道槛。

附资料:《Simplified_Physical_Layer_Spec.pdf》,这个资料包含了SDIO协议中SD存储卡的部分。

下面野火结合STM32的SDIO,分析SD协议,让大家对它先有个大概了解,更具体的说明在代码中展开。

使用特权

评论回复
5
雨果喝水|  楼主 | 2021-6-29 23:57 | 只看该作者
一.从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。

使用特权

评论回复
6
雨果喝水|  楼主 | 2021-6-29 23:57 | 只看该作者
通过下面的库函数来配置时钟:

SDIO_Init(&SDIO_InitStructure);

对SD卡的操作一般是大吞吐量的数据传输,所以采用DMA来提高效率,SDIO采用的是DMA2中的通道4。在数据传输的时候SDIO可向DMA发出请求。

使用特权

评论回复
7
雨果喝水|  楼主 | 2021-6-29 23:58 | 只看该作者
二.讲解SDIO的命令、数据传输方式。

SDIO的所有命令及命令响应,都是通过SDIO-CMD引脚来传输的。

使用特权

评论回复
8
雨果喝水|  楼主 | 2021-6-29 23:59 | 只看该作者
命令只能由host即STM32的SDIO控制器发出。SDIO协议把命令分成了11种,包括基本命令,读写命令还有ACMD系列命令等。其中,在发送ACMD命令前,要先向卡发送编号为CMD55的命令。

使用特权

评论回复
9
雨果喝水|  楼主 | 2021-6-29 23:59 | 只看该作者
参照下面的命令格式图,其中的start bit,transmission bit ,crc7,endbit,都是由STM32中的SDIO硬件完成,我们在软件上配置的时候只需要设置command index和命令参数argument。Command index就是命令索引(编号),如CMD0,CMD1…被编号成0,1...。有的命令会包含参数,读命令的地址参数等,这个参数被存放在argument段。

使用特权

评论回复
10
单片小菜| | 2021-6-30 10:12 | 只看该作者
SDIO没有问题,主要是文件系统,不好弄呀。哈哈!

使用特权

评论回复
11
雨果喝水|  楼主 | 2021-6-30 16:28 | 只看该作者
可以通过下面的函数来配置、发送命令:

SDIO_SendCommand(&SDIO_CmdInitStructure);   //发送命令

使用特权

评论回复
12
雨果喝水|  楼主 | 2021-6-30 16:32 | 只看该作者
SD卡对host的各种命令的回复称为响应,除了CMD0命令外,SD卡在接收到命令都会返回一个响应。对于不同的命令,会有不同的响应格式,共7种,分为长响应型(136bit)和短响应型(48bit)。以下图,响应6(R6)为例:

使用特权

评论回复
13
雨果喝水|  楼主 | 2021-6-30 16:33 | 只看该作者
SDIO通过CMD接收到响应后,硬件去除头尾的信息,把command index 保存到SDIO_RESPCMD寄存器,把argument field内容保存存储到SDIO_RESPx寄存器中。这两个值可以分别通过下面的库函数得到。

使用特权

评论回复
14
雨果喝水|  楼主 | 2021-6-30 16:34 | 只看该作者
SDIO_GetCommandResponse();  //卡返回接收到的命令

使用特权

评论回复
15
雨果喝水|  楼主 | 2021-6-30 16:34 | 只看该作者
SDIO_GetResponse(SDIO_RESP1); //卡返回的argument field内容

使用特权

评论回复
16
雨果喝水|  楼主 | 2021-6-30 16:42 | 只看该作者
数据写入,读取。请看下面的写数据时序图,在软件上,我们要处理的只是读忙。另外,我们的实验中用的是Micro SD卡,有4条数据线,默认的时候SDIO采用1条数据线的传输方式,更改为4条数据线模式要通过向卡发送命令来更改。

使用特权

评论回复
17
雨果喝水|  楼主 | 2021-6-30 16:43 | 只看该作者

使用特权

评论回复
18
雨果喝水|  楼主 | 2021-6-30 16:44 | 只看该作者
三.卡的种类。

STM32的SDIO支持SD存储卡,SD I/O卡 ,MMC卡。

使用特权

评论回复
19
雨果喝水|  楼主 | 2021-6-30 16:44 | 只看该作者
其中SDI/O卡与SD存储卡是有区别的,SDI/O卡实际上就是利用SDIO接口的一些模块,插入SD的插槽中,扩展设备的功能,如:SDI/O wifi, SDI/O cmos相机等。而SD存储卡就是我们平时常见的单纯用于存储数据的卡。

使用特权

评论回复
20
雨果喝水|  楼主 | 2021-6-30 16:45 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

1165

帖子

0

粉丝