利用MSP430在SD卡上实现FAT32文件系统

发布者:静静思索最新更新时间:2015-01-15 来源: 51hei关键字:MSP430  SD卡  FAT32  文件系统 手机看文章 扫描二维码
随时随地手机看文章
       经过一周左右时间的摸索,终于明白了如何用msp30在SD卡实现FAT32文件系统,很开心~在学习的过程中,也发现一个问题,就是网上系统地讲SD卡的资料很少,而讲SDHC卡的资料则更少,所以决定写一篇博客与大家分享,由于SDHC卡大部分内容都与SD卡一样,所以下文除非是特别介绍SDHC卡,其余都会以SD卡代替SDHC卡。如果发现文中存在问题,欢迎指正,谢谢。

       首先,我们先说明一下本文的主要内容,本文的主要侧重点在于利用msp430(其它单片机应该类似)驱动SD卡。驱动方式选用SPI方式,驱动成功之后,将FAT32文件系统移植过来。所以如果想要仔细学习FAT32文件系统的,可以忽略本文了,想要快速地利用单片机在SD卡上实现FAT32文件系统的,可以看一下。大家可以交流一下。

一、开发之前的准备

1、准备WinHex工具

     工欲善其事,必先利其器。在开发之前,我们必须要先准备好需要的工具,除了相应的单片机开发平台,我们还需要一个很重要的工具,WinHex。WinHex可以直接查看磁盘内部的16进制数据。我们把SD卡用卡槽接到电脑上之后,打开WinHex,点击Tools--Open Disk,然后在Physical Media下选择自己的SD卡,即可打开自己的SD卡。如下图所示。这里需要注意的是,一定要在Physical Media下选自己的SD卡,这样看到才是物理地址,否则看到的是逻辑地址,可能会跟你的实际操作不一致,如你在地址为1024的地方写了一段数据,用WinHex在这里却看不到你写的数据。

2、SD卡和SDHC卡

        目前大家口头上经常说的是SD卡,但实际上,目前所用的大容量的卡其实均是SDHC卡。SD的容量最大只能到2G,而SDHC卡的容量最小2G,最大32G。所以,如果你的“SD卡”的容量超过2G了,那其实那是SDHC卡。SD卡和SDHC卡在用户使用上,除了容量大了,几乎体会不到别的区别,但是在开发过程中,却是存在一些区别的,SD卡是按字节寻址,SDHC卡是按块寻址。这一点一定要记住。什么是按字节寻址,什么是按块寻址,我们在下文会简单讲解。

3、寻址方式及“块”和“簇”的简单介绍

      首先,我们介绍一下“块”的概念,在SD卡或者SDHC卡里,一个块是由512个字节组成,每次读写的时候,数据都是以块为单位进行读写的。SD卡读写是按字节寻址,这是指其读写地址的单位为字节,而我们前面提到,读写的时候数据是以块为单位进行读写的,所以读写SD卡的时候,其地址应该为512的倍数,即读写SD卡时,其地址参数为0,512,1024……而SDHC卡则是以块为单位寻址的,即读写SDHC卡时,地址参数为1时,读写的地址实际上用512字节开始,到1023字节出结束。从WinHex中,我们也可以看到,在地址为512倍数的上一行,有一条线分割了上下两行,这其实也就是把块分割开了,看起来更清楚了。

      在这里,我们再简单介绍一下“簇”。我们在格式化SD卡的时候,可能会忽略一个选项,分配单元大小,如下图所示,这个其实就是我们常说的“簇”。在文件系统中,存储文件是以“簇”为单位进行存储的。就比如说一栋楼,将它划分为若干个房间,每个房间的大小一样,同时给每个房间一个房间号.这时,每个房间的大小,就是分配单元. 在建立分区时,会出现分配单元大小的选项。每个簇只能存放一个文件。文件就是按照这个簇的大小被分成若干块存储在磁盘上的。比如一个512字节大的文件,当分配单元为512字节时,它占用512字节的存储空间;一个513字节大的文件,当分配单元为512字节时,它占用1024字节的存储空间,但当分配单元为4096时,它就会占用4096字节的存储空间。所以,这也就解释了为什么有时候我们明明看SD卡或者U盘上还有一定容量的存储空间,却存不下文件的问题。

二、SD卡命令介绍

      SD卡里,用到的所有命令都是6个字节,第一个字节为命令代号,紧接着的4个字节为该命令所需的参数,最后一个字节为校验。命令里,第一个字节可以通过命令数+0x40得到。如cmd8的第一个字节为0x48。[page]

      在SPI模式下,我们需要用到底命令如下表所示:


       关于这些命令,这里有几个注意事项:

      1)CMD0的最后一个字节必须为0x95,因为SD卡刚上电还没有处于SPI模式,还需要这样一个校验的字节来校验,进入SPI模式之后,则不需要校验了,最后一个字节可以随意;

      2)CMD55和CMD41(该命令也常称为ACMD41)必须一起使用,这里所说的两个一起使用是指两个命令必须连续发送,而不是先一直发送CMD55,收到正确的回复之后,再一直发送CMD41,,这样做的后果是一直收到0x05,不是收到0x00;此外,发送完CMD41之后,会先收到一个0x01,然后才是0x00;

      3)读写SD卡时,SD卡和SDHC卡的地址信息是不同的,一个是以字节为单位,一个是以块为单位;读SD卡时,写入CDM17之后,要一直读,直道读到0xfe,说明后续的512字节是数据;写SD卡时,写进数据之后,回复为0x05,说明成功写入。

      这些命令对应的回复整理的还不太全面,有些命令的回复是好几个字节的,这里没有详细写出。

 三、开发过程

1、硬件方面

       由于我们是采用SPI方式驱动SD卡,所以只需要用到4跟线,分别为片选信号线(CS)、数据输入线(DIN)、数据输出线(DOUT)和时钟线(CLK)。这里,我的这四根线都采用外部上拉的方式上拉了。设计的原理图如下图所示。这里需要注意的是,SD卡的数据输入应该接单片机的数据输出,SD的数据输出应该接单片机的数据输入。

         

      在SPI模式下,我们需要用到的4个脚的信息可以从下表中获取,多于的一些脚在SPI模式下是用不到,这里所有的脚我都上拉了,其实有一些脚不上拉也没关系,而且MSP430有些型号内部可以设置上拉的。此外,SD卡一般有9个引脚,原理图里有11个引脚,主要是因为原理图里画的是卡槽,多出来的几个引脚是检测是否有卡,以及卡是否写保护的。

2、软件方面

     软件方面,我们可以分为四个步骤:

  • 先编写出利用SPI接口读写一个字节的函数
  • 然后利用这些函数编写出写命令函数
  • 利用写命令函数写出读写数据块以及初始化函数
  • 移植FAT32文件系统

(1)读写一个字节的函数

      该函数有两种方式实现,一个是利用单片机自带的SPI模块来实现,这种方式的好处是读写速度快,但是单片机上的SPI模块数量有限,这样不太灵活,另一个是利用普通IO实现,这样的好处是使用十分灵活,但是速度不够快,MSP430的IO的极限翻转速度大概在320K左右。

(2)写命令函数

      写命令函数其实是调用写一个字节的函数,实现发送6个字节命令的效果,只是这里有一点需要注意,在写命令函数里,为了提高兼容性,应该先拉高片选信号,给8个周期的时钟信号之后,再拉低片选信号,开始发命令的操作。

(3)读写块函数

     读写块函数其实是调用写命令函数和读一个字节的函数,这里需要注意的有两点,一个就是上文提到的地址信息的问题,另一个就是在读写完块数据之后,需要拉高片选信号,并且再给8个周期的时钟信号,以提高稳定性。

(4)初始化函数

    初始化函数其实是整个SD卡驱动里,最为重要的一个环节,在SD卡的初始化阶段里,为了能够识别出多种类型的SD卡(MMC卡、SD卡、SDHC卡等),需要调用多条命令,并且根据应答数据来判断是哪种类型的卡。在初始化的时候,需要注意的是要放慢SPI的速度,这样初始化的成功率会高一些。具体初始化的过程,后面我会再整理一下,做成一张图上传的~     

(5)移植FAT32文件系统

    有了上述的基础函数之后,就可以把FAT32文件系统移植过来了,只需要把底层的驱动函数改成自己写的驱动函数就可以了~

四、总结

      前段时间,想用MSP430在SD上实现FAT32文件系统,由于时间有限,自己只完成了SD卡的底层驱动这一部分。文件系统的实现,则要感谢znFAT的团队,因为上层的文件系统是移植的他们的znFAT。感觉znFAT的可移植性真的很强,而且很稳定,移植起来还是比较顺利的~大家如果想对FAT32文件系统有深入的了解的话,可以买znFAT代码编写者写的一本书看下,目前简单翻了一遍,感觉思路很清晰的~

      最后要感谢网上众多技术达人对于SD卡驱动的总结,之前也遇到不少奇奇怪怪的问题,也是看很多他们的总结,才能顺利完成这个任务~

关键字:MSP430  SD卡  FAT32  文件系统 引用地址:利用MSP430在SD卡上实现FAT32文件系统

上一篇:浅谈MSP430F5529时钟
下一篇:ADC0832采集数据1602液晶显示

推荐阅读最新更新时间:2024-03-16 13:51

MSP430定时器详解
MSP430的定时器中有比较捕获的概念,刚刚接触非常生疏。看了半天终于清楚: 比较模式: 这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx置一,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置一。 例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。 捕获模式: 利用外部信
[单片机]
MSP430学习小结3-MSP430基本时钟模块
与51、AVR等单片机不同msp430的时钟信号源有LFXT1,XT2,DCO三种。 1、LFXT1:可接高速和低速晶振,在低速模式下,它可以外接32k的晶振而不需要负载电容,这种方式较为常见主要用来为ACLK提供低速的时钟信号,以供低速外设使用。 2、XT2:高速振荡器,它可以接一个0.4~16M的晶振,它相当于高速模式下的LFXT1。通常将它配置成一个高速的振荡源,为MCLK何SMCLK提供高速时钟信号。 3、DCO:内部数字控制振荡器,它的频率可以通过DCOCLK进行配置。在系统PUC之后,DCOx=7,MODx=3,表示选择了最高的频率。 前面介绍了MSP430中有三个个时钟信号源,MSP430的时钟信号也有三种主时钟MC
[单片机]
msp430f5529 MCP4725程序
//************************************** //I2C起始信号 //************************************** void I2C_Start() { SDAOUT; //数据线设为输出方向 SDA1; //拉高数据线 SCL_OUT; //时钟线设为输出方向 SCL1; //拉高时钟线 delayus(5); //延时 SDA0; //产生下降沿 delayus(5); //延时 SCL0; /
[单片机]
MSP430学习笔记2-跑马灯程序,熟悉定时器寄存器的配置
这个例子主要还是熟悉有关定时器A的寄存器配置以及IAR的配置方式。 /*********************************************** 程序功能:实现流水灯以三种流动方式和四种流动速度 的不同组合而进行点亮 流动 ------------------------------------------------ 拨码开关设置:将LED位拨至ON,其余拨至OFF 测试说明:观察流水灯流动顺序和速度的变化 ************************************************/ #include msp430x14x.h typedef unsigned int u
[单片机]
MSP430F149 TimerA 输出pwm信号 C程序代码
MSP430F149 TimerA 输出pwm信号  注意其中寄存器设置与pwm信号输出引脚的对应关系 P1.2-TA1,TACCR1,TACCTL1;,P1.3-TA2, TACCR2,TACCTL2。 #include msp430x14x.h #define uint unsigned int #define uchar unsigned char void int_clk() { uchar i; BCSCTL1 &= ~XT2OFF; //打开XT振荡器 BCSCTL2 |= SELM1+SELS; //MCLK为8MHz,SMCLK为8MHz do {
[单片机]
MSP430F149中中断优先级问题
1、MSP430F149中UART0的接收中断高于定时器TimerA的中断优先级。但是在程序的调试过程中确发现了不合适的现象。 2、程序调试场景是这样的:定时器计时到1S后,通过UART0向触摸屏写入数据;点击触摸屏后,向单片机上传该处的坐标。设置断点在定时器的某一处,单步运行到该处后,点击触摸屏上的某一点,单击调试的下一步,之后发现程序没有跳转到串口的接收中断程序,而是运行定时器中断程序内的下一行命令。
[单片机]
MSP430单片机为核心的电子汽车限速器的设计方案
我国每年有数十万起交通事故发生,如果汽车限速器能够普及,将会降低交通事故发生率,从而挽回不必要的财产和生命损失。  与近期在市场上热销的电子狗产品相比,汽车限速器更具有主动规避事故的优势,电子狗只是在接近超速测试探头时才提醒驾驶者控制车速。汽车限速器通常分为两大类:一种是在车辆超速时发出语音警报,提醒驾驶者减速;另一种是在车辆超过限定速度后,通过车载电脑发出指令,强制控制车辆行驶速度。第1种限速器只起到警示作用,而第2种汽车限速器将更为有效地降低交通事故。因此,本文着重介绍了第2种限速器的实现原理及设计方法。 1 限速器实现原理 由于早期的汽车是没有限速功能的,所以在设计时要同时考虑到汽车出厂前安装与售出后安装两个不同层面
[单片机]
<font color='red'>MSP430</font>单片机为核心的电子汽车限速器的设计方案
ARM7系统中实现CF卡存储的文件系统设计
  随着微控制器性能的不断提高,嵌入式应用越来越广泛。但是目前市场上的大型商用嵌入式实时系统,价格昂贵,而且都针对特定的硬件平台。对于中小型系统开发,购买商用实时系统并不划算。   目前我们正着手将嵌入式系统软件应用于汽车卫星导航仪系统的一步开发。传统的嵌入式应用并不包括文件系统,而我们要实现的文件系统需要在车辆导航系统中实现地图数据文件的读写。因此它既要支持与MS-DOS兼容的文件系统也要支持其它类型的文件系统。 另一方面,从数码相机到MP3播放机,从掌上电脑到数码摄像机,CF(CompactFlash)卡由于具有体积小、兼容性强、价格相对低廉等诸多优点,在数码设备上的应用越来越广泛。但若想在CF卡与PC之间传递数据,通常不得
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved