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