Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2161355
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类:

2010-04-09 08:57:39

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


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。那么就必须要求你的单片机能够提供至少512B的RAM,我这里选用的是STC89C54RD,这个单片机能够满足我的要求,此单片机具体的信息可以查询,就不给厂家做广告了。那么就是读写的地址的问题了。此中模式下,最关键的问题就是用单片机把数据存进去,或者读出来,那么我们这个地址怎么设置,如果用汇编51的话,就是DPL1,DPH1,DPL0,DPH0怎么设置应该设置成什么?其实这也就是FLASH的地址,就是U盘数据的存放地址,如果我们用4个8位的数据来表示所有的FLASH的话,就是FFFFFFFF,那么我们寻址的范围就是200G,这么大的空间,我们怎么确定呢,jnmcu.com有些资料,可以查看。我在这里简单的说明一下:单片机写入地址=相关扇区号+32  转换成4个十六进制就可以,就是单片机的外部访问地址。其中最关键的就是相关扇区号,硬盘的存储单位不应该是扇区,而是“簇”,而单片机读写地址的关联却是扇区,应此我们还必须找清楚簇号和扇区号的关系。这种关系的找法有很多中,我参考了大量的资料总结了一下,就是FAT表的第一个扇区和第一个簇指的是同一个地方,哈哈,有的读者已经明白了,既然第一个扇区和第一个簇指的是同一个地方,那么他们的计算公式一相等,就可以得出簇和扇区的关系,在这里我总结的关系是:数据首扇区地址=(文件起始簇号-根目录簇)*每簇扇区数目+根目录扇区,这个关系是一个 不变的关系,不管你是8M的U盘或者CF卡,还是200G的硬盘,这个关系肯定不变,有了这个关系,我们就可以根据簇琏来找扇区,找到扇区,转换成4个16进制的数据,就是单片机的读写地址了。至此就完成了单片机读写U盘的所有准备工作。但是这种模式下读写出来的数据不是FAT格式,但是却是一种实用,简单的读写方式,我觉得这种方式很好。

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

 以上是本人在开发便携式心电监护仪中单片机读写U盘的一点心得和开发笔记,希望行家里手多多指正,也希望刚刚开始开发的同行多多交流

阅读(4958) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~