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