【stm32f407】SD协议(一)-SDIO

发布者:RainbowJoy最新更新时间:2019-01-31 来源: eefocus关键字:stm32f407  SD协议  SDIO 手机看文章 扫描二维码
随时随地手机看文章

SDIO简介


1.SDIO主要功能及框图

STM32F4的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SD I/O卡和CE-ATA设备等。SDIO的主要功能如下:


1)与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。


2)与较早的多媒体卡系统规格版本全兼容(向前兼容)。


3)与SD存储卡规格版本2.0全兼容。


4)与SD I/O卡规格版本2.0全兼容:支持良种不同的数据总线模式:1位(默认)和4位。


5)完全支持CE-ATA功能(与CE-ATA数字协议版本1.1全兼容)。  8位总线模式下数据传输速率可达48MHz(分频器旁路时)。


6)数据和命令输出使能信号,用于控制外部双向驱动器。


STM32F4的SDIO控制器包含2个部分:SDIO适配器模块和APB2总线接口,其功能框图如图所示

复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置)。


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


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


SDIO_CMD有两种操作模式:


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


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


2.      SDIO的时钟

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


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


2) SDIO适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,来自PLL48CK,一般为48Mhz,并用于产生SDIO_CK时钟。


3) APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线接口,其频率为HCLK/2,一般为84Mhz。


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


SDIO_CK=SDIOCLK/(2+CLKDIV)


其中,SDIOCLK为PLL48CK,一般是48Mhz,而CLKDIV则是分配系数,可以通过SDIO的SDIO_CLKCR寄存器进行设置(确保SDIO_CK不超过卡的最大操作频率)。注意,以上公式,是时钟分频器不旁路时的计算公式,当时钟分频器旁路时,SDIO_CK直接等于SDIOCLK。


这里要提醒大家,在SD卡刚刚初始化的时候,其时钟频率(SDIO_CK)是不能超过400Khz的,否则可能无法完成初始化。在初始化以后,就可以设置时钟频率到最大了(但不可超过SD卡的最大操作时钟频率)。


3.      SDIO的命令与响应

SDIO的命令分为应用相关命 令(ACMD)和 通 用 命 令(CMD)两部分,应用相关命令(ACMD)的发送,必须先发送通用命令(CMD55),然后才能发送应用相关命令(ACMD)。


SDIO的所有命令和响应都是通过SDIO_CMD引脚传输的,任何命令的长度都是固定为48位,SDIO的命令格式如图所示:

所有的命令都是由STM32F4发出,其中开始位、传输位、CRC7和结束位由SDIO硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引(如CMD0,CMD1之类的)在SDIO_CMD寄存器里面设置,命令参数则由寄存器SDIO_ARG设置。


一般情况下,选中的SD卡在接收到命令之后,都会回复一个应答(注意CMD0是无应答的),这个应答我们称之为响应,响应也是在CMD线上串行传输的。STM32F4的SDIO控制器支持2种响应类型,即:短响应(48位)和长响应(136位),这两种响应类型都带CRC错误检测(注意不带CRC的响应应该忽略CRC错误标志,如CMD1的响应)。


短响应的格式如表所示

长响应的格式如图所示:

同样,硬件为我们滤除了开始位、传输位、CRC7以及结束位等信息,对于短响应,命令索引存放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里面。对于长响应,则仅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4个寄存器。


SD存储卡总共有5类响应(R1、R2、R3、R6、R7),我们这里以R1为例简单介绍一下。


R1(普通响应命令)响应输入短响应,其长度为48位,R1响应的格式如图所示:


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


最后,我们看看数据在SDIO控制器与SD卡之间的传输。对于SDI/SDIO存储器,数据是以数据块的形式传输的,而对于MMC卡,数据是以数据块或者数据流的形式传输。本节我们只考虑数据块形式的数据传输。


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

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


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


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


4.SDIO相关寄存器介绍

第一个,我们来看SDIO电源控制寄存器(SDIO_POWER),该寄存器定义如图所示:

该寄存器复位值为0,所以SDIO的电源是关闭的,我们要启用SDIO,第一步就是要设置该寄存器最低2个位均为1,让SDIO上电,开启卡时钟。


第二个,我们看SDIO时钟控制寄存器(SDIO_CLKCR),该寄存器主要用于设置SDIO_CK的分配系数,开关等,并可以设置SDIO的数据位宽,该寄存器的定义如图所示


上图仅列出了部分我们要用到的位设置,WIDBUS用于设置SDIO总线位宽,正常使用的时候,设置为1,即4位宽度。BYPASS用于设置分频器是否旁路,我们一般要使用分频器,所以这里设置为0,禁止旁路。CLKEN则用于设置是否使能SDIO_CK,我们设置为1。最后,CLKDIV,则用于控制SDIO_CK的分频,一般设置为0,即可得到24Mhz的SDIO_CK频率。


第三个,我们要介绍的是SDIO参数制寄存器(SDIO_ARG),该寄存器比较简单,就是一个32位寄存器,用于存储命令参数,不过需要注意的是,必须在写命令之前先写这个参数寄存器!


第四个,我们要介绍的是SDIO命令响应寄存器(SDIO_RESPCMD),该寄存器为32位,但只有低6位有效,比较简单,用于存储最后收到的命令响应中的命令索引。如果传输的命令响应不包含命令索引,则该寄存器的内容不可预知。


第五个,我们要介绍的是SDIO响应寄存器组(SDIO_RESP1~SDIO_RESP4),该寄存器组总共由4个32位寄存器组成,用于存放接收到的卡响应部分信息。如果收到短响应,则数据存放在SDIO_RESP1寄存器里面,其他三个寄存器没有用到。而如果收到长响应,则依次存放在


SDIO_RESP1~ SDIO_RESP4里面,如表所示:


第七个,我们介绍SDIO命令寄存器(SDIO_CMD),该寄存器各位定义如图43.1.4.3所示:

图中只列出了部分位的描述,其中低6位为命令索引,也就是我们要发送的命令索引号(比如发送CMD1,其值为1,索引就设置为1)。位[7:6],用于设置等待响应位,用于指示CPSM是否需要等待,以及等待类型等。这里的CPSM,即命令通道状态机。


第八个,我们要介绍的是SDIO数据定时器寄存器(SDIO_DTIMER),该寄存器用于存储以卡总线时钟(SDIO_CK)为周期的数据超时时间,一个计数器将从SDIO_DTIMER寄存器加载数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当DPSM处在这些状态时,如果计数器减为0,则设置超时标志。这里的DPSM,即数据通道状态机,类似CPSM。注意:在写入数据控制寄存器,


进行数据传输之前,必须先写入该寄存器(SDIO_DTIMER)和数据长度寄存器(SDIO_DLEN)!


第九个,我们要介绍的是SDIO数据长度寄存器(SDIO_DLEN),该寄存器低25位有效,用于设置需要传输的数据字节长度。对于块数据传输,该寄存器的数值,必须是数据块长度(通过SDIO_DCTRL设置)的倍数。


第十个,我们要介绍的是SDIO数据控制寄存器(SDIO_DCTRL),该寄存器各位定义如图所示:

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


接下来,我们介绍几个位定义十分类似的寄存器,他们是:状态寄存器(SDIO_STA)、清除中断寄存器(SDIO_ICR)和中断屏蔽寄存器(SDIO_MASK),这三个寄存器每个位的定义都相同,只是功能各有不同。所以可以一起介绍,以状态寄存器(SDIO_STA)为例,该寄存器各位定义如图所示:

状态寄存器可以用来查询SDIO控制器的当前状态,以便处理各种事务。比如SDIO_STA的位2表示命令响应超时,说明SDIO的命令响应出了问题。我们通过设置SDIO_ICR的位2则可以清除这个超时标志,而设置SDIO_MASK的位2,则可以开启命令响应超时中断,设置为0关闭。其他位我们就不一一介绍了,请大家自行学习。


最后,我们向大家介绍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字节对齐的内存进行操作,否则将导致出错!


至此,SDIO的相关寄存器介绍,我们就介绍完了。还有几个不常用的寄存器,我们没有介绍

关键字:stm32f407  SD协议  SDIO 引用地址:【stm32f407】SD协议(一)-SDIO

上一篇:【stm32f407】SD协议(二)-SD卡
下一篇:【stm32f407】基于SRAM的内存管理

推荐阅读最新更新时间:2024-03-16 16:23

关于stm32f407 串口程序编写过程 总结
一.背景介绍 17/07毕业,通过完成试用期的几个小项目,感觉自己能独立的完成部分项目,便接手了配合硬件工程师,将公司模块升级的任务(M3-- M4) 目标: 1.bootloader更改 2.将rt_thread 系统移植到 stm32f407板子上 3.将485,can , gsm ,以太网 驱动接口补上 4.重新设计程序收发流程,完成实时收发数据 (数据字典,wwdg , 校验设计,对上,对下的协议修改等等 ,这些已在之前完成,只要调用响应接口,调试下即可) 二.目标实现 目标1.bootloader更改 通过学
[单片机]
关于<font color='red'>stm32f407</font> 串口程序编写过程 总结
stm32f407之窗口看门狗使用流程
1.初始化 1.声明中断变量 NVIC_InitTypeDef NVIC_InitStructure; 2.打开WWDG时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); 3.设置预分频器分频 WWDG_SetPrescaler(fprer); 4.设置窗口值 WWDG_SetWindowValue(wr); 5.喂狗 WWDG_SetCounter(WWDG_CNT); 6.中断配置 NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; NVIC_InitStructure.NVIC_
[单片机]
<font color='red'>stm32f407</font>之窗口看门狗使用流程
分享关于stm32f407定时器时钟频率的问题
上午想要用Timer10做相对精确的延时功能,但是用示波器发现实际延时数值总是只有一半,百思不得其解。 仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做一个总结: 从时钟树中我们可以得知(时钟树的图片可以直接参考6楼,感谢6楼xkwy补上的图): (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知,当APB1和APB2分频数为1的时候,TIM1、
[单片机]
STM32F407上移植emwin
环境: 主机:WIN8 开发环境:MDK5.13 emwin版本:STemWinLibrary522 mcu: stm32f407VGT6 开发板:安富莱STM32-X3 TFT型号:艾蓝2.8寸TFT,主控芯片:ILI9325 说明: 在STM32F407上移植emwin,驱动屏幕接口为FSMC 移植步骤: 1.MDK新建文件结构: 2.GUIConf.c文件修改 a)增加宏定义: #define GUI_NUMBYTES (1024 * 80) #define GUI_BLOCKSIZE 0x80 b)GUI_X_Config(void)函数中增加语句: GUI_ALLOC_S
[单片机]
<font color='red'>STM32F407</font>上移植emwin
STM32L4新版HAL库SDIO(DMA)、FatFs使用教程(四)
添加FreeRtos支持。 FreeRtos中使用FATFS是强制要求使用DMA模式的SDIO驱动。步骤如下: 1、打开工程配置文件,添加FreeRtos支持 2、配置参数 发现configuration选项卡SDMMC1报错,信息如下,意思是中断优先级问题。 打开NVIC配置界面,修改中断优先级,注意,DMA优先级要比SD中断优先级低。 打开FREERTOS选项,如图所示适当配置任务堆栈大小,这里为了测试方便,放到Start Task中测试,正式使用时,不要放在这里,要新建任务。文件操作所在的任务需要适当加大堆栈。 3、生成代码,打开工程,将main函数中的Fatfs_RW_test();语句剪切,粘贴到
[单片机]
STM32L4新版HAL库<font color='red'>SDIO</font>(DMA)、FatFs使用教程(四)
STM32F407之模拟I2C(二)之24C128
模拟I2C测试24C128的读写 #define GPIO_PORT_I2C GPIOH/* GPIO端口 */ #define I2C_SCL_PIN GPIO_Pin_4/* 连接到SCL时钟线的GPIO */ #define I2C_SDA_PIN GPIO_Pin_5/* 连接到SDA数据线的GPIO */ /* 定义读写SCL和SDA的宏 */ #define I2C_SCL_1() GPIO_PORT_I2C- BSRRL = I2C_SCL_PIN/* SCL = 1 */ #define I2C_SCL_0() GPIO_PORT_I2C- BSRRH = I2C_SCL_PIN/* SCL = 0 */ #de
[单片机]
stm32f407串口通信使用流程
初始化 1.定义初始化变量 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; 2.使能时钟 GPIO开启AHB1时钟 USART1开启APB2时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 3.配置GPIO端口为引脚复用USA
[单片机]
STM32F407驱动MT9T001 CMOS图像传感器模块
一、MT9T001图像传感器介绍 MT9T001是MICRON公司生产的一款CMOS图像传感器,分辨率可以达到QXGA,有效像素阵列为2048H*1536V。可实现片上开窗,行列跳跃像素,以及快照功能,内部寄存器编程采用I2C总线。 MT9T001可以工作在其默认模式或者通过编程可以选择帧的大小,曝光时间,色彩增益,以及其他相关参数。默认的工作模式是以12fps的帧率输出一个QXGA的图像,片载的AD转换器可以提供每个像素10bit的分辨率。可提供行场同步信号,以及用于同步有效数据的像素时钟。 MT9T001的像素阵列为2112行*1568列,但是并不是所有的像素是有效像素。如图3所示,从第0列到27列以及从2085列到
[单片机]
<font color='red'>STM32F407</font>驱动MT9T001 CMOS图像传感器模块
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved