[应用相关] 零死角玩转stm32-高级篇之SDIO

[复制链接]
4321|59
 楼主| 雨果喝水 发表于 2021-6-29 23:54 | 显示全部楼层 |阅读模式
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卡硬件原理图:
8962060db425075176.png
 楼主| 雨果喝水 发表于 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协议,让大家对它先有个大概了解,更具体的说明在代码中展开。
3979960db42a1c638d.png
 楼主| 雨果喝水 发表于 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。
 楼主| 雨果喝水 发表于 2021-6-29 23:57 | 显示全部楼层
通过下面的库函数来配置时钟:

SDIO_Init(&SDIO_InitStructure);

对SD卡的操作一般是大吞吐量的数据传输,所以采用DMA来提高效率,SDIO采用的是DMA2中的通道4。在数据传输的时候SDIO可向DMA发出请求。
 楼主| 雨果喝水 发表于 2021-6-29 23:58 | 显示全部楼层
二.讲解SDIO的命令、数据传输方式。

SDIO的所有命令及命令响应,都是通过SDIO-CMD引脚来传输的。
 楼主| 雨果喝水 发表于 2021-6-29 23:59 | 显示全部楼层
命令只能由host即STM32的SDIO控制器发出。SDIO协议把命令分成了11种,包括基本命令,读写命令还有ACMD系列命令等。其中,在发送ACMD命令前,要先向卡发送编号为CMD55的命令。
 楼主| 雨果喝水 发表于 2021-6-29 23:59 | 显示全部楼层
参照下面的命令格式图,其中的start bit,transmission bit ,crc7,endbit,都是由STM32中的SDIO硬件完成,我们在软件上配置的时候只需要设置command index和命令参数argument。Command index就是命令索引(编号),如CMD0,CMD1…被编号成0,1...。有的命令会包含参数,读命令的地址参数等,这个参数被存放在argument段。
7420360db435bed84b.png
单片小菜 发表于 2021-6-30 10:12 | 显示全部楼层
SDIO没有问题,主要是文件系统,不好弄呀。哈哈!
 楼主| 雨果喝水 发表于 2021-6-30 16:28 | 显示全部楼层
可以通过下面的函数来配置、发送命令:

SDIO_SendCommand(&SDIO_CmdInitStructure);   //发送命令
 楼主| 雨果喝水 发表于 2021-6-30 16:32 | 显示全部楼层
SD卡对host的各种命令的回复称为响应,除了CMD0命令外,SD卡在接收到命令都会返回一个响应。对于不同的命令,会有不同的响应格式,共7种,分为长响应型(136bit)和短响应型(48bit)。以下图,响应6(R6)为例:
1361860dc2c2311e8e.png
 楼主| 雨果喝水 发表于 2021-6-30 16:33 | 显示全部楼层
SDIO通过CMD接收到响应后,硬件去除头尾的信息,把command index 保存到SDIO_RESPCMD寄存器,把argument field内容保存存储到SDIO_RESPx寄存器中。这两个值可以分别通过下面的库函数得到。
 楼主| 雨果喝水 发表于 2021-6-30 16:34 | 显示全部楼层
SDIO_GetCommandResponse();  //卡返回接收到的命令
 楼主| 雨果喝水 发表于 2021-6-30 16:34 | 显示全部楼层
SDIO_GetResponse(SDIO_RESP1); //卡返回的argument field内容
 楼主| 雨果喝水 发表于 2021-6-30 16:42 | 显示全部楼层
数据写入,读取。请看下面的写数据时序图,在软件上,我们要处理的只是读忙。另外,我们的实验中用的是Micro SD卡,有4条数据线,默认的时候SDIO采用1条数据线的传输方式,更改为4条数据线模式要通过向卡发送命令来更改。
 楼主| 雨果喝水 发表于 2021-6-30 16:43 | 显示全部楼层
 楼主| 雨果喝水 发表于 2021-6-30 16:44 | 显示全部楼层
三.卡的种类。

STM32的SDIO支持SD存储卡,SD I/O卡 ,MMC卡。
 楼主| 雨果喝水 发表于 2021-6-30 16:44 | 显示全部楼层
其中SDI/O卡与SD存储卡是有区别的,SDI/O卡实际上就是利用SDIO接口的一些模块,插入SD的插槽中,扩展设备的功能,如:SDI/O wifi, SDI/O cmos相机等。而SD存储卡就是我们平时常见的单纯用于存储数据的卡。
 楼主| 雨果喝水 发表于 2021-6-30 16:45 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1213

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部