基于嵌入式系统通用SD卡读写器的研究

时间:2022-03-17 04:37:06

基于嵌入式系统通用SD卡读写器的研究

【摘 要】随着电子技术的不断发展,嵌入式系统越来越多的在控制类、消费类、通讯类等电子产品广泛应用,嵌入式技术越来越和人们的生活紧密结合。作为嵌入式系统的核心部分,MCU的更新迭代速度也在摩尔定律下逐渐加快。同时SD卡作为嵌入式系统中重要的存储器件,使用范围也越发广泛。但是针对不同型号的单片机编写与SD卡的底层驱动是一件必须但却繁琐的工作。因此,本文提出通过一种设备,使得嵌入式系统连接SD卡工作时,能实现即插即用,从而省去重复开发底层驱动的工作。

【关键词】SD卡 嵌入式 数据读取

嵌入式系统技术具有非常广阔的应用前景,与此同时对于嵌入式环境的信息处理需要存储大量的数据,配合适当的存储设备显得十分的迫切,而利用SD卡进行嵌入式的数据储存已经成为一种趋势。

但是随着嵌入式领域的快速发展,每天都会有很多新型的芯片研制出来,但是如果要对每一种芯片都让它能利用SD卡进行存储,势必要对每款芯片单独开发其SD读写驱动,这实际上是一种资源的浪费和重复工作。

为了解决这个问题,本文提出了一种能集合多种芯片的软硬件平台,使得新型芯片不用再去单独开发驱动,只要连接该平台将其作为一个中转器,就能实现一些主流的功能,比如SD卡的读写,USB串口的利用等等。本文的主要工作是在研究SD卡协议的基础上,基于该平台利用SPI接口实现对SD卡的支持。

一、 硬件设计

(一)SD卡电气特性。SD卡主要包括,9针的电气接口,8个寄存器,一个SD卡控制芯片和储存介质。一般标准SD卡容量最高为2G,高速卡的容量一般为2G到32G。 SD工作电压一般为2.6V-3.3V。 普通模式下时钟频率的范围为0-25MHz,最高的传输速率为12.5MB/sec(四数据线传输模式),高速模式下时钟频率范围为0-50MHz,最高的传输速率为25MB/sec。

SD卡有两个可选的通讯协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,很多常用单片机没有集成SD卡控制器接口,同时在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前常用的单片机都集成有现成的SPI接口电路,虽然采用SPI模式速度没有优势,但对SD卡进行读写操作可大大简化硬件电路的设计。

(二)SD卡通信模式。本文基于SD卡的SPI通信模式,因此所有的电路设计都是围绕该协议进行设计。物理层的SPI是指高速同步串行口。是一种标准的四线同步双向串行总线。它具有高速的,全双工,同步的通信的特点,并且在芯片的管脚上只占用四根线,节约了芯片的管

脚,同时为PCB的布局上节省空间,提供方便。这种模式通常需要至少4根线,事实上3根也可以,它们是SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选)。

(三)嵌入式系统MCU。在嵌入式硬件设计中,一旦确定了系统功能,首先要做的就是主控芯片的选型。在考虑到满足性能,价格和功耗的基础上,同时结合本文的研究对象,所以所选芯片应具备SPI模块的MCU,二是所选MCU要具有较快的运算速度。因此这里初步选用核心芯片为STM32。

二、系统设计

本文研究初衷是使各种芯片通过该平台直接对SD卡进行操作,具体方式是通过在上位机编写程序,通过下载直接将SD驱动下载到该应用平台中,此后不同的单片机只需通过连接该平台就可以实现SD卡的读写操作。设计原理以及目的如图3所示。

图3 系统原理

对于SD卡的操作主要是应用到平台的底层接口库――interface库,该库定义了底层的大部分操作,该库调定义了很多结构,比如GPIO,SPI,IIC等,用户在编写应用或是驱动时,可以直接调用。

如:

struct interface_spi_t

{

RESULT (*init)(uint8_t index);

RESULT (*fini)(uint8_t index);

RESULT (*config)(uint8_t index, uint16_t kHz, uint8_t cpol, uint8_t cpha,

uint8_t first_bit);

RESULT (*io)(uint8_t index, uint8_t *out, uint8_t *in, uint16_t bytelen);

};

以上为SPI的结构示例,第一行是初始化;第二行是完成;第三行是设置参数分别是端口号,SPI速率,CPOL,CPHA,从高位开始还是低位开始;第四行是输入输出设置,参数分别为端口号,输出引脚,输入引脚,数据长度)

在调用接口库时要先调用DAL层和MAL层,DAL层是驱动抽象层,因此所有的驱动都要先在该层编写。MAL层是储存器抽象层,所以例如SD卡,TF卡,DataFlash等,都需要调用该层。通过调用该层实现SD卡与MCU的挂载和通信。

配置好MAL层与SPI接口后。可以正式开始对SD卡的操作。第一步是对SD卡进行初始化。由于SD卡具有多样性,因为版本不同会有操作上的差异,同时因为有SD,MMC,SDHC等一系列卡,如果操作不当,不仅得不到想要的数据回复,很可能会因电压不适用导致卡不能工作。所以在做SD卡的初始化时,需要同时针对不同类型的卡做必要的判断,根据不同卡的类型再做初始化操作。

在发送CMD0初始化SD卡时,一定要先对SD卡上电74个时钟,这个部分很重要。它的原理可以是因为SD卡的工作电压是2.7V-3.3V,但并不是SD卡接通电源就能有3.3V的电压,在发送命令之前SD卡一直处于不工作状态电压低于2.7V,所以74个时钟周期的上电,才能保持SD卡能达到其要求的工作电压。

三、 测试结果与分析

通过利用带有SD插槽的测试板与平台相连接,通过逻辑分析仪展示的波形图,可以将器件连接到上位机后逐步按流程测试SD初始化和读写步骤。实验硬件连接如图1。

图1 测试硬件连接图

命令CMD0测试

按照流程,首先应该对发送CMD0命令做测试,正确的应答应该为1.VC中的数据回复波形图如图4.4

图2 CMD0数据波形图

在图2中,第一行为使能,可以看到已经拉低,第二行为时钟,第三行为MOSI,可以看到发给SD卡的CMD为0x40,argument为0,CRC为0x95,后面的高电平为一个字节的dummy values.第四行为得到的回复,忽略第一个字节后读出数据为0001.正确应答。

命令CMD8测试

得到CMD0正确应答后,要检测电压兼容性来判断是V1还是V2版本,应此发送CMD8.VC中返回数据如图3,波形图如图8.

图3 CMD8数据返回值

可以看到程序执行语句所停处可以看出判断该卡位SD的V2版本卡。其中resp_r1为发送CMD8的应答,可以看到为正确的应答1,同时发送CMD8后从数组resp_r3to7的16位数据也为正确应答0x01AA。因此可以得出结论,该卡为SD第二版本卡,同时使用现在的电压范围。

由图4波形图可以看出,MOSI的发送命令为0x48, argument为0,CRC为0x87,由MISO的波形可以看出,得到正确的回复1.

图4 CMD8数据波形图

命令ACMD41测试

再判断为V2版本的SD卡后,要发送ACMD41命令来确定现在电压范围。在发送ACMD41之前发先发送CMD55.发送CMD55的波形图如图5.

图5 CMD55数据波形图

由该波形图可以看出,MISO得到的数据为1,应答时正确的。此后的ACMD41的应答应该为0。

经过测试和分析已经可以通过该平台实现SD卡的初始化和读写功能。但因为实验环境的限制,该平台目前之支持几种MCU。但按目前的测试结果,该平台应当可以用于现有的大部分的MCU。

四、结束语

本文提出的新型的利用USB转接线的SD卡的设计可以很好的解决嵌入式设备在多种MCU环境中的数据存储问题,极大的简化了开发的成本,提高了工作效率。本文提出的该方法可以做为需要大容量存储的嵌入式开发环境提供有价值的参考。

参考文献:

[1]SD Group and SD Card Association. SD Specifications-Physical Layer Simplified Specification(Version 2.00)[M],2006.

[2]程克非.嵌入式系统设计[M].北京,机械工业出版, 2010.

[3]陈卫东.嵌入式系统中的数据存储与交换[M]. 北京:北京邮电大学,2005.

上一篇:微博暴力的成因及对策分析 下一篇:公路运输数字化的变革