STM32F407之SD卡读数据介绍

文章介绍了SD卡的基础知识,包括传输方式、内部结构和关键概念。STM32通过SDIO接口与SD卡交互,初始化涉及NVIC、SDIO及相关GPIO的配置。读操作分为单块和多块,重点讲述了单块读取的步骤,包括数据传输配置和中断处理。
摘要由CSDN通过智能技术生成

1,SD卡基础知识

SD卡(Secure Digital Memory Card)即:安全数字存储卡,它是在MMC的基础上发展而来,作为存储器件广泛应用于电子产品中。

1.1  SD卡有SDIO和SPI两种传输方式,具体信号定义如下:

其中红色选中的信号是必需的。

1.2   SD卡的内部结构

1.3  SD中的两个重要概念: Sector与Block

 

Sector:  A number of blocks, basic erase unit (SD擦除单位)

可以设置为N*block。

Block :   A number of bytes, basic data transfer unit (SD中最小的读写单位)。

block length 可以被 SET_BLOCKLEN (CMD16)设置 。

1.4 SD 常用命令

Class0 :(卡的识别、初始化等基本命令集)

CMD0:复位SD 卡.

CMD1:读OCR寄存器.

CMD9:读CSD寄存器.

CMD10:读CID寄存器.

CMD12:停止读多块时的数据传输

CMD13:读 Card_Status 寄存器

Class2 (读卡命令集):

CMD16:设置块的长度

CMD17:读单块.

CMD18:读多块,直至主机发送CMD12为止 . 

Class4(写卡命令集) :

CMD24:写单块.

CMD25:写多块.

CMD27:写CSD寄存器 .

Class5 (擦除卡命令集):

CMD32:设置擦除块的起始地址.

CMD33:设置擦除块的终止地址.

CMD38: 擦除所选择的块.

2,STM32读取SD流程

STM32的SDIO接口提供 APB2 外设总线与多媒体卡 (MMC)、SD 卡、SDIO 卡以及 CE-ATA 设备之间的接口。

2.1 时钟

三个时钟信号:卡时钟SDIO_CK(传输速率0-25MHZ)、SDIO适配器时钟SDIOCLK(用于驱动适配器来产生卡时钟,与所挂载的总线时钟相同)、总线时钟PCLK2(F1为HCLK2)

   SDIO_CK计算公式:SDIO_CK=SDIOCLK/(2+CLKp)   CLKp为可配置的分频系数,在初始化时不可以超过400khz ,初始化完成后可全速运行。

2.2 操作流程

A, 初始化相关 GPIO 及 SDIO 外设;

B, 配置 SDIO 基本通信环境进入卡识别模式,通过几个命令处理后得到卡类型;

C,  如果是可用卡就进入数据传输模式,接下来就可以进行读、写、擦除的操作。

2.3  SD 卡初始化

SD 卡初始化过程主要是卡识别和相关 SD 卡状态获取。整个初始化函数流程如下:

具体执行流程如下:

 

(1) 配置 NVIC,SD 卡通信用到 SDIO 中断,如果用到 DMA 传输还需要配置 DMA 中 断。注意中断服务函数不是定义在 stm32f4xx_it.c 文件的,是直接定义在 bsp_sdio_sd.c 文件中,中断服务函数定义在个文件问题都不大,只要定义正确就 可以的,编译器会自动寻找。 (2) 执行 SD_LowLevel_Init 函数,其功能是对底层 SDIO 引脚进行初始化以及开启相 关时钟,该函数在之前已经讲解。

(3) SDIO_DeInit 函数用于解除初始化 SDIO 接口,它只是简单调用 SD_LowLevel_DeInit 函数。而 SD_LowLevel_DeInit 函数是与 SD_LowLevel_Init 函数相反功能,关闭相关时钟,关闭 SDIO 电源,让 SDIO 接近上电复位状态。 恢复复位状态后再进行相关配置,可以防止部分没有配置的参数采用非默认值而 导致错误,这是 ST 官方驱动常用的一种初始化方式。 

(4) 调用 SD_PowerON 函数,它用于查询卡的工作电压和时钟控制配置,并返回 SD_Error 类型错误。

2.4 SD卡读操作

从 SD 卡读取数据可分为单块读取和多块读取。这里介绍单块读操作流程。

SD_ReadBlock 函数执行流程如下: 

(1) 将 SDIO 外设的数据控制寄存器 (SDIO_DCTRL)清理,复位之前的传输设置。 

(2) 调用 SDIO_ITConfig 函数使能相关中断,包括数据 CRC 失败中断、数据超时中断、数 据结束中断等等。然后调用 SD_LowLevel_DMA_RxConfig 函数,配置使能 SDIO 从 SD 卡的读取数据的 DMA 请求。为使 SDIO 发送 DMA 请求,需要调用 SDIO_DMACmd 函数使能。对于高容量的 SD 卡要求块大小必 须为 512 字节,程序员有责任保证目标读取地址与块大小的字节对齐问题。 

(3) 对 SD 卡进行数据读写之前,都必须发送 CMD16 指定块的大小,对于标准卡,读取 BlockSize 长度字节的块;对于 SDHC 卡,读取 512 字节的块。 

(4) 利用 SDIO_DataInitTypeDef 结构体类型变量配置数据传输的超时、块数量、数据块大 小、数据传输方向等参数并使用 SDIO_DataConfig 函数完成数据传输环境配置。 

(5) 最后控制器向 SD 卡发送单块读数据命令 CMD17,SD 卡在接收到命令后就会通过数据线把数据传输到控制器数据 FIFO 内,并自动生成 DMA 传输请求。

(6)SD_WaitReadOperation 函数用于等待数据读取操作完成,只有在确保数据读取完成了,我们就可以放心使用数据。

对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407是一款高性能的ARM Cortex-M4微控制器,具备丰富的外设资源,包括用于SD卡通信的SDIO接口。以下是关于如何在STM32F407上编程实现SD卡写操作的简要步骤: 1. 初始化SDIO接口:首先,需要将SDIO接口初始化为SD模式。可以配置引脚和时钟,并设置相应的寄存器来启用SDIO接口。 2. 初始化SD卡:在进行SD卡写操作之前,需要对SD卡进行初始化。可以发送命令来进行SD卡的初始化,例如发送CMD0命令来复位SD卡。 3. 发送命令:使用SDIO接口向SD卡发送写命令。可以使用SDIO发送命令的功能来发送指定的命令,例如CMD24表示写单个块。 4. 准备数据:将要写入的数据加载到缓冲区中,准备发送。 5. 发送数据:使用SDIO接口向SD卡发送数据。可以使用SDIO发送数据的功能来将数据发送到SD卡中。 6. 等待完成:等待数据传输的完成,确认数据传输成功。可以轮询相应的寄存器来检查传输是否完成。 7. 关闭SD卡:在完成写操作后,可以发送命令来关闭SD卡,并释放相关资源。 需要注意的是,SD卡写操作的具体实现可能会因不同的SD卡厂商而有所不同。可以参考STM32F407的相关文档和SD卡的规格说明,以确保正确地进行SD卡写操作。 这只是一个简要的概述,实际的编程细节可能更为复杂。对于初学者来说,建议参考STM32F407的开发文档和相应的示例代码,以及SD卡厂商提供的资料,来详细了解和实现SD卡写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值