基于單片機(jī)和FAT16的SD卡讀寫(xiě)系統(tǒng)設(shè)計(jì)
主引導(dǎo)記錄區(qū)(Main BootRecord,MBR)位于物理磁盤(pán)第零扇區(qū)。MBR中有硬盤(pán)分區(qū)記錄表(Disk Partition Table,DPT),DPT記錄了各邏輯分區(qū)的相對(duì)偏移。SD卡不支持多分區(qū),在1個(gè)SD卡中只有1個(gè)分區(qū),因此在SD卡上的DPT只有1個(gè)分區(qū)表項(xiàng)被占用。系統(tǒng)引導(dǎo)記錄區(qū)(DOS Boot Record,DBR)位于磁盤(pán)邏輯分區(qū)的第0扇區(qū),是操作系統(tǒng)可以訪問(wèn)的第1個(gè)扇區(qū),它其中包含1個(gè)稱為BPB(Bios Parameter Block)的本分區(qū)參數(shù)記錄表。BPB記錄著本分區(qū)的根目錄大小、FAT、個(gè)數(shù)、磁盤(pán)介質(zhì)描述、分配單元大小等重要參數(shù)。
DBR之后是FAT(File Allocation Table,文件分配記錄表),記錄文件在磁盤(pán)上的存儲(chǔ)位置。在Windows系統(tǒng)中,文件存儲(chǔ)的單位是簇而不是字節(jié),1個(gè)文件不是連續(xù)地存放于磁盤(pán)的某一區(qū)域,而往往分成若干段,像鏈子一樣存放。FAT表記錄了每個(gè)文件的起始簇號(hào)、后繼簇號(hào)和終止簇號(hào)。FAT表中的每個(gè)表項(xiàng)對(duì)應(yīng)數(shù)據(jù)存儲(chǔ)區(qū)中的1個(gè)簇,由于FAT表對(duì)文件管理的重要性,F(xiàn)AT表有1個(gè)備份。
DIR是根目錄區(qū),緊接著第2個(gè)FAT表(FAT2)之后,記錄著根目錄下每個(gè)文件的起始簇號(hào)、大小等屬性。操作系統(tǒng)根據(jù)DIR中文件的起始簇號(hào)和大小,結(jié)合FAT表來(lái)定位文件。FAT16文件系統(tǒng)中1個(gè)文件的存儲(chǔ)示意圖如圖5所示。
3.2 SD卡指令規(guī)范
單片機(jī)通過(guò)相應(yīng)指令與SD卡進(jìn)行交互。SD卡有特定的指令格式,都是6字節(jié)長(zhǎng),最高有效位(MSB)傳輸優(yōu)先,如圖6所示。
SD卡指令的最高2位“01”是SD卡指令的開(kāi)始標(biāo)志,最后1位“1”是結(jié)束標(biāo)志。6位的指令是SD卡的指令序號(hào),例如CMD17的6位指令即17的二進(jìn)制表示010001。指令參數(shù)占4字節(jié),具體內(nèi)容參照SD卡規(guī)范。7位CRC校檢的生成多項(xiàng)式為G(x)=x7+x3+1。事實(shí)上SD卡在進(jìn)入SPI模式后,不再通過(guò)CRC碼來(lái)確認(rèn)指令的傳輸正確與否,指令中的7為CRC校檢,只在SD模式下起作用。因此僅SD卡上電后的第1條切換SPI模式指令CMd0 需要校檢碼,而此校檢碼是固定的0x95,其他指令的CRC均置1即可。SD卡響應(yīng)有4種格式,不同指令對(duì)應(yīng)不同響應(yīng),具體內(nèi)容可參看SD卡規(guī)范。
3.3 SD卡讀寫(xiě)驅(qū)動(dòng)
3.3.1 SPI時(shí)序模擬
用軟件來(lái)模擬SPI總線的具體方法是:將SCK的初始狀態(tài)置0,允許接收后(即CS置0)將SCK置1,這樣單片機(jī)由DI線輸出1位數(shù)據(jù)到SD卡;接著再將SCK置0,單片機(jī)由DO線從SD卡讀1位數(shù)據(jù)。至此,模擬1位數(shù)據(jù)輸入輸出完成。此后再將SCK置1,依次循環(huán)8次,完成SPI總線1字節(jié)數(shù)據(jù)的輸入輸出。
以下是本系統(tǒng)軟件模擬SPI時(shí)序的匯編代碼。以通用寄存器A作為函數(shù)參數(shù),實(shí)現(xiàn)將寄存器A中的數(shù)據(jù)通過(guò)SPI總線發(fā)送出去,并將從SPI總線讀到的數(shù)據(jù)存到寄存器A中。
pos機(jī)相關(guān)文章:pos機(jī)原理
評(píng)論