<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 單片機讀寫(xiě)U盤(pán)、cf卡開(kāi)發(fā)心得

單片機讀寫(xiě)U盤(pán)、cf卡開(kāi)發(fā)心得

——
作者: 時(shí)間:2007-02-27 來(lái)源: 收藏

    剛做完一個(gè)項目,要求將人體心電信號采集下來(lái),存儲到海量存儲設備中,可以用也可以用。這個(gè)項目的難點(diǎn)不在采集,只要做好信號放大、濾波防干擾,就可以保證信號采集的正確性。而難點(diǎn)在于數據的存儲,要求患者將24小時(shí)甚至更長(cháng)時(shí)間的所有心電信號都存儲下來(lái),按照10ms采集一次數據那么一個(gè)小時(shí)就要400K,一天的數據存儲量需要9.6M。因此一般的靜態(tài)E2滿(mǎn)足不了使用的要求,有些情況下,設備要求能夠連續使用一個(gè)禮拜,而數據不能丟失,因此必須選用一個(gè)大存儲量器件。我們在這個(gè)項目中選擇的是,當然我的一個(gè)師弟采用的也完成了數據的存儲。所謂就是一個(gè)帶有USB接口的硬盤(pán),如果去掉USB接口芯片,U盤(pán)內部和和普通的PC硬盤(pán)結構一樣。因此很有必要研究一下硬盤(pán)的物理結構和數據分布結構。其實(shí)很多同行,也遇到過(guò)如此問(wèn)題,在這里我將我的使用心得和大家交流一下,如果有何意見(jiàn)可以交流:jiangfuting@163.com,我有些簡(jiǎn)單的小程序可以提供給大家。我向大家推薦一本書(shū)《硬盤(pán)扇區讀寫(xiě)技術(shù)》,當然這本書(shū)前60頁(yè)講得很詳細,很有意義,至于這本書(shū)后面部分,建議大家就不要看了,呵呵,jnmcu.com 也有一些不錯的資料,大家可以參考。其實(shí)讀寫(xiě)硬盤(pán),關(guān)鍵是按照FAT格式讀寫(xiě)硬盤(pán),說(shuō)白了,就是要按照PC機WINDOWS的規矩來(lái)辦事。我想在這里將我這個(gè)項目的心得和大家談一下,如果有不對的地方,還請高手指正。我把或者ARM讀寫(xiě)U盤(pán)分為兩種方式,就是FAT格式和非FAT格式,這里的“非FAT格式”是我自己發(fā)明的一個(gè)詞,后面的部分,我還要詳細的闡述。


1.非FAT格式下,讀寫(xiě)U盤(pán)
如果我們不按照FAT格式讀寫(xiě)U盤(pán)的話(huà),其實(shí)很簡(jiǎn)單,我在以前的帖子中也一再堅持,就是將CF卡和U盤(pán)當作一個(gè)無(wú)限大的外部RAM,那么這種模式下,U盤(pán)和CF卡與普通的外部擴展RAM的區別就僅僅是讀寫(xiě)U盤(pán)的時(shí)候,不能一個(gè)字節一個(gè)自己的來(lái),必須一次512B,不能通過(guò)地址總線(xiàn)找到每一個(gè)RAM字節的存放地址,而必須是一個(gè)扇區一個(gè)扇區的來(lái)。如果能夠接受這一點(diǎn),那么,你就可以通過(guò)單片機讀寫(xiě)U盤(pán)了。當然這還需要主意一些問(wèn)題,就是你不能隨意的存儲和讀寫(xiě)你的數據,你必須接受U盤(pán)的要求。其實(shí)這些要求也很簡(jiǎn)單,就是不能往FAT表的扇區寫(xiě)任何數據,否這,你的U盤(pán)就崩潰了,在WINDOWS下就識別不出來(lái)了,我就干過(guò)這種事情,往U盤(pán)的FAT表和FAT備份表寫(xiě)了一數據,最后的結果是U盤(pán)往PC機的USB口一插,計算機就死機,原因就是WINDOWS不能識別U盤(pán),而U盤(pán)本身沒(méi)有壞,就是說(shuō)USB通信沒(méi)有問(wèn)題,有問(wèn)題的是FLASH的扇區,讓我寫(xiě)壞了,而寫(xiě)壞的部分恰恰是FAT表,這是一個(gè)災難性的錯誤,解決的辦法就是憑著(zhù)各種資料,把FAT表的格式和數據通過(guò)單片機再寫(xiě)回去,呵呵,我用了一個(gè)上午的時(shí)間來(lái)拯救我那可憐的U盤(pán)。如果你注意了以上的問(wèn)題,那么好,就可以準備用單片機讀寫(xiě)U盤(pán)了。前面我也說(shuō)了,用單片機讀寫(xiě)U盤(pán),必須一個(gè)扇區一個(gè)扇區的來(lái)。也就是說(shuō),我們讀寫(xiě)的最小單位就是一個(gè)扇區512B。那么就必須要求你的單片機能夠提供至少512B的RAM,我這里選用的是STC89C54RD,這個(gè)單片機能夠滿(mǎn)足我的要求,此單片機具體的信息可以查詢(xún),就不給廠(chǎng)家做廣告了。那么就是讀寫(xiě)的地址的問(wèn)題了。此中模式下,最關(guān)鍵的問(wèn)題就是用單片機把數據存進(jìn)去,或者讀出來(lái),那么我們這個(gè)地址怎么設置,如果用匯編51的話(huà),就是DPL1,DPH1,DPL0,DPH0怎么設置應該設置成什么?其實(shí)這也就是FLASH的地址,就是U盤(pán)數據的存放地址,如果我們用4個(gè)8位的數據來(lái)表示所有的FLASH的話(huà),就是FFFFFFFF,那么我們尋址的范圍就是200G,這么大的空間,我們怎么確定呢,jnmcu.com有些資料,可以查看。我在這里簡(jiǎn)單的說(shuō)明一下:?jiǎn)纹瑱C寫(xiě)入地址=相關(guān)扇區號+32  轉換成4個(gè)十六進(jìn)制就可以,就是單片機的外部訪(fǎng)問(wèn)地址。其中最關(guān)鍵的就是相關(guān)扇區號,硬盤(pán)的存儲單位不應該是扇區,而是“簇”,而單片機讀寫(xiě)地址的關(guān)聯(lián)卻是扇區,應此我們還必須找清楚簇號和扇區號的關(guān)系。這種關(guān)系的找法有很多中,我參考了大量的資料總結了一下,就是FAT表的第一個(gè)扇區和第一個(gè)簇指的是同一個(gè)地方,哈哈,有的讀者已經(jīng)明白了,既然第一個(gè)扇區和第一個(gè)簇指的是同一個(gè)地方,那么他們的計算公式一相等,就可以得出簇和扇區的關(guān)系,在這里我總結的關(guān)系是:數據首扇區地址=(文件起始簇號-根目錄簇)*每簇扇區數目+根目錄扇區,這個(gè)關(guān)系是一個(gè) 不變的關(guān)系,不管你是8M的U盤(pán)或者CF卡,還是200G的硬盤(pán),這個(gè)關(guān)系肯定不變,有了這個(gè)關(guān)系,我們就可以根據簇璉來(lái)找扇區,找到扇區,轉換成4個(gè)16進(jìn)制的數據,就是單片機的讀寫(xiě)地址了。至此就完成了單片機讀寫(xiě)U盤(pán)的所有準備工作。但是這種模式下讀寫(xiě)出來(lái)的數據不是FAT格式,但是卻是一種實(shí)用,簡(jiǎn)單的讀寫(xiě)方式,我覺(jué)得這種方式很好。

2.FAT格式下單片機讀寫(xiě)U盤(pán)/cf卡
我在做這個(gè)項目的時(shí)候將大部分時(shí)間都花在研究硬盤(pán)的FAT分區格式上,因為U盤(pán)和CF卡的物理結構和數據分布結構和PC硬盤(pán)的結構完全一樣,而又沒(méi)有系統的資料和書(shū)來(lái)介紹U盤(pán)的結構,所以我就仔細研究了一下硬盤(pán)的數據結構,JNMCU.COM 有一些U盤(pán)的資料,也不是太全面。通過(guò)仔細的查看硬盤(pán)的結構,我們就會(huì )發(fā)現硬盤(pán)的分布結構是固定的,有它自己的規律,我們掌握了這種規律就可以一步一步來(lái)分析?,F在有很多廠(chǎng)家和公司提供單片機讀寫(xiě)U盤(pán)的子程序庫,我當時(shí)看一下,不大喜歡他們做的程序庫,首先他們的程序不公開(kāi),也就是說(shuō),我們想學(xué)習的話(huà),只能學(xué)習他們子程序的用法,再有,他們做的容錯機制太多,做的處理太負責,應此光光他們的程序庫就20多K,而我們單片機的硬件資源是很有限的FLASH都不是太大,我們還要留著(zhù)自己的代碼空間進(jìn)行數據處理,應此,子程序庫我不推薦使用。我覺(jué)得,找到其中的規律按照規律編寫(xiě)自己的代碼是很方便的。也有的同仁要說(shuō),你做的程序穩定嗎?可靠嗎?FAT需要很多容錯機制的,我想說(shuō),沒(méi)用,一旦出了錯,就是在好多容錯機制都已經(jīng)于事無(wú)補了,最好的辦法,就是做好系統后,自己多測試,我做的便攜式心電監護儀,一次采集30M的數據,數據格式就是1.TXT,就是一個(gè)記事本,我聯(lián)系測試了1個(gè)月,沒(méi)有發(fā)生一次數據存儲不穩的情況,現在這個(gè)產(chǎn)品已經(jīng)廣泛應用在醫療設備中。所以,不要說(shuō)你考慮的了就是好事,我認為,先作出來(lái),然后多做測試,自己心中就不會(huì )心虛?,F在詳細的將一下FAT的數據結構。硬盤(pán)的物理結構應該是FAT表的BPB表-FAT表-FAT表的備份表-FDT表(根目錄扇區)-DATA區。找到這些規律,我們關(guān)心其實(shí)就是DATA區。進(jìn)行尋址的方式就是簇璉尋址的方法。首先要找到U盤(pán)的FAT表的BPB表,這里有U盤(pán)最基本的信息,包括每扇區自己數,每簇扇區數,保留扇區數,FAT表的數目,每個(gè)FAT表的扇區數,根目錄其實(shí)簇號等最基本最重要的信息。找到這個(gè)信息后,通過(guò)扇區和簇的關(guān)系(前面已經(jīng)將過(guò)),就可以找到文件的FDT表的第一個(gè)扇區的第一個(gè)簇,找到這些數據以后就號辦了。就可以按照硬盤(pán)的簇璉尋址方法進(jìn)行讀寫(xiě)了。

 以上是本人在開(kāi)發(fā)便攜式心電監護儀中單片機讀寫(xiě)U盤(pán)的一點(diǎn)心得和開(kāi)發(fā)筆記,希望行家里手多多指正,也希望剛剛開(kāi)始開(kāi)發(fā)的同行多多交流



關(guān)鍵詞: CF卡 U盤(pán) 單片機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>