單片機(jī)讀寫U盤、cf卡開(kāi)發(fā)心得
剛做完一個(gè)項(xiàng)目,要求將人體心電信號(hào)采集下來(lái),存儲(chǔ)到海量存儲(chǔ)設(shè)備中,可以用U盤也可以用CF卡。這個(gè)項(xiàng)目的難點(diǎn)不在采集,只要做好信號(hào)放大、濾波防干擾,就可以保證信號(hào)采集的正確性。而難點(diǎn)在于數(shù)據(jù)的存儲(chǔ),要求患者將24小時(shí)甚至更長(zhǎng)時(shí)間的所有心電信號(hào)都存儲(chǔ)下來(lái),按照10ms采集一次數(shù)據(jù)那么一個(gè)小時(shí)就要400K,一天的數(shù)據(jù)存儲(chǔ)量需要9.6M。因此一般的靜態(tài)E2滿足不了使用的要求,有些情況下,設(shè)備要求能夠連續(xù)使用一個(gè)禮拜,而數(shù)據(jù)不能丟失,因此必須選用一個(gè)大存儲(chǔ)量器件。我們?cè)谶@個(gè)項(xiàng)目中選擇的是U盤,當(dāng)然我的一個(gè)師弟采用的CF卡也完成了數(shù)據(jù)的存儲(chǔ)。所謂U盤就是一個(gè)帶有USB接口的硬盤,如果去掉USB接口芯片,U盤內(nèi)部和CF卡和普通的PC硬盤結(jié)構(gòu)一樣。因此很有必要研究一下硬盤的物理結(jié)構(gòu)和數(shù)據(jù)分布結(jié)構(gòu)。其實(shí)很多同行,也遇到過(guò)如此問(wèn)題,在這里我將我的使用心得和大家交流一下,如果有何意見(jiàn)可以交流:jiangfuting@163.com,我有些簡(jiǎn)單的小程序可以提供給大家。我向大家推薦一本書《硬盤扇區(qū)讀寫技術(shù)》,當(dāng)然這本書前60頁(yè)講得很詳細(xì),很有意義,至于這本書后面部分,建議大家就不要看了,呵呵,jnmcu.com 也有一些不錯(cuò)的資料,大家可以參考。其實(shí)單片機(jī)讀寫硬盤,關(guān)鍵是按照FAT格式讀寫硬盤,說(shuō)白了,就是單片機(jī)要按照PC機(jī)WINDOWS的規(guī)矩來(lái)辦事。我想在這里將我這個(gè)項(xiàng)目的心得和大家談一下,如果有不對(duì)的地方,還請(qǐng)高手指正。我把單片機(jī)或者ARM讀寫U盤分為兩種方式,就是FAT格式和非FAT格式,這里的“非FAT格式”是我自己發(fā)明的一個(gè)詞,后面的部分,我還要詳細(xì)的闡述。
1.非FAT格式下,讀寫U盤
如果我們不按照FAT格式讀寫U盤的話,其實(shí)很簡(jiǎn)單,我在以前的帖子中也一再堅(jiān)持,就是將CF卡和U盤當(dāng)作一個(gè)無(wú)限大的外部RAM,那么這種模式下,U盤和CF卡與普通的外部擴(kuò)展RAM的區(qū)別就僅僅是讀寫U盤的時(shí)候,不能一個(gè)字節(jié)一個(gè)自己的來(lái),必須一次512B,不能通過(guò)地址總線找到每一個(gè)RAM字節(jié)的存放地址,而必須是一個(gè)扇區(qū)一個(gè)扇區(qū)的來(lái)。如果能夠接受這一點(diǎn),那么,你就可以通過(guò)單片機(jī)讀寫U盤了。當(dāng)然這還需要主意一些問(wèn)題,就是你不能隨意的存儲(chǔ)和讀寫你的數(shù)據(jù),你必須接受U盤的要求。其實(shí)這些要求也很簡(jiǎn)單,就是不能往FAT表的扇區(qū)寫任何數(shù)據(jù),否這,你的U盤就崩潰了,在WINDOWS下就識(shí)別不出來(lái)了,我就干過(guò)這種事情,往U盤的FAT表和FAT備份表寫了一數(shù)據(jù),最后的結(jié)果是U盤往PC機(jī)的USB口一插,計(jì)算機(jī)就死機(jī),原因就是WINDOWS不能識(shí)別U盤,而U盤本身沒(méi)有壞,就是說(shuō)USB通信沒(méi)有問(wèn)題,有問(wèn)題的是FLASH的扇區(qū),讓我寫壞了,而寫壞的部分恰恰是FAT表,這是一個(gè)災(zāi)難性的錯(cuò)誤,解決的辦法就是憑著各種資料,把FAT表的格式和數(shù)據(jù)通過(guò)單片機(jī)再寫回去,呵呵,我用了一個(gè)上午的時(shí)間來(lái)拯救我那可憐的U盤。如果你注意了以上的問(wèn)題,那么好,就可以準(zhǔn)備用單片機(jī)讀寫U盤了。前面我也說(shuō)了,用單片機(jī)讀寫U盤,必須一個(gè)扇區(qū)一個(gè)扇區(qū)的來(lái)。也就是說(shuō),我們讀寫的最小單位就是一個(gè)扇區(qū)512B。那么就必須要求你的單片機(jī)能夠提供至少512B的RAM,我這里選用的是STC89C54RD,這個(gè)單片機(jī)能夠滿足我的要求,此單片機(jī)具體的信息可以查詢,就不給廠家做廣告了。那么就是讀寫的地址的問(wèn)題了。此中模式下,最關(guān)鍵的問(wèn)題就是用單片機(jī)把數(shù)據(jù)存進(jìn)去,或者讀出來(lái),那么我們這個(gè)地址怎么設(shè)置,如果用匯編51的話,就是DPL1,DPH1,DPL0,DPH0怎么設(shè)置應(yīng)該設(shè)置成什么?其實(shí)這也就是FLASH的地址,就是U盤數(shù)據(jù)的存放地址,如果我們用4個(gè)8位的數(shù)據(jù)來(lái)表示所有的FLASH的話,就是FFFFFFFF,那么我們尋址的范圍就是200G,這么大的空間,我們?cè)趺创_定呢,jnmcu.com有些資料,可以查看。我在這里簡(jiǎn)單的說(shuō)明一下:?jiǎn)纹瑱C(jī)寫入地址=相關(guān)扇區(qū)號(hào)+32 轉(zhuǎn)換成4個(gè)十六進(jìn)制就可以,就是單片機(jī)的外部訪問(wèn)地址。其中最關(guān)鍵的就是相關(guān)扇區(qū)號(hào),硬盤的存儲(chǔ)單位不應(yīng)該是扇區(qū),而是“簇”,而單片機(jī)讀寫地址的關(guān)聯(lián)卻是扇區(qū),應(yīng)此我們還必須找清楚簇號(hào)和扇區(qū)號(hào)的關(guān)系。這種關(guān)系的找法有很多中,我參考了大量的資料總結(jié)了一下,就是FAT表的第一個(gè)扇區(qū)和第一個(gè)簇指的是同一個(gè)地方,哈哈,有的讀者已經(jīng)明白了,既然第一個(gè)扇區(qū)和第一個(gè)簇指的是同一個(gè)地方,那么他們的計(jì)算公式一相等,就可以得出簇和扇區(qū)的關(guān)系,在這里我總結(jié)的關(guān)系是:數(shù)據(jù)首扇區(qū)地址=(文件起始簇號(hào)-根目錄簇)*每簇扇區(qū)數(shù)目+根目錄扇區(qū),這個(gè)關(guān)系是一個(gè) 不變的關(guān)系,不管你是8M的U盤或者CF卡,還是200G的硬盤,這個(gè)關(guān)系肯定不變,有了這個(gè)關(guān)系,我們就可以根據(jù)簇璉來(lái)找扇區(qū),找到扇區(qū),轉(zhuǎn)換成4個(gè)16進(jìn)制的數(shù)據(jù),就是單片機(jī)的讀寫地址了。至此就完成了單片機(jī)讀寫U盤的所有準(zhǔn)備工作。但是這種模式下讀寫出來(lái)的數(shù)據(jù)不是FAT格式,但是卻是一種實(shí)用,簡(jiǎn)單的讀寫方式,我覺(jué)得這種方式很好。
2.FAT格式下單片機(jī)讀寫U盤/cf卡
我在做這個(gè)項(xiàng)目的時(shí)候?qū)⒋蟛糠謺r(shí)間都花在研究硬盤的FAT分區(qū)格式上,因?yàn)閁盤和CF卡的物理結(jié)構(gòu)和數(shù)據(jù)分布結(jié)構(gòu)和PC硬盤的結(jié)構(gòu)完全一樣,而又沒(méi)有系統(tǒng)的資料和書來(lái)介紹U盤的結(jié)構(gòu),所以我就仔細(xì)研究了一下硬盤的數(shù)據(jù)結(jié)構(gòu),JNMCU.COM 有一些U盤的資料,也不是太全面。通過(guò)仔細(xì)的查看硬盤的結(jié)構(gòu),我們就會(huì)發(fā)現(xiàn)硬盤的分布結(jié)構(gòu)是固定的,有它自己的規(guī)律,我們掌握了這種規(guī)律就可以一步一步來(lái)分析?,F(xiàn)在有很多廠家和公司提供單片機(jī)讀寫U盤的子程序庫(kù),我當(dāng)時(shí)看一下,不大喜歡他們做的程序庫(kù),首先他們的程序不公開(kāi),也就是說(shuō),我們想學(xué)習(xí)的話,只能學(xué)習(xí)他們子程序的用法,再有,他們做的容錯(cuò)機(jī)制太多,做的處理太負(fù)責(zé),應(yīng)此光光他們的程序庫(kù)就20多K,而我們單片機(jī)的硬件資源是很有限的FLASH都不是太大,我們還要留著自己的代碼空間進(jìn)行數(shù)據(jù)處理,應(yīng)此,子程序庫(kù)我不推薦使用。我覺(jué)得,找到其中的規(guī)律按照規(guī)律編寫自己的代碼是很方便的。也有的同仁要說(shuō),你做的程序穩(wěn)定嗎?可靠嗎?FAT需要很多容錯(cuò)機(jī)制的,我想說(shuō),沒(méi)用,一旦出了錯(cuò),就是在好多容錯(cuò)機(jī)制都已經(jīng)于事無(wú)補(bǔ)了,最好的辦法,就是做好系統(tǒng)后,自己多測(cè)試,我做的便攜式心電監(jiān)護(hù)儀,一次采集30M的數(shù)據(jù),數(shù)據(jù)格式就是1.TXT,就是一個(gè)記事本,我聯(lián)系測(cè)試了1個(gè)月,沒(méi)有發(fā)生一次數(shù)據(jù)存儲(chǔ)不穩(wěn)的情況,現(xiàn)在這個(gè)產(chǎn)品已經(jīng)廣泛應(yīng)用在醫(yī)療設(shè)備中。所以,不要說(shuō)你考慮的了就是好事,我認(rèn)為,先作出來(lái),然后多做測(cè)試,自己心中就不會(huì)心虛?,F(xiàn)在詳細(xì)的將一下FAT的數(shù)據(jù)結(jié)構(gòu)。硬盤的物理結(jié)構(gòu)應(yīng)該是FAT表的BPB表-FAT表-FAT表的備份表-FDT表(根目錄扇區(qū))-DATA區(qū)。找到這些規(guī)律,我們關(guān)心其實(shí)就是DATA區(qū)。進(jìn)行尋址的方式就是簇璉尋址的方法。首先要找到U盤的FAT表的BPB表,這里有U盤最基本的信息,包括每扇區(qū)自己數(shù),每簇扇區(qū)數(shù),保留扇區(qū)數(shù),F(xiàn)AT表的數(shù)目,每個(gè)FAT表的扇區(qū)數(shù),根目錄其實(shí)簇號(hào)等最基本最重要的信息。找到這個(gè)信息后,通過(guò)扇區(qū)和簇的關(guān)系(前面已經(jīng)將過(guò)),就可以找到文件的FDT表的第一個(gè)扇區(qū)的第一個(gè)簇,找到這些數(shù)據(jù)以后就號(hào)辦了。就可以按照硬盤的簇璉尋址方法進(jìn)行讀寫了。
以上是本人在開(kāi)發(fā)便攜式心電監(jiān)護(hù)儀中單片機(jī)讀寫U盤的一點(diǎn)心得和開(kāi)發(fā)筆記,希望行家里手多多指正,也希望剛剛開(kāi)始開(kāi)發(fā)的同行多多交流
評(píng)論