SDIO协议-转发

本文详细介绍了SDIO(Secure Digital Input and Output)协议的特性,包括其兼容性、数据总线模式、时钟管理及SDIO命令响应。重点讲述了STM32中SDIO的时钟控制、命令寄存器、响应寄存器和数据传输过程,强调了数据块传输的细节以及SDIO相关寄存器的配置。此外,还提及了SDIO的中断和状态寄存器在实际操作中的作用。
摘要由CSDN通过智能技术生成

点击到源链接
SDIO协议
1 概述
SDIO,全称:Secure Digital Input and Output ,即安全数字输入输出接口。
2 特点
①与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。
②与较早的多媒体卡系统规格版本全兼容(向前兼容)。
③与SD存储卡规格版本2.0全兼容。
④与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4位。
⑤完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。 8位总线模式下数据传输速率可达48MHz。
⑥数据和命令输出使能信号,用于控制外部双向驱动器。
3 SDIO框图
复位后SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置)。 如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。
​MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是MMC卡就设置为1位总线数据)。 ​

4 SDIO时钟
注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)。
卡时钟 SDIO_CK
每个时钟周期在命令和数据线上传输1位命令或数据。对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。
​​​​​​
SDIO适配器时钟 SDIOCLK
该时钟用于驱动SDIO适配器,可用于产生SDIO_CK时钟。对F1来说,SDIOCLK来自HCLK(72Mhz);对F4来说,SDIOCLK来自PLL48CK(48Mhz)。
F1:AHB总线接口时钟 HCLK/2
该时钟用于驱动SDIO的AHB总线接口,其频率为HCLK/2=36Mhz。
F4:APB2总线接口时钟 PCLK2
该时钟用于驱动SDIO的APB2总线 接口,其频率为PCLK2=84Mhz。
SDIO_CK 计算公式: SDIO_CK= SDIOCLK/(2+CLKDIV)
CLKDIV是一个分频系数
​​​​
5 SDIO命令与响应
SDIO的命令分为

应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。
SDIO所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位,SDIO命令格式如上表所示​
其中:除了命令索引和参数需要我们设置,其他都是由SDIO硬件自动控制。命令索引(如CMD0,CMD1之类)由SDIO_CMD寄存器设置,命令参数则由SDIO_ARG寄存器设置。

一般SD卡在接收到命令行,都会有一个应答(CMD0例外),这个应答我们也称之为响应。STM32的SDIO接口,支持2种响应类型:短响应(48位)和长响应(136位)。
STM32 SDIO短响应(48位)格式如下表所示:

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

6 SDIO块数据传输
SDIO与SD卡通信一般以数据块的形式进行传输,SDIO(多)数据块读操作,如下图所示:

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

SDIO(多)数据块写操作,如下图所示

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

该寄存器只有最低2位(PWRCTRL[1:0])有效,其他都是保留位,STM32复位以后,PWRCTRL=00,处于掉电状态。所以,我们首先要给SDIO上电,设置这两个位为:11。
SDIO时钟控制寄存器 SDIO_CLKCR

注意:当SDIO_CK频率过快时,可能导致SD卡通信失败,此时,建议降低SDIO_CK试试。
一般位10设置为0 禁止旁路
​​​​​​​​
SDIO参数寄存器 SDIO_ARG

该寄存器用于存储命令参数。注意:参数必须先于命令写入​​​​
SDIO命令寄存器 SDIO_CMD

低6位为命令索引,即要发送的命令索引号(如发送CMD1,其值为1,索引就设置为1)。位[7:6],用于设置等待响应位,用于指示CPSM是否需要等待,以及等待类型等。CPSM:即命令通道状态机,请参考《STM32中文参考手册》相关章节。命令通道状态机我们一般都是开启的,所以位10要设置为1。
SDIO命令响应寄存器 SDIO_RESPCMD

该寄存器只有低6位有效,比较简单,用于存储最后收到的命令响应中的命令索引。如果传输的命令响应不包含命令索引,则该寄存器的内容不可预知。
SDIO命令响应1~4寄存器 SDIO_RESPx,x=1~4

命令响应寄存器组,总共包含4个32位寄存器组成,用于存放接收到的卡响应部分的信息。如果收到短响应,则数据存放在SDIO_RESP1寄存器里面,其他三个寄存器没有用到。而如果收到长响应,则依次存放在SDIO_RESP1~SDIO_RESP4里面
SDIO数据定时器寄存器 SDIO_DTIMER

寄存器用于存储以卡总线时钟(SDIO_CK)为周期的数据超时时间,一个计数器将从SDIO_DTIMER寄存器加载数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当DPSM处在这些状态时,如果计数器减为0,则设置超时标志。DPSM:即数据通道状态机,类似CPSM,详见《STM32中文参考手册》相关章节。
注意:在写入数据控制寄存器(SDIO_DCTRL),进行数据传输之前,须先写入该寄存器(SDIO_DTIMER)和数据长度寄存器(SDIO_DLEN)!​
SDIO数据长度寄存器 SDIO_DLEN

该寄存器低25位有效,用于设置需要传输的数据字节长度。对于块数据传输,该寄存器的数值,必须是数据块长度(通过SDIO_DCTRL设置)的倍数。
即:假定数据块大小为512字节,那么SDIO_DLEN的设置,必须是512的整数倍,最大可以设置读取65535个数据块。
SDIO数据控制寄存器 SDIO_DCTRL

该寄存器,用于控制数据通道状态机(DPSM),包括数据传输使能、传输方向、传输模式、DMA使能、数据块长度等信息的设置。
我们需要根据自己的实际情况,来配置该寄存器,才可正常实现数据收发。
SDIO状态寄存器 SDIO_STA

另外,SDIO的清除中断寄存器(SDIO_ICR)和中断屏蔽寄存器(SDIO_MASK),这两个寄存器和状态寄存器(SDIO_STA)每个位的定义都相同,只是功能各有不同。请参考着学习。
状态寄存器可以用来查询SDIO控制器的当前状态,以便处理各种事务。比如SDIO_STA的位2表示命令响应超时,说明SDIO的命令响应出了问题。我们通过设置SDIO_ICR的位2则可以清除这个超时标志。
SDIO数据FIFO寄存器 SDIO_FIFO

  数据FIFO寄存器包括接收和发送FIFO,他们由一组连续的32个地址上的32个寄存器组成,CPU可以使用FIFO读写多个操作数。

​例如我们要从SD卡读数据,就必须读SDIO_FIFO寄存器,要写数据到SD卡,则要写SDIO_FIFO寄存器。SDIO将这32个地址分为16个一组,发送接收各占一半。而我们每次读写的时候,最多就是读取接收FIFO或写入发送FIFO的一半大小的数据,也就是8个字(32个字节)。
注意:操作SDIO_FIFO必须是以4字节对齐的内存操作,否则可能出错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值