原创 单片机读写U盘CF卡开发心得

2006-12-20 09:34 4443 4 12 分类: MCU/ 嵌入式

刚做完一个项目,要求将人体心电信号采集下来,存储到海量存储设备中,可以用U盘也可以用CF卡。这个项目的难点不在采集,只要做好信号放大、滤波防干扰,就可以保证信号采集的正确性。而难点在于数据的存储,要求患者将24小时甚至更长时间的所有心电信号都存储下来,按照10ms采集一次数据那么一个小时就要400K,一天的数据存储量需要<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9.6M。因此一般的静态E2满足不了使用的要求,有些情况下,设备要求能够连续使用一个礼拜,而数据不能丢失,因此必须选用一个大存储量器件。我们在这个项目中选择的是U盘,当然我的一个师弟采用的CF卡也完成了数据的存储。所谓U盘就是一个带有USB接口的硬盘,如果去掉USB接口芯片,U盘内部和CF卡和普通的PC硬盘结构一样。因此很有必要研究一下硬盘的物理结构和数据分布结构。其实很多同行,也遇到过如此问题,在这里我将我的使用心得和大家交流一下,如果有何意见可以交流:jiangfuting@163.com,我有些简单的小程序可以提供给大家。我向大家推荐一本书《硬盘扇区读写技术》,当然这本书前60页讲得很详细,很有意义,至于这本书后面部分,建议大家就不要看了,呵呵,www.jnmcu.com 也有一些不错的资料,大家可以参考。其实单片机读写硬盘,关键是按照FAT格式读写硬盘,说白了,就是单片机要按照PCWINDOWS的规矩来办事。我想在这里将我这个项目的心得和大家谈一下,如果有不对的地方,还请高手指正。我把单片机或者ARM读写U盘分为两种方式,就是FAT格式和非FAT格式,这里的“非FAT格式”是我自己发明的一个词,后面的部分,我还要详细的阐述。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


1.FAT格式下,读写U盘如果我们不按照FAT格式读写U盘的话,其实很简单,我在以前的帖子中也一再坚持,就是将CF卡和U盘当作一个无限大的外部RAM,那么这种模式下,U盘和CF卡与普通的外部扩展RAM的区别就仅仅是读写U盘的时候,不能一个字节一个自己的来,必须一次512B,不能通过地址总线找到每一个RAM字节的存放地址,而必须是一个扇区一个扇区的来。如果能够接受这一点,那么,你就可以通过单片机读写U盘了。当然这还需要主意一些问题,就是你不能随意的存储和读写你的数据,你必须接受U盘的要求。其实这些要求也很简单,就是不能往FAT表的扇区写任何数据,否这,你的U盘就崩溃了,在WINDOWS下就识别不出来了,我就干过这种事情,往U盘的FAT表和FAT备份表写了一数据,最后的结果是U盘往PC机的USB口一插,计算机就死机,原因就是WINDOWS不能识别U盘,而U盘本身没有坏,就是说USB通信没有问题,有问题的是FLASH的扇区,让我写坏了,而写坏的部分恰恰是FAT表,这是一个灾难性的错误,解决的办法就是凭着各种资料,把FAT表的格式和数据通过单片机再写回去,呵呵,我用了一个上午的时间来拯救我那可怜的U盘。如果你注意了以上的问题,那么好,就可以准备用单片机读写U盘了。前面我也说了,用单片机读写U盘,必须一个扇区一个扇区的来。也就是说,我们读写的最小单位就是一个扇区512B。那么就必须要求你的单片机能够提供至少512BRAM,我这里选用的是STC89C54RD,这个单片机能够满足我的要求,此单片机具体的信息可以查询,就不给厂家做广告了。那么就是读写的地址的问题了。此中模式下,最关键的问题就是用单片机把数据存进去,或者读出来,那么我们这个地址怎么设置,如果用汇编51的话,就是DPL1,DPH1DPL0,DPH0怎么设置应该设置成什么?其实这也就是FLASH的地址,就是U盘数据的存放地址,如果我们用48位的数据来表示所有的FLASH的话,就是FFFFFFFF,那么我们寻址的范围就是200G,这么大的空间,我们怎么确定呢,www.jnmcu.com有些资料,可以查看。我在这里简单的说明一下:单片机写入地址=相关扇区号+32   转换成4个十六进制就可以,就是单片机的外部访问地址。其中最关键的就是相关扇区号,硬盘的存储单位不应该是扇区,而是“簇”,而单片机读写地址的关联却是扇区,应此我们还必须找清楚簇号和扇区号的关系。这种关系的找法有很多中,我参考了大量的资料总结了一下,就是FAT表的第一个扇区和第一个簇指的是同一个地方,哈哈,有的读者已经明白了,既然第一个扇区和第一个簇指的是同一个地方,那么他们的计算公式一相等,就可以得出簇和扇区的关系,在这里我总结的关系是:数据首扇区地址=(文件起始簇号-根目录簇)*每簇扇区数目+根目录扇区,这个关系是一个 不变的关系,不管你是8MU盘或者CF卡,还是200G的硬盘,这个关系肯定不变,有了这个关系,我们就可以根据簇琏来找扇区,找到扇区,转换成416进制的数据,就是单片机的读写地址了。至此就完成了单片机读写U盘的所有准备工作。但是这种模式下读写出来的数据不是FAT格式,但是却是一种实用,简单的读写方式,我觉得这种方式很好。


 


2.FAT格式下单片机读写U/cf卡我在做这个项目的时候将大部分时间都花在研究硬盘的FAT分区格式上,因为U盘和CF卡的物理结构和数据分布结构和PC硬盘的结构完全一样,而又没有系统的资料和书来介绍U盘的结构,所以我就仔细研究了一下硬盘的数据结构,WWW.JNMCU.COM 有一些U盘的资料,也不是太全面。通过仔细的查看硬盘的结构,我们就会发现硬盘的分布结构是固定的,有它自己的规律,我们掌握了这种规律就可以一步一步来分析。现在有很多厂家和公司提供单片机读写U盘的子程序库,我当时看一下,不大喜欢他们做的程序库,首先他们的程序不公开,也就是说,我们想学习的话,只能学习他们子程序的用法,再有,他们做的容错机制太多,做的处理太负责,应此光光他们的程序库就20K,而我们单片机的硬件资源是很有限的FLASH都不是太大,我们还要留着自己的代码空间进行数据处理,应此,子程序库我不推荐使用。我觉得,找到其中的规律按照规律编写自己的代码是很方便的。也有的同仁要说,你做的程序稳定吗?可靠吗?FAT需要很多容错机制的,我想说,没用,一旦出了错,就是在好多容错机制都已经于事无补了,最好的办法,就是做好系统后,自己多测试,我做的便携式心电监护仪,一次采集30M的数据,数据格式就是1.TXT,就是一个记事本,我联系测试了1个月,没有发生一次数据存储不稳的情况,现在这个产品已经广泛应用在医疗设备中。所以,不要说你考虑的了就是好事,我认为,先作出来,然后多做测试,自己心中就不会心虚。现在详细的将一下FAT的数据结构。硬盘的物理结构应该是FAT表的BPB表-FAT表-FAT表的备份表-FDT表(根目录扇区)-DATA区。找到这些规律,我们关心其实就是DATA区。进行寻址的方式就是簇琏寻址的方法。首先要找到U盘的FAT表的BPB表,这里有U盘最基本的信息,包括每扇区自己数,每簇扇区数,保留扇区数,FAT表的数目,每个FAT表的扇区数,根目录其实簇号等最基本最重要的信息。找到这个信息后,通过扇区和簇的关系(前面已经将过),就可以找到文件的FDT表的第一个扇区的第一个簇,找到这些数据以后就号办了。就可以按照硬盘的簇琏寻址方法进行读写了。  以上是本人在开发便携式心电监护仪中单片机读写U盘的一点心得和开发笔记,希望行家里手多多指正,也希望刚刚开始开发的同行多多交流

文章评论8条评论)

登录后参与讨论

用户265083 2011-10-12 15:52

你好,给你发了一个邮件,请注意查收,多谢

用户193486 2009-4-9 12:05

你好,我的毕业设计叫USB转存接口设备设计,好像和你的这篇文章有关,有相关电路参考下吗?573867426@qq.com谢谢

用户399105 2009-1-15 22:58

博主你好!我是一名硕士研究生,我现在做的就是把单片机采集的信号存到U盘中,存成一个txt文件。非常惭愧由于我不太明白单片机原理,能否请您赐教,分享一下您的单片机写U盘或CF卡的程序,并给予设计经验指导。非常感谢!我的信箱是:qhdhgqkfq@163.com。

用户152460 2008-11-3 10:01

博主你好!我现在要做的毕设和你的情况很相似,都是采样频率是10ms,现在我想问问有没有相关写CF卡的汇编程序以及CF卡的相关电路。希望能分享给我,或者和指导一下:liuyuan242@gmail.com 谢谢分享!期待与你的联系。

用户152460 2008-11-3 09:58

博主你好!我现在要做的毕设和你的情况很相似,都是采样频率是10ms,现在我想问问有没有相关写CF卡的汇编程序以及CF卡的相关电路。希望能分享给我,或者和指导一下:liuyuan242@gmail.com 谢谢分享!期待与你的联系。

用户1174293 2007-7-3 11:20

PC机当然可以,不过为什么不用操作系统呢,就算用DOS用C开发也比汇编容易啊。

用户1174293 2006-12-22 12:18

不用客气,这也是收集来的资料,贴在这里既是方便我自己,也是方便大家。呵呵!

用户1053025 2006-12-20 10:48

呵呵,谢谢博主!
相关推荐阅读
用户1174293 2009-10-13 15:05
PID整定经验
这段时间做了一个数控项目,用到了数字PI调节,现在将整定过程稍做整理,给大家参考。采用增量式PI算法,数学公式原型:△u(k)=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2e...
用户1174293 2009-06-10 17:02
SPARTAN3 AN系列电路设计及使用注意事项
XILINX在前年推出了内置FLASH的SPARTAN FPGA系列,不仅可以为FPGA提供上电加载配置,而且还可以为应用提供数据存储空间。换句话说,就是内部的FLASH单是为FPGA配置你还用不掉,...
用户1174293 2008-10-18 15:14
W77E58外扩RAM的教训
近期公司的一个项目以W77E58为核心,外扩掉电保护RAM,XC9572,A/D,D/A等。本来是一个很普通的51系统,结果前后折腾了很久才最终搞定。第一版由同事做的硬件,我做的软件,功能测试很快就通...
用户1174293 2007-01-09 13:14
EEPROM长效读写
常用的EEPROM如24LC04等的使用寿命大概是10万次,这在一些频繁修改存储数据的场合往往不够。一个很自然的想法是以空间换时间,用分块的方式轮流写入。设想在00H单元记录当前数据区首地址,每次根据...
用户1174293 2006-12-22 12:33
C51中断函数
C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]<?xml:namespace prefix = o ns = "urn:schemas-...
用户1174293 2006-12-22 11:55
C语言的宏定义
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义:<?xml:namespace prefix = o ns = "...
EE直播间
更多
我要评论
8
4
关闭 站长推荐上一条 /3 下一条