0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32入门学习笔记之SD卡基础读写实验1

jf_78858299 来源:滑小稽笔记 作者:电子技术园地 2023-02-16 15:09 次阅读

20.1 概述

SD卡是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12M字节的数据。

20.1.1 SDIO框图

STM32F1的SDIO控制器包括2部分,SDIO适配器模块和AHB总线接口,功能框图如下图所示。

图片

其中SDIO适配器模块主要用于实现所有MMC/SD卡的相关功能,如时钟的产生,命令和数据的传输,AHB总线接口则用于操作SDIO适配器模块中的寄存器并产生中断和DMA请求信号。复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。

如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是MMC卡就设置为1位总线数据)。

如果一个SD卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0或SDIO_D[3:0]。所有的数据线都工作在推挽模式。

SDIO_CMD有两种操作模式:

(1)用于初始化时的开路模式(仅用于MMC版本V3.31或之前版本)

(2)用于命令传输的推挽模式(SD卡和MMCV4.2在初始化时也使用推挽驱动)

20.1.2 SDIO时钟

从SDIO框图我们可以看到SDIO总共有3个时钟,分别是:

(1)卡时钟SDIO_CK:每个时钟周期在命令和数据线上传输1位命令或数据。对于多媒体卡V3.31协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体卡V4.0/4.2协议,时钟频率可以在0MHz至48MHz间变化;对于SD卡,时钟频率可以在0MHz至25MHz间变化。

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

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

我们的SD卡时钟SDIO_CK,根据卡的不同,可能有好几个区间,这就涉及到时钟频率的设置,SDIO_CK与SDIOCLK的关系为:

SDIO_CK=SDIOCLK/(2+CLKDIV)

其中,SDIOCLK为HCLK,一般是72MHz,而CLKDIV则是分配系数,可以通过SDIO的SDIO_CLKCR寄存器进行设置,确保SDIO_CK不超过卡的最大操作频率。

注:在SD卡刚刚初始化的时候,其时钟频率SDIO_CK不能超过400KHz,否则可能无法完成初始化。在初始化以后,就可以设置时钟频率到最大了,但不可超过SD卡的最大操作时钟频率。

20.1.3 SDIO的命令与响应

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

Bit位 宽度 说明
47 1 0 起始位
46 1 1 传输位
45:40 6 - 命令索引
39:8 32 - 参数
7:1 7 - CRC7
0 1 1 结束位

所有的命令都是由STM32F1发出,其中开始位、传输位、CRC7和结束位由SDIO硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引在SDIO_CMD寄存器里面设置,命令参数则由寄存器SDIO_ARG设置。一般情况下,选中的SD卡在接收到命令之后,都会回复一个应答(但是CMD0无应答),这个应答我们称之为响应,响应也是在CMD线上串行传输的。STM32F1的SDIO控制器支持2种响应类型,48位的短响应和136位的长响应,这两种响应类型都带CRC错误检测,不带CRC的响应应该忽略CRC错误标志,如CMD1的响应。

短响应的格式如下表所示。

Bit位 宽度 说明
47 1 0 起始位
46 1 0 传输位
45:40 6 - 命令索引
39:8 32 - 参数
7:1 7 - CRC7或者1111111
0 1 1 结束位

长响应的格式如下表所示。

Bit位 宽度 说明
135 1 0 起始位
134 1 0 传输位
133:128 6 111111 保留
127:1 127 - CID或CSD(包括内部CRC7)
0 1 1 结束位

硬件为我们滤除了开始位、传输位、CRC7以及结束位等信息,对于短响应,命令索引存放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里面。对于长响应,则仅留CID/CSD位域,存放在SDIO_RESP1到SDIO_RESP4等4个寄存器。SD卡总共有5类响应(R1、R2、R3、R6、R7),这里以R1为例简单介绍一下。R1(普通响应命令)响应属于短响应,其长度为48位,R1响应的格式如下表所示。

Bit位 宽度 说明
47 1 0 起始位
46 1 1 传输位
45:40 6 X 命令索引
39:8 32 X 参数
7:1 7 X CRC7
0 1 1 结束位

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

20.1.4 数据块读操作

对于SD卡,数据是以数据块的形式传输的,我们常用的卡就是SD卡,所以不考虑MMC形式的读写操作,因为MMC卡数据以数据块或者数据流的形式传输。

从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带有CRC校验值,CRC由SDIO硬件自动处理,单个数据块读的时候,在收到1个数据块以后即可以停止了,不需要发送停止命令CMD12。但是多块数据读的时候,SD卡将一直发送数据给主机,直到接到主机发送的STOP命令CMD12。

SDIO多数据块的读操作如下图所示。

图片

20.1.5 数据块写操作

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

图片

20.2 SDIO相关寄存器

20.2.1 SDIO电源控制寄存器:SDIO_POWER

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CTRL

Bit 1~Bit 0:电源控制位

00:电源关闭,卡的时钟停止

01:保留

10:保留的上电状态

11:上电状态,卡的时钟开启

20.2.2 SDIO时钟控制寄存器:SDIO_CLKCR

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- HWFC_EN NEGEDGE WIDBUS BYPASS PWRSAV CLKEN CLKDIV

Bit 14:硬件流控制使能

0:关闭硬件流控制

1:使能硬件流控制

Bit 13:SDIO_CK相位选择位

0:在主时钟SDIOCLK的上升沿产生SDIO_CK

1:在主时钟SDIOCLK的下降沿产生SDIO_CK

Bit 12~Bit 11:宽总线模式使能位

00:默认总线模式,使用SDIO_D0

01:4位总线模式,使用SDIO_D[3:0]

10:8位总线模式,使用SDIO_D[7:0]

Bit 10:旁路时钟分频器

0:关闭旁路:驱动SDIO_CK输出信号之前,依据CLKDIV数值对SDIOCLK分频

1:使能旁路:SDIOCLK直接驱动SDIO_CK输出信号

Bit 9:省电配置位(为了省电,当总线为空闲时,设置PWRSAV位可以关闭SDIO_CK时钟输出)

0:始终输出SDIO_CK

1:仅在有总线活动时才输出SDIO_CK

Bit 8:时钟使能位

0:SDIO_CK关闭

1:SDIO_CK使能

Bit 7~Bit 0:时钟分频系数

这个域定义了输入时钟(SDIOCLK)与输出时钟(SDIO_CK)间的分频系数:SDIO_CK频率=SDIOCLK/[CLKDIV+2]

20.2.3 SDIO参数寄存器:SDIO_ARG

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
CMDARG[31:16]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CMDARG[16:0]

Bit 31~Bit 0:命令参数

属于发送到卡中命令的一部分,如果一个命令包含一个参数,必须在写命令到命令寄存器之前加载这个寄存器

20.2.4 SDIO命令响应寄存器:SDIO_RESPCMD

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
-
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- RESPCMD

Bit 5~Bit 0:响应的命令索引

只读位,包含最后收到的命令响应中的命令索引

20.2.5 SDIO相应寄存器组:SDIO_RESP1~SDIO_RESP4

寄存器 短响应 长响应
SDIO_RESP1 卡状态[31:0] 卡状态[127:96]
SDIO_RESP2 未使用 卡状态[95:64]
SDIO_RESP3 未使用 卡状态[31:0]
SDIO_RESP4 未使用 卡状态[31:0]

注:总是先收到卡状态的最高位,SDIO_RESP3寄存器的最低位始终为0。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44514

    浏览量

    632980
  • 存储器
    +关注

    关注

    38

    文章

    7452

    浏览量

    163605
  • SD卡
    +关注

    关注

    2

    文章

    560

    浏览量

    63801
  • SDIO
    +关注

    关注

    2

    文章

    72

    浏览量

    19293
收藏 人收藏

    评论

    相关推荐

    【紫光同创国产FPGA教程】【第八章】SD读写实验

    SD是现在嵌入式设备重要的存储模块,内部集成了nand flash控制器,方便了主机的的管理。本实验主要是练习对sd的扇区进行
    的头像 发表于 02-05 11:35 8279次阅读
    【紫光同创国产FPGA教程】【第八章】<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>

    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-SD读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD读写实
    的头像 发表于 05-18 09:36 1301次阅读
    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>

    arduino学习笔记18 - SD读写实验

    本次实验使用arduino驱动SD,在SD中进行文件读写。需要说明的是arduino的
    发表于 10-24 10:09

    接触式IC读写实验

    接触式IC读写实验 一. 实验目的了解接触式IC 的知识,
    发表于 09-22 17:20 4700次阅读
    接触式IC<b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>

    STM32开发板_SD学习

    资料包括《SD读写规范》和《SD接口规范》以及《SD
    发表于 06-08 17:29 15次下载

    ARM基础应用实验06_SD读写

    ARM嵌入式应用程序架构设计实例精讲--ARM基础应用实验06SD读写
    发表于 07-08 11:08 0次下载

    ARM基础应用实验_SD读写

    电子专业单片机相关知识学习教材资料——ARM基础应用实验06SD读写
    发表于 09-13 17:23 0次下载

    STM32CubeMX生成一个SD读写程序

    本文档内容介绍了一个STM32CubeMX生成一个SD读写程序,由于本程序是直接操作SD的物
    发表于 01-08 11:23 57次下载

    SD基础读写实验详解

    SD是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
    的头像 发表于 01-31 18:01 2617次阅读
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>基础<b class='flag-5'>读写实验</b>详解

    STM32入门学习笔记SD基础读写实验2

    SD是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
    的头像 发表于 02-16 15:09 1148次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>入门</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>SD</b><b class='flag-5'>卡</b>基础<b class='flag-5'>读写实验</b>2

    STM32入门学习笔记SD基础读写实验3

    SD是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
    的头像 发表于 02-16 15:09 1489次阅读

    STM32入门学习笔记SD基础读写实验4

    SD是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
    的头像 发表于 02-16 15:09 1429次阅读

    SD基础读写实验

    SD是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。
    的头像 发表于 03-01 14:46 1448次阅读
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>基础<b class='flag-5'>读写实验</b>

    浅谈STM32SD

    STM32SD
    的头像 发表于 10-19 18:28 1790次阅读
    浅谈<b class='flag-5'>STM32</b><b class='flag-5'>之</b><b class='flag-5'>SD</b><b class='flag-5'>卡</b>

    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-SD读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD读写实
    的头像 发表于 06-23 10:49 548次阅读
    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>