STM32(二十一)SDIO-SD卡读写测试

一、SDIO介绍

  

  SD卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI 接口,另外一种就是SDIO接口。

  SDIO全称是安全数字输入/输出接口多媒体卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F10x系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SD I/O卡以及CE-ATA设备进行数据传输。MMC卡可以说是SD卡的前身,现阶段已经用得很少。SDI/O卡本身不是用于存储的卡,它是指利用SDIO传输协议的一-种外设。比如Wi-Fi Card,它主要是提供Wi-Fi功能,有些Wi-Fi模块是使用串口或者SPI接口进行通信的,但Wi-FiSDIO Card是使用SDIO接口进行通信的。并且一般设计SD I/O卡是可以插入到SD的插槽。CE-ATA是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。

 

 

 

 

 

二、SD卡物理结构

 

  SD卡总共有8个寄存器,用于设定或表示SD卡信息,参考表36-1。 这些寄存器只能通过对应的命令访问,对SD卡进行控制操作并不是像操作控制器GPIO相关寄存器那样一次读写一个寄存器的,它是通过命令来控制,SDIO 定义了64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

SD卡使用9-pin 接口通信,其中3根电源线、1 根时钟线、1 根命令线和4根数据线, .
具体说明如”下:

  • CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;
  • CMD:命令控制线,SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答(响应),SD卡也是通过该线传输应答信息;
  • D0-3: 数据线,传输读写数据; SD卡可将D0拉低表示忙状态;
  • VDD、VSS1、 VSS2: 电源和地信号。

  SDIO 不管是从主机控制器向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿为有效。SD卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率FOD,最高为400kHz,另外一个是数据传输模式下时钟频率FPP,默认最高为25MHz,如果通过相关寄存器配置使SDIO工作在高速模式,此时数据传输模式最高频率为50MHz。

三、总线协议

SD总线通信是基于命令和数据传输的。通讯由一个起始位(“0”), 由一个停止位(“1”)终止。SD通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响

应(Response),如有需要会有数据(Data)传输参与。
  SD总线的基本交互是命令与响应交互,见图36-4。

 

 

 SD数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位保证数据传输成功。CRC位由SD卡系统硬件生成。STM32控制器可以控制使用单线或4线传输,本开发板设计使用4线传输。

  图36-5为主机向SD卡写入数据块操作示意。

 

 

   SD数据传输支持单块多块读写,它们分别对应不同的操作命令,多块写入还需要使用命令停止整个写入操作。数据写入前需要检测SD卡忙状态,因为SD卡在接收到数据编程到存储区过程需要一 定操作时间。SD卡忙状态通过把D0线拉低表示。数据块读操作与之类似,只是无需忙状态检测。

 四、SD卡的操作模式

  SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别模式数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_ RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。在每个操作模式下,SD卡都有几种状态,参考表36-4,通过命令控制实现卡状态的切换。

 1、卡识别过程
  • 主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围。
  • 识别SD卡类型,并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。
  • 在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下。

卡识别模式下SD卡状态转换如图36-9。

 2、数据传输过程

只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。

数据传输模式下,SD卡状态转换过程见图36-10。

 五、SDIO功能框图

  • SDIO使用两个时钟信号,一个是SDIO适配器时钟(SDIOCLK=HCLK=72MHz),另外一个是AHB总线时钟的二分频(HCLK/2,一般为36MHz)。
  • 适配器寄存器和FIFO 使用.AHB总线一侧的时钟(HCLK/2)。
  • 控制单元、命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK)。.

SDIO_ CK是SDIO 接口与SD卡用于同步的时钟信号。它使用SDIOCLK 作为SDIO_ CK的时钟来源,可以通过设置BYPASS 模式直接得到,这时SDIO CK =SDIOCLK=HCLK。若禁止BYPASS模式,可以通过配置时钟寄存器的CLKDIV位控制分频因子,即SDIO_ CK=SDIOCLK/ (2+CLKDIV) = HCLK/ (2+CLKDIV)。配置时钟时要注意,SD卡普遍要求SDIO_CK时钟频率不能超过25MHz。STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。

SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。

  

原文地址:https://www.cnblogs.com/yuanqiangfei/p/14430829.html