最近做了一些STM32">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的最原始编码到咱们看到听到的模拟信号经过了这么多道的工序,想起来也只得感叹人类才智的无穷尽也。