郭剛,米文鵬,董巍巍,胡禮勇
(第二炮兵青州士官學(xué)校,262500 青州)
FM24C256鐵電存儲(chǔ)器具有非易失性和高可靠性,且結(jié)構(gòu)簡(jiǎn)單,因此被廣泛地應(yīng)用于手持振動(dòng)信號(hào)采集儀器中,作為數(shù)據(jù)采集存儲(chǔ)器使用。當(dāng)需要將鐵電存儲(chǔ)器中的數(shù)據(jù)傳送到上位機(jī)時(shí),目前的做法大多是通過(guò)串口或者USB接口連接采集器和上位機(jī),上位機(jī)通過(guò)專(zhuān)門(mén)的軟件接收數(shù)據(jù)。這樣做需要進(jìn)行線路連接,而且數(shù)據(jù)傳輸時(shí)間長(zhǎng)、可靠性低。
SD卡(Secure Digital Memory Card)是由日本松下、東芝及美國(guó)SanDisk公司于1999年 8月共同開(kāi)發(fā)研制的,一種基于半導(dǎo)體快速閃存的新一代記憶設(shè)備。它具備體積重量小、存儲(chǔ)容量大、數(shù)據(jù)傳輸快等諸多優(yōu)點(diǎn),支持SD和SPI兩種數(shù)據(jù)讀寫(xiě)模式,很容易和具有SPI接口的單片機(jī)進(jìn)行數(shù)據(jù)交互[1]。因此,先將鐵電存儲(chǔ)器中的數(shù)據(jù)以文件形式傳輸?shù)絊D卡上,再由上位機(jī)通過(guò)讀卡器讀取SD卡中的數(shù)據(jù),逐漸成為一種廉價(jià)、便捷、高效的采集數(shù)據(jù)傳輸方案。本文介紹了一種利用ATmega64L的TWI和SPI接口,快速地實(shí)現(xiàn) FM24C256鐵電存儲(chǔ)器數(shù)據(jù)向SD卡傳輸?shù)囊环N方法。
本系統(tǒng)采用Atmel公司AVR系列的ATmega64L單片機(jī)作為控制核心。ATmega64L為基于RISC結(jié)構(gòu)的8位低功耗CMOS微處理器,大部分指令都可以在一個(gè)時(shí)鐘周期內(nèi)完成,最高可支持16 MHz的系統(tǒng)時(shí)鐘;具有片載64 KB的在系統(tǒng)內(nèi)可編程Flash、2 KB EEPROM 、4 KB SRAM,以及53個(gè)通用I/O口線、32個(gè)通用工作寄存器和串口、SPI接口、TWI接口等豐富的外圍接口電路。[2]
FM24C256是用先進(jìn)的鐵電技術(shù)制造的256 Kb的非易失性存儲(chǔ)器。它可以以總線速度進(jìn)行寫(xiě)操作,掉電后可以保存10年,可以承受超過(guò)100億次的讀寫(xiě)操作,同時(shí)具有功耗低、可靠性高、結(jié)構(gòu)簡(jiǎn)單等諸多優(yōu)點(diǎn),特別適合用作嵌入式手持?jǐn)?shù)據(jù)采集系統(tǒng)的數(shù)據(jù)存儲(chǔ)器。
系統(tǒng)硬件結(jié)構(gòu)框圖如圖1所示,本文只研究虛線框內(nèi)的部分。
圖1 系統(tǒng)硬件結(jié)構(gòu)框圖
ATmega64L單片機(jī)內(nèi)部集成了 TWI(Two-Wire SerialInterface)接口模塊。TWI由總線接口單元、比特率發(fā)生器、地址匹配單元和控制單元等幾個(gè)子模塊組成。該總線只需兩個(gè)上拉電阻,使用時(shí)鐘線 SCL和數(shù)據(jù)線SDA就可以將128個(gè)不同的具有TWI接口的設(shè)備連接到一起。TWI接口是面向字節(jié)和基于中斷的,所有的總線事件都會(huì)產(chǎn)生一個(gè)TWI中斷。由于TWI接口是基于中斷的,因此TWI接口在字節(jié)發(fā)送和接收過(guò)程中不需要應(yīng)用程序干預(yù),而且支持主機(jī)和從機(jī)操作,數(shù)據(jù)傳輸頻率高達(dá)400 kHz[2]。
鐵電存儲(chǔ)器 FM24C256的 SCL、SDA引腳分別和ATmega64L單片機(jī)的SCL(PD0)、SDA(PD1)引腳連接,并且分別通過(guò)1個(gè)6.8 kΩ的上拉電阻連接到+5 V電源;寫(xiě)保護(hù)引腳VP則與單片機(jī)的PD4引腳連接,以控制鐵電存儲(chǔ)器的寫(xiě)保護(hù)狀態(tài)。
SPI[2]接口是一種同步串行外設(shè)接口,允許CPU與各種外圍接口器件以串行方式進(jìn)行通信、交換信息。它使用4條線:串行時(shí)鐘線(SCK)、主機(jī)輸入/從機(jī)輸出線(MISO)、主機(jī)輸出/從機(jī)輸入線(MOSI)、低電平有效的使能信號(hào)線(SS)。ATmega64L自帶的SPI接口具有全雙工、3線同步數(shù)據(jù)傳輸、主機(jī)或從機(jī)操作、LSB首先發(fā)送或MSB首先發(fā)送、7種可編程的比特率、傳輸結(jié)束中斷、寫(xiě)碰撞標(biāo)志檢測(cè)、可以從閑置模式喚醒等特點(diǎn)。以ATmega64L為SPI的主設(shè)備時(shí),用戶(hù)只需編程控制SS引腳,向SPI數(shù)據(jù)寄存器寫(xiě)入數(shù)據(jù)(即啟動(dòng)SPI時(shí)鐘),傳輸結(jié)束后SPI時(shí)鐘停止,傳輸結(jié)束標(biāo)志SPIF置位。
SD 卡的 1(CS)、2(DI)、5(SCLK)、7(DO)引腳分別和ATmega64L單 片機(jī) 的 PB0(SS)、PB2(MOSI)、PB1(SCK)、PB3(MISO)引腳連接。其中,2和7引腳還分別通過(guò)一個(gè)10 kΩ的上拉電阻連接到+3.3 V電源;VDD引腳連接+3.3 V電源;3和6引腳接地;8、9引腳不連接。
FAT32指的是文件分配表(File Allocation Table,FAT)采用32位二進(jìn)制數(shù)記錄管理的文件系統(tǒng)。FAT32文件系統(tǒng)將邏輯盤(pán)的空間劃分為3個(gè)部分:引導(dǎo)區(qū)(BOOT)、文件分配表區(qū)(FAT)和數(shù)據(jù)區(qū)(DATA)。引導(dǎo)區(qū)和文件分配表區(qū)又合稱(chēng)為“系統(tǒng)區(qū)”。
引導(dǎo)區(qū)(BOOT區(qū))從第1個(gè)扇區(qū)(邏輯扇區(qū)0)開(kāi)始,使用3個(gè)扇區(qū),之后還留有若干個(gè)保留扇區(qū),共占用32個(gè)扇區(qū)。其中,第1個(gè)扇區(qū)中的BPB參數(shù)塊記錄分區(qū)的起始扇區(qū)、結(jié)束扇區(qū)、文件存儲(chǔ)格式、硬盤(pán)介質(zhì)描述符、根目錄大小、FAT個(gè)數(shù)、分配單元大小等重要參數(shù)。
文件分配表(FAT)從邏輯扇區(qū)1開(kāi)始,是文件管理系統(tǒng)用來(lái)給每個(gè)文件分配磁盤(pán)物理空間的表格。它由表標(biāo)識(shí)和簇映射的集合組成,一個(gè)完全相同的鏡像副本連續(xù)存儲(chǔ)在主FAT表后。文件分配表的作用就是跟蹤文件,具體描述整個(gè)磁盤(pán)分區(qū)中的每個(gè)存儲(chǔ)單元(簇)的使用情況、文件數(shù)據(jù)的簇存儲(chǔ)情況(連續(xù)或碎片),以及樹(shù)型目錄結(jié)構(gòu)。文件分配表實(shí)際上就是一個(gè)卷中所有簇使用情況的映射表,每個(gè)文件、目錄都同表中的若干項(xiàng)具有對(duì)應(yīng)聯(lián)系,并在目錄中進(jìn)行索引。
FAT之后的根目錄區(qū)用來(lái)記錄整個(gè)磁盤(pán)上所有文件的有用信息,其中每一個(gè)文件占32字節(jié),包括文件名、文件屬性、文件的修改時(shí)間和文件的長(zhǎng)度等[3]。由于FAT32文件系統(tǒng)對(duì)文件的概念進(jìn)行了擴(kuò)展,根目錄也看作是文件,根目錄區(qū)自然屬于數(shù)據(jù)區(qū)的一部分,并位于數(shù)據(jù)區(qū)之首。根目錄區(qū)后面的其他數(shù)據(jù)區(qū),用來(lái)存儲(chǔ)組成各個(gè)文件的數(shù)據(jù)信息。
ATmega64L通過(guò)片內(nèi)的 TWI和SPI接口分別對(duì)鐵電存儲(chǔ)器和SD卡進(jìn)行基本讀寫(xiě)操作的方法,在許多文章[3-5]中已有詳實(shí)介紹。這里僅給出自行編寫(xiě)的相應(yīng)功能函數(shù)。其中,SLA是鐵電地址,suba是子地址,Wdata是要寫(xiě)入的數(shù)據(jù),sector是扇區(qū)地址,buffer是數(shù)據(jù)緩存數(shù)組。
2.3.1 SD卡初始化
選擇1個(gè)目前非常普及的2 GB SD卡,通過(guò)USB讀卡器連接上位機(jī);按FAT32格式對(duì)其進(jìn)行格式化,并把預(yù)先建立的每個(gè)64 KB的標(biāo)準(zhǔn)文本文件1.txt、2.txt、3.txt和4.txt依次復(fù)制到SD卡上。通過(guò)磁盤(pán)軟件WinHex查看SD卡中的信息,如圖2所示。
圖2明確顯示,初始化完成后的SD卡每個(gè)扇區(qū)包含 512字節(jié),每個(gè)簇包含4 096字節(jié)(即每個(gè)簇包含 8個(gè)扇區(qū)),整張SD卡包含490 557個(gè)簇;4個(gè).txt文件的容量大小都是64 KB,在SD卡上的起始扇區(qū)號(hào)分別為7712、7840、7968、8096;每個(gè)文件占據(jù) 16 個(gè)連續(xù)的簇,即占用128個(gè)連續(xù)的扇區(qū)。
圖2 扇區(qū)和簇容量關(guān)系圖
2.3.2 數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)
ATmega64L單片機(jī)采集到的每個(gè)電壓信號(hào)經(jīng)10位A/D轉(zhuǎn)換后存放在鐵電中,占用2個(gè)連續(xù)的字節(jié),而 SD卡數(shù)據(jù)區(qū)的1個(gè)字節(jié)對(duì)應(yīng)著文本文件中的1個(gè)字符。它們的轉(zhuǎn)化關(guān)系如圖3所示。
圖3 鐵電—SD卡數(shù)據(jù)存儲(chǔ)轉(zhuǎn)化關(guān)系圖
利用SD卡初始化后的文件結(jié)構(gòu)和ATmega64L對(duì)鐵電存儲(chǔ)器/SD卡的底層讀寫(xiě)函數(shù),每次從鐵電存儲(chǔ)器中讀出連續(xù)的256字節(jié)采樣數(shù)據(jù)(128個(gè)采樣點(diǎn)數(shù)據(jù)),轉(zhuǎn)化成512字節(jié)數(shù)據(jù)存放在緩沖數(shù)組中,然后再把這些數(shù)據(jù)寫(xiě)入SD卡對(duì)應(yīng)物理地址的一個(gè)扇區(qū)。按照順序重復(fù)上述過(guò)程,便可輕松實(shí)現(xiàn)鐵電存儲(chǔ)器中的數(shù)據(jù)向SD卡的傳輸。本文使用一個(gè)函數(shù)來(lái)實(shí)現(xiàn)4塊鐵電存儲(chǔ)器的數(shù)據(jù)向4個(gè)文本文件的傳輸。
本文在分析FAT32文件格式的基礎(chǔ)上,利用AT-mega64L單片機(jī)對(duì)鐵電存儲(chǔ)器和SD卡物理地址的底層讀寫(xiě)函數(shù),實(shí)現(xiàn)了鐵電存儲(chǔ)器中二進(jìn)制數(shù)據(jù)到SD卡上的傳輸,并保存為文本文件,為上位機(jī)對(duì)采集數(shù)據(jù)的進(jìn)一步分析提供了便利。利用Windows操作系統(tǒng)完成了SD卡的文件系統(tǒng)的構(gòu)建,單片機(jī)只需完成二進(jìn)制數(shù)據(jù)的搬運(yùn),而不必進(jìn)行復(fù)雜的FAT32文件系統(tǒng)的操作,從而提高了操作速度和可靠性。
經(jīng)過(guò)實(shí)驗(yàn)驗(yàn)證,這種操作方法只需17 s便可把4塊鐵電存儲(chǔ)器中的 128 KB(64K個(gè)采樣數(shù)據(jù))的數(shù)據(jù)傳輸?shù)絊D卡上,傳輸結(jié)果準(zhǔn)確無(wú)誤。只要不格式化SD卡或者更改.txt文件,這張SD卡上的剩余空間完全可以像普通SD卡一樣正常使用。這為小型嵌入式手持?jǐn)?shù)據(jù)采集系統(tǒng)的數(shù)據(jù)導(dǎo)出,提供了一種簡(jiǎn)單且高效的方法。
[1]SanDisk Corporation.SanDisk Secure Digital Card Product Manual,2003-12:1,9.
[2]Atmel Corporation.8-bit AVR Microcontroller ATmega64/64L M anual,2008-05:1-6,163-170,198-226.
[3]李文明,張濤,鄭麗娜.AVR單片機(jī)讀寫(xiě)SD卡技術(shù)[J].電子測(cè)量與儀器學(xué)報(bào),2009(增刊):605-608.
[4]SD Group.SD Memory Card Specifications Physical Layer Specification.Version 1.0,2000-03.
[5]張洪濤,莫文承,李兵兵.基于SPI協(xié)議的SD卡讀寫(xiě)機(jī)制與實(shí)現(xiàn)方法[J].電子元器件應(yīng)用,2008,10(3):42-43,47.