详解STM32 SDIO及配置
知晓编程 2023-06-08


SDIO,全称:Secure Digital Input and Output,即安全数字输入输出接口。它是在SD卡接口的基础上发展而来,它可以兼容之前的SD卡,并可以连接SDIO接口设备,比如:蓝牙、WIFI、照相机等。

SDIOSD卡规范间的一个重要区别是增加了低速标准。低速卡的目标应用是以最小的硬件开支支持低速I/O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接收器等应用。

STM32的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。

SDIO框图

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

如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。      

MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是MMC卡就设置为1位总线数据)

0 2 SDIO特点

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

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

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

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

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

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

0 3 SDIO时钟
  1. 卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输1位命令或数据。对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。

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

APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线接口,其频率为PCLK2=84Mhz。

SDIO_CK计算公式:SDIO_CK=SDIOCLK/(2+CLKDIV)

注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)

0 4 SDIO的命令与响应

命令

  1. SDIO的命令分为:应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。

  2. SDIO所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位,SDIO命令格式如下表所示:

其中:除了命令索引和参数需要我们设置,其他都是由SDIO硬件自动控制。命令索引(如CMD0,CMD1之类)由SDIO_CMD寄存器设置,命令参数则由SDIO_ARG寄存器设置

响应

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

  2. STM32 SDIO短响应(48位)格式如下表所示:

  1. STM32 SDIO长响应(136位)格式如下表所示

不论是短响应还是长响应,硬件都会自动滤除了起始位、传输位、CRC7以及结束位等信息,对于短响应,命令索引存放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里面。对于长响应,则仅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4个寄存器。

SD卡的响应

SD卡总共有6类响应(R1、R1b、R2、R3、R6、R7),我们这里以R1为例简单介绍一下。R1(普通响应命令)响应属于短响应,其长度为48位,如下表所示:

在收到R1响应后,我们可以从SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分别读出命令索引和卡状态信息。关于其他响应的介绍,请大家参考光盘:《SD卡2.0协议.pdf》

0 5 SDIO块数据传输

多数据块读操作

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

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

多数据块写操作

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

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

注意:当SDIO_CK频率过快时,可能导致SD卡通信失败,此时,建议降低SDIO_CK试试。

0 6 代码

STM32的SDIO控制器驱动还是很复杂的,ST提供了stm32f2x_sdio_sd.c驱动文件,我们组要修改对应的GPIO驱动即可。

/** * @brief Initializes the SD Card and put it into StandBy State (Ready for  * data transfer). * @param None * @retval None */void SD_LowLevel_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;  /* GPIOC and GPIOD Periph clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | SD_DETECT_GPIO_CLK, ENABLE);  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);  /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOC, &GPIO_InitStructure);  /* Configure PD.02 CMD line */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure);  /* Configure PC.12 pin: CLK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure);  /*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */ /*GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);*/  /* Enable the SDIO APB2 Clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);  /* Enable the DMA2 Clock */ RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);}

DMA等配置使用默认的即可。

我们需要使用的函数接口有

SD_Error SD_Init(void);SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);

下载验证


声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 硬件
  • 原理图
  • 信号完整性
  • EMI
  • 应用BK5822设计ETC OBU

      中国的公路不停车收费(ETC)系统应用市场越来越大,为了促进ETC应用的快速发展和成熟,国家相关部门开展了高速公路联网不停车收费的试点工程,比如,京津翼地区和长三角地区,所以对车载单元(OBU)的需求量也随之大幅增加。  目前市场上应用的OBU多数是通过分立元器件设计实现的,存在一致性、稳定性和可靠性的问题。博通(BEKEN)集成电路于2010年年初推出用于ETC系统的射频收发器">射频...

    09-28
  • 一种单芯片GPS接收机的硬件设计

    引言   GPS(全球定位系统)发展到今天,其用途越来越广泛,而技术的进步和用户需求也不断推动GPS系统的增强。目前美国正在致力于GPSBlockII系统的现代化和“GPS - III”计划,旨在全面改善GPS的生命力、精度、可用性、完好性、灵活性和安全性。  GPS用户端设备也处于不断升级和发展之中。从接收机的结构来看,随着VLSI(超大规模集成电路)和DSP技术的发展,单通道序贯式、时分多路复...

    09-28
  • 半刚性电缆是指什么

    半刚性电缆组件的最基本形式为由金属管构成的同轴传输线。其中,所述金属管一般为形成外导体的铜管,沿该铜管的中心线设有金属丝导体。所述中心金属丝导体由介电材料支撑...

    09-27
  • 比Wi-Fi快100倍的网络 真的靠谱吗?

    Wi-Fi 对移动计算的使用产生了巨大的影响,使员工可以在任何地方访问公司网络,咖啡店也能成为独立工作人员的办公地点。但Wi-Fi 也有其缺点,所以诞生了一个新的标准:Li-Fi,如果它可以顺利上市,

    09-26
  • 产品设计共用一款PCB一套软件,如何区分判断?

    在实际的工程项目中,有时候会碰到两款差异不大的产品,设计的时候共用一款PCB,软件也共用一套软件。这个时候,我们可以开辟一个IO口,用于侦测实际应用的是哪款产品

    09-25
  • 探究CDMA网络在MBB时代的发展趋势和应对策略,推动移动通信技术创新

    面对日新月异的移动终端和爆炸式增长的移动应用,移动互联网流量未来10年将迎来数百倍的增长。MBB洪流已然来袭,然而,它们主要来自哪里?

    09-25
  • 数字功放与模拟功放的优缺点对比:深入分析两种功放技术的特点与应用,助您选择适合的音频放大方案

     “数字功放”的基本电路是早已存在的D类放大器(国内称丁类放大器)。以前,由于价格和技术上的原因,这种放大电路只是在实验室或高价位的测试仪器中应用。这几年的技术发展使数字功放的元件集成到一两块芯片中,

    09-25
  • 基于触控屏的无线通信噪声干扰验证研究

    本文所探讨的内容虽然仅是噪声验证的其中一个例子,但我们已可以见微知着的了解到,无线通讯讯号技术的博大精深,以及干扰掌控的技术深度。所有相关厂商业者在开发时,均需透过更深入的研究、更多的技术资源与精力投

    09-25
  • 深入探讨两种常见的比例放大电路设计方案,实现精确信号放大功能

    运算放大器,它有两个输入引脚和一个输出引脚。其中两个输入引脚,一个是正相输入,一个是负相输入。正是因为运算放

    09-25
  • 优化光缆路由:降低光网络时延的关键因素分析与解决方案研究

    中国电信日前发布了《低时延光网络白皮书》,指出了四大需求低时延的业务。第一是金融和电子交易类用户;第二是基于TCP协议的高清视频类业务,包括4K/8K、视频会议、VR等实时性要求极高的大带宽业务;第三

    09-25
  • 浅析915MHz发射/接收模块电路设计

    设计为868MHz和902至928MHz 的AMR解决方案,RFMD的RF6549功能独立的Rx和Tx路径,两个连接多样性的解决方案或一个测试端口的输出端口的端口。PA的部分包括一个标称输出功率为28

    09-25
下载排行榜
更多
评测报告
更多
广告