历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2021年04月22日 | STM32与SD卡通信分层思考

2021-04-22 来源:eefocus

简介:最近做了一些STM32和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。


我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。下面一一来介绍各层的一些重要的操作。


1)驱动层


驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的.c/.h文件。对于SDIO外设来说,它就是用来操作寄存器的,由于涉及ST库函数的编写,没能力参透,在此不赘述它的实现过程。


2)物理层


这一层可以说是承上启下的一层,下接驱动层,用于操作寄存器,上接文件系统层,用于统一管理文件,可谓整个SD驱动的核心代码。其实,如果对于SD的要求不高,可以直接在这一层上面进行文件操作,只是没有文件系统操作起来实在不便。之所以叫物理层是因为这一部分的代码主要参考了“SD卡物理层简化协议”这样一个东西。这个协议规定了控制器对SD卡操作的各种指令的格式和操作时序。这一层对应了源代码中的sdio_sdcard.c/.h这两个文件,那么它主要实现了什么功能呢?这一层最重要的一个函数就是SD_Init()——SD卡的初始化函数。这函数包括了SD卡的上电、识别、卡初始这三个重要步骤,分别对应两个子函数——SD_PowerOn、SD_InitializeCards(),而SD_InitializeCards()的返回值包含了卡的类型信息。这两个子函数的实现则是通过STM32内置的SDIO控制器发送CMD命令完成,这个命令的发送要严格遵守SD协议的流程图,而且要及时进行标志位判断,否则很容易程序跑飞了。发送CMD命令是通过填写SDIO_CmdInitStructure这个结构体完成的。举个例子:


SDIO_CmdInitStructure.SDIO_Argument = 0x00;


SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;


SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;


SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;


SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;


这个结构体包含了五个参数,从上至下分别控制的是:参数、命令索引、响应格式、是否等待、硬件流控制。填写了五个结构体也就也就配置好了一个CMD命令格式,使用SDIO_SendCommand()函数发送命令即可。当然,这一层还包含了一些其他外设的初始化——NVIC(配置中断向量优先级)、GPIO(配置了SD插槽的IO口)、DMA(使用DMA模式传输)。总结一下这部分就是主机(STM32)用CMD命令控制了SD卡,所以说在这一层上就已经可以直接调用函数来进行初始化、读写操作了。那么为什么又会有文件系统层呢?


3)文件系统层


它的存在就是用来管理文件的。一个SD卡,现在普通的8个G,要是直接使用物理层来操作,就要操作人来记住好多文件的地址、长度等等,这些事情本来就是计算机可以完成的,所以人们就发明了文件系统这么个东西,用来管理大容量储存设备,在文件系统之上来进行操作,整个格局就显得很大了,也更高端大气上档次,否则调用个文件就要写个地址,什么0x20000f54之类的,用的人不得疯了。说了这么多,文件系统的作用就是一个管理层,下接SD的物理层,用来发送各种CMD操作SDIO控制器的寄存器,上承应用函数,封装好了由开发人员自由调用,可以说也是承上启下的关键代码。而且很幸运的是已经有人替你写好了这个代码的绝大部分,你只需要进行适量的修改就能为你所用,搭建起一个文件系统来。FATFS就是在一个很遥远的地方的好心人已经替你写好的东西,这东西通用性很强,与驱动层完全脱离,留下了一些接口函数,往哪个平台上移植,就填写相应的接口函数即可。这个接口连接了SD卡的物理层和文件系统的操作函数。这一层对应的ff.c/.h文件由于也是很遥远的大神编写的,参透不能。故在此不讲怎么实现。


4)应用层


这一层应该是硬件开发人员发挥的一层,因为对应的平台不同,这一层的接口函数填写就完全不同。应用层就是由上一层(文件系统层)留下的各种接口构成,我们填写了接口函数,就可以直接跑文件系统了。怎么写接口函数呢?FATFS在留接口时除了留下了函数名,还留下了参数以及参数对应的功能和格式。帮助文件中有对应接口函数要实现的功能,其实不用查帮助文件通过接口函数的名字也能猜到,比如disk_read就是读盘。这个接口函数要实现读盘功能,就得调用在物理层写下的各种函数,如SD_ReadBlock(),只要注意子函数与母函数调用参数要一致就行,这个一致性就需要开发人员充分理解函数参数功能了。这部分代码很少,编写起来也不是很难,就是要注意记得判断标志位。


至此,SD的操作函数就已经被封装好了,只需要查询FATFS中各种操作函数的功能既可以调用它。


SD驱动还有很多问题没有搞清楚,之前只是对着源码单步调试,看了看功能实现过程,接下来就准备动手移植文件系统试试了,希望能成功。SD驱动做起来还是很有意思的,通过它与其他外设,比如MP3模块或液晶屏模块连接可以实现歌曲播放和图片显示,还是颇有成就感。以前在用电子产品的时候没想到想听首歌看张图这么复杂,从0101的最原始编码到我们看到听到的模拟信号经过了这么多道的工序,想起来也只得感叹人类智慧的无穷尽也。


推荐阅读

史海拾趣

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
安装在门窗、围墙等处,提高家庭安防水平。
静芯微电子(ElecSuper)公司的发展小趣事

静芯微电子在发展过程中,持续投入研发资源,不断推动技术创新。公司成功研发出芯片级TVS器件,并在国内首次开发成功在人体模型(HBM)下抗静电强度高于30KV的关键技术和器件。这一技术突破不仅提升了产品的性能,还进一步巩固了静芯微电子在ESD/TVS领域的领先地位。同时,公司还积极申请和积累专利,目前已拥有多项发明专利、实用新型专利和集成电路布图登记等知识产权成果。

amcc [applied micro circuits corp]公司的发展小趣事

作为一家有远见的企业,静芯微电子不仅关注自身的发展,还积极履行社会责任。公司积极参与环保公益活动和社会责任项目,致力于推动电子行业的可持续发展。同时,静芯微电子还注重员工的培训和发展,为员工提供良好的工作环境和晋升机会。这些举措不仅增强了企业的凝聚力和向心力,也为企业的长期发展奠定了坚实的基础。

Everbuild公司的发展小趣事

随着全球对环保和可持续发展的重视,Everbuild也将绿色环保理念融入到产品设计和生产过程中。公司采用环保材料和节能技术,减少生产过程中的污染和能源消耗。同时,Everbuild还积极参与环保公益活动,倡导绿色生活方式。这些举措不仅提高了公司的社会责任感,也为公司的可持续发展奠定了基础。

FLEX LTD公司的发展小趣事

为了进一步扩大市场份额,Everbuild开始积极拓展国际市场。公司派遣专业的团队参加国际电子产品展览会,与国际知名厂商进行技术交流和合作。同时,Everbuild还针对不同国家和地区的市场需求,推出了定制化的电子产品解决方案。这些努力使Everbuild的产品逐渐进入国际市场,并赢得了越来越多客户的信任和支持。

Arcolectric公司的发展小趣事

随着技术的不断进步和市场需求的日益多样化,Arcolectric开始积极拓展其产品线,并逐渐将产品应用于电脑、电源设备及家用电器等多个领域。公司通过不断创新和研发,成功推出了一系列符合市场需求的新产品,进一步扩大了市场份额。

问答坊 | AI 解惑

FPGA LED

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 FPGA 与fpga很有价值的27  …

查看全部问答>

智能卡优胜的地方

与传统的数据传输设备相比, 智能卡具有更高的安全性, 更为方便, 并带来了更大的经济效益。另外, 基于智能卡的系统还具有高度的可调整性, 以适应不同人、不同会员卡制作公司的需要。智能卡的具体优点为:1)包括的加密和验证技术满足了发行者和用户 ...…

查看全部问答>

WINCE6.0+VS2005 如何导出 EVC可用的SDK?

如题, WINCE6.0+VS2005  如何导出 for EVC 的SDK, 我到处发现安装只能是VS2005和VS2008 可用, evc看不到这个sdk选项, 而PB5.0 导出的SDK, evc可用。…

查看全部问答>

wince下如何使用看门狗

三星2440的板子,wince5.0, 现在想加个看门狗,具体如何实现呢?是写个流驱动吗,加个中断,定时中断,定时喂狗,如果长时间没有喂狗,系统重启,请问重启的代码加在哪里,哪位高手给个详细的思路,多谢了…

查看全部问答>

CE下面gdi的上限是多少

CE下面gdi的上限是多少…

查看全部问答>

cary334002同学 请不要恶意灌水行么

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 如题~~~~~~~~~~~ 刷了一整页的帖子让别人怎么办,强烈鄙视这种不负责任的自私行为!!  …

查看全部问答>

RT-Thread在富士通Cortex M3 Easy Kit开发板上的移植

1、安装IAR Embedded Workbench® for ARM,这次我用的是最新从IAR官网下载的使用EWARM-EV-CD-6307.exe2、安装万利电子的驱动(支持IAR EWARM 6.30),安装完成后重启电脑。http://www.manley.com.cn/web/down.a ...…

查看全部问答>

串口接收消息并返回

最近实验PC通过串口与单片机通信,要求如下代码开头所说,但是通信过程中在按键的同时lcd与PC的串口助手同时出现了多余信息,请高手指教。 另外,我想在单片机接收到8个字符后自动发送8个字符,请问程序能如何设计呢?/************************ ...…

查看全部问答>

【你问我答】发了一笔2-3K的横财,只充许买一样东东,雕刻机或者3D打印机,二先一...

【你问我答】发了一笔2-3K的横财,只充许买一样东东,雕刻机或者3D打印机,二先一,你选哪?…

查看全部问答>

影响100G系统功耗的几个关键因素

1. 能耗是100G规模商用的核心问题   根据国际能源机构(IEA)2008年的统计,从1973年到2006年,全球能源消耗上升73%,C02排放增长了79%,能源的消耗导致了温室效应和一系列的自然灾害。为了企业的可持续发展,主流运营商、设备商先后启动节能减 ...…

查看全部问答>