当前位置:首页 > EDA > 电子设计自动化
[导读]摘要:传统嵌入式设备对SD卡的读取一般基于硬件层面,这么做省资源但是换来的是时序麻烦,移植困难,读取文件不灵活。针时资源较为丰富的嵌入式方案,利用SoPC技术和灵活的NIOSⅡ软核,提出了一种在SD卡上建立了FAT3

摘要:传统嵌入式设备对SD卡的读取一般基于硬件层面,这么做省资源但是换来的是时序麻烦,移植困难,读取文件不灵活。针时资源较为丰富的嵌入式方案,利用SoPC技术和灵活的NIOSⅡ软核,提出了一种在SD卡上建立了FAT32文件系统的方法,实现了对文件的基本操作如新建、读取、删除等,并在SD卡根目录里放置测试文档。对NIOSⅡ的代码实现进行测试,结果表明NIOSⅡ顺利地读出了文档里的内容,以及根目录其他文件夹。测试实验在Terasic的DE2系列开发板上通过验证。该方案方便了开发者对不同嵌入式设备进行移植,使其更加专注于顶层操作。
关键词:FPGA;SoPC;NIOSⅡ;SD卡;FAT

    SD卡中的数据是以块为单位进行存储的,如果在硬件层面对其进行操作,则不仅要非常了解SD卡的数据存储结构,还要对FAT系统有深刻的理解,然后用复杂的时序状态机对其扇区进行初始化和读取控制,对硬件直接进行操作可以节省FPGA资源。为了更有效地组织和管理SD卡中的数据,必须采用文件的格式进行组织数据,这就要求在SD卡中内嵌文件系统。而随着FPGA的高速发展,以Altera NIOSⅡ和Xilinx的Mic ro Blaze为代表的软核处理器以其高可定制性、与ARM相比相同价格下的高性能得到广泛的应用。本文正是利用其丰富的外设和接口定制构建SD卡的FAT文件系统。

1 接口和控制器的设计
1.1 接口的配置
   
SD卡有SD模式和SPI模式2种,SPI是一种高速、同步、全双工的通信总线,只占用4根信号线,节约芯片的管脚,有利于PCB的布局。前者速度较快,后者比较方便我们采用后者SPI与FPGA进行通信,它由4个信号组成,分别是CS(片选信号)、MOSI(主机到SD卡)、MISO(SD卡到主机)、SCLK(主机和SD卡的同步时钟),以主从方式工作,本文中SPI为主机,SD卡是从机,处于单主单从模式。在由NIOSⅡ软核处理器控制的Avalon总线下可以方便地与SD卡进行对接。Avalon总线是一种将片上处理器和外设连接成片上可编程(SoPC)的一种简单总线结构,它规定了主从设备之间的结构方式及其通信方式,通过使用SoPCBuilder可以很方便地将自定义外设和其他组件组合起来,生成按照组件例化的系统模块,并自动生成内部总线逻辑,自动完成外设和存储器的地址映射、中断控制和总线控制。图1所示为设备之间的连接示意图,NIOSⅡ处理器和外设SD卡控制器的通过Avalon总线结构进行数据交换和沟通,SD卡控制器控制着外部SD卡存储介质。


1.2 控制器的设计
   
SD卡控制器是FPGA和SD卡之间进行通信的翻译官,主要实现3大功能:
    (1)复位和初始化SD卡。控制器按照SD卡总线协议产生控制时序对其进行复位和初始化。
    (2)读写SD卡。控制器通过CMD线发送读或者写的命令以及SD卡扇区地址,确认收到正确的响应后,通过DAT线进行读和写操作(分别涉及串并转换和并串转换),一次传输一个扇区的数据(512 B),传输完毕后将就绪信号置为有效。
    (3)设置SD卡。通过CMD线发送命令和参数,不发送或接受数据。
1.3 SoPC中的硬件搭建
    SoPC(System on a Programmable Chip),即可编程片上系统,用可编程逻辑把整个系统放到一块硅片上,是一种特殊的嵌入式系统,可以编程的片上系统(SOC)。
    借助于Altera SoPC方便的组件定制、硬件组装和它的灵活的设计方式,不用一个个亲自用硬件语言去实现各个组件,只需要在SoPC里定制,最后结果如图2所示,因为SD卡的工作频率最高为25 MHz,与FPGA自身的时钟频率不一定一样,所以要加上clock_crossing用于协调2个不同的时钟域。onchip_memory是片内存储器,用于储存程序运行的代码或者堆栈之类的变量。timer和sysid用来协调这些组件良好运作,例如SoPC Builder会使用System ID为每个系统提供识别符号,NIOSⅡEDS可以用此防止使用者烧录与硬件信息不符合的sof文件。Timer是内部时钟定时。如果丢失这两个组件,会导致最后的软件运行出现错误。其中sd_wp_n是SD卡写保护信号线,由于默认激活SD卡所以片选信号没加。altpll是锁相环,用来调节稳定所需的时钟信号,DE2系列的开发板上都有1到2个锁相环。jtag_uart用来调试、打印数据到控制台,验证读取写入的数据是否相同。



2 驱动程序的设计
   
SD卡处于SPI模式的驱动主要包含有:
    (1)SPI底层的操作,SPI的命令和数据块都是以8个比特为单位进行分组和发送的。
    (2)关于CMD的操作,主要有SD卡的初始化以及SD卡的读写,先发送命令然后再发送CRC校验。
    (3)CRC校验使用NIOSⅡ来解决这个问题:NIOSⅡ软件架构建立在硬件抽象层HAL(Hardware Abstraction Layer)之上,HAL为NIOS软件开发者提供了编程接口、底层的设备驱动、HAL API、和C标准库等资源,表1为系统整体的架构示意。


    HAL的系统库为NIOSⅡ软件设计人员提供了应用程序与底层硬件交互的设备驱动接口,简化了应用程序的开发。HAL系统库也为应用程序与底层硬件驱动划分了一条清晰的分界线,提高了应用程序的复用性,使得应用程序不受底层硬件变化的影响。
    SD卡的上电初始化过程可以分成以下5个步骤:
    (1)适当延时等待SD就绪;
    (2)发送74+个spi_clk,且保持spi_cs_n=1 spi_mosi=1;
    (3)发送CMD0命令并等待响应R1=8’H01,将卡复位到IDLE;
    (4)发送CMD1命令并等待响应R1=8’H00,激活卡的初始化进程;
    (5)发送CMD16命令并等待响应R1=8’H00,设置一次读写BLOCK的长度。
    SD卡的数据读取操作也大致可以分为以下步骤:
    (1)发送命令CMD17;
    (2)接受读数据起始令牌0xFE;
    (3)读取512 B数据以及2 B的CRC。
    借助于NIOSⅡ可以软件编写最底层的SPI操作函数来实现上述复杂的步骤:
    extern INT8U SPI Sendbvte(INT8U data)
    extern INT8U SPI_Recibyte(void)
    上面分别是SPI发送1 B以及接收1 B,这2个函数的使用需要调用SoPC中的SPI核中的库函数,然后是SD卡的初始化和读写函数:
    初始化: extern int SD_Reset(void);
    读一扇区:extern inI SD_ReadBlock(INT32Ublockaddr,INT8U*recibuf);
    写一扇区:extern int SD_WriteBlock(INT32Ublockaddr,INT8U*sendbuf);
    通过这些代码,可以一步步的向SD卡发送CMD指令,使其复位,激活成SPI模式,并设置块大小为512 B。

3 文件系统的设计
   
若读写操作都是以扇区为单位,SD卡仅相当于FLASH。为了管理SD卡中的数据,并方便在Windows系统中访问SD卡中的数据,就必须将SD卡中的数据有效组织起来,以文件的形式进行存储和访问,可以给SD卡创建一个文件系统,常见的是微软公司推出的FAT16和进化版FAT32。
    FAT存储原理:FAT16由6部分组成,首先是引导扇区(DBR),引导扇区(DBR)即操作系统引导记录区,通常占用分区的第0扇区共512 B。在512 B中,又由跳转指令、厂商标志、操作系统版本号、BPB、扩展BPB、OS引导程序、结束标志几部分组成。如图3所示,根文件夹紧跟着的是FAT表(FAT1,FAT2,FAT2是FAT1的备份),FAT表是FAT16文件系统用来记录磁盘数据簇链结构的,FAT中磁盘空间按照一定数目的扇区为最单位进行划分,这种单位称为簇,一般每扇区分为512 B,而簇的大小是2n(n为整数)个扇区,所以簇的大小一般是512 B,1 KB,2 KB,4 KB等,一般不超过32 KB。以簇为单位的原因是扇区太小,如果用扇区的话对大文件的存取会消耗很多资源,增加FAT表的项数,这样文件系统的效率就非常低。


    文件系统本质上就是把上层对文件的操作转换为底层对数据簇的操作(例如初始化,读扇区,写扇区等)。
    本文中最底层的2个函数如下:
   
   
    有了这些底层函数和API函数后,要对SD卡进行操作只需要在NIOS的顶层main.C文件里面调用这些函数。用软件的方法完成顺序执行的操作,而这正是硬件执行的软肋。下面列出main函数核心的代码:
   
    测试:在一张SD卡里存放了一个test.txt文件,插到开发板的SD卡槽里。最后的图4是NIOS控制台最终的运行结果,程序正确的显示出了卡里面的文件夹和文件,以及test.txt里面的文件内容,验证了本系统可以正确运行。



4 结语
   
本设计基于SoPC以NIOSⅡ软核处理器为控制核心,根据标准的FAT32文件系统规范,完成了对SD卡的基础操作。该设计虽比硬件读取占用稍稍多点的资源,但是方便了开发者对嵌入式设备外设的操作和移植,有非常实际的可操作性和应用。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭