淺談dsPIC33F系列DSC的SD存儲卡接口設(shè)計
引 言
本文引用地址:http://cafeforensic.com/article/149885.htmSD卡是Secure Digital Card卡的簡稱,直譯成漢語就是“安全數(shù)字卡”,是由日本松下公司、東芝公司和美國SANDISK公司共同開發(fā)研制的全新的存儲卡產(chǎn)品。SD存儲卡是一個完全開放的標(biāo)準(zhǔn)(系統(tǒng)),多用于MP3、數(shù)碼攝像機、數(shù)碼相機、電子圖書、AV器材等等,尤其是被廣泛應(yīng)用在超薄數(shù)碼相機上。SD卡在外形上同MultiMedia Card卡保持一致,大小尺寸比MMC卡略厚,容量也大很多。并且兼容MMC卡接口規(guī)范。不由讓人們懷疑SD卡是MMC升級版。另外,SD卡為9引腳,目的是通過把傳輸方式由串行變成并行,以提高傳輸速度。它的讀寫速度比MMC卡要快一些,同時,安全性也更高。SD卡最大的特點就是通過加密功能,可以保證數(shù)據(jù)資料的安全保密。它還具備版權(quán)保護(hù)技術(shù),所采用的版權(quán)保護(hù)技術(shù)是DVD中使用的CPRM技術(shù)(可刻錄介質(zhì)內(nèi)容保護(hù))。
SD卡身材小巧,一般消費者在購買之前不會有太多了解,因此從外觀上辨別有些困難,下面為大家介紹一下市場上常見的SanDisk牌SD卡真假的辨別方法: 首先是看存儲卡本身, sandisk正品儲存卡都在正面貼有激光變彩標(biāo)簽,不同角度都會產(chǎn)生激光色彩變化。其次是國內(nèi)代理的行貨正品卡,均采用了與上面相類似的塑料封裝的包裝形式,但是右下的“5年保證”的字樣和日文均改為了圖形表明的5年質(zhì)保。另外,還可以從SD卡底部是否有缺口來進(jìn)行最簡單識別,由于正品 SanDisk 牌 SD 卡背面產(chǎn)地上方的編號是惟一的,并可通過 800 電話查詢真?zhèn)危珦?jù)說這一查詢系統(tǒng)目前尚未做好。
Microchip公司的DSPIC33F系列通用DSC(數(shù)字信號控制器),是在16位MCU架構(gòu)基礎(chǔ)之上添加了DSP引擎,從而具有數(shù)字信號處理功能的微控制器產(chǎn)品。該系列DSC集成了DCI(數(shù)據(jù)轉(zhuǎn)換器)接口,尤其適用于語音和音頻的應(yīng)用。
本文首先簡要介紹SD卡的相關(guān)規(guī)范,之后利用dsPIC33FJ64GP706通用DSC設(shè)計了SD卡接口電路,最后通過SPI模式實現(xiàn)了對SD卡的基本操作。
1 SD卡相關(guān)規(guī)范簡介
SD聯(lián)盟在2000年聯(lián)合發(fā)布了SD卡規(guī)范1.O版本,包括3個部分:物理層規(guī)范,文件系統(tǒng)規(guī)范以及安全規(guī)范。SD卡規(guī)范V1.0采用FAT的文件系統(tǒng),因此最大存儲容量可以達(dá)到2 GB。2006年,SD卡規(guī)范V2.0發(fā)布。新規(guī)范根據(jù)容量定義了兩種卡,即標(biāo)準(zhǔn)容量SD卡和大容量SD卡。前者和1.O版本保持兼容,后者由于采用了FAT32文件系統(tǒng),存儲容量突破了2 GB的限制。新規(guī)范定義的最大容量為32 GB。但是由于成本的原因,標(biāo)準(zhǔn)容量SD卡仍然是市場的主流產(chǎn)品。在以微控制器為核心的嵌入式系統(tǒng)中,主要使用SD卡的SPI。微控制器是將微型計算機的主要部分集成在一個芯片上的單芯片微型計算機。微控制器誕生于20世紀(jì)70年代中期,經(jīng)過20多年的發(fā)展,其成本越來越低,而性能越來越強大,這使其應(yīng)用已經(jīng)無處不在,遍及各個領(lǐng)域。例如電機控制、條碼閱讀器/掃描器、消費類電子、游戲設(shè)備、電話、HVAC、樓宇安全與門禁控制、工業(yè)控制與自動化和白色家電(洗衣機、微波爐)等。
1.1 概 述
SD存儲卡在2.7~3.6 V電壓下正常工作,工作頻率為0~25MHz。圖1是普通SD卡的外形和引腳排列。在SPI模式時,第8和第9腳不使用。表1列出了各引腳在SPI模式時的定義和功能描述。
圖中的WP是一個機械滑片,通過滑動到不同的位置來對SD卡進(jìn)行寫保護(hù)。
SD卡內(nèi)部有6個和接口相關(guān)的寄存器:OCR、CID、CSD、RCA、DSR和SCR。它們只能通過各自對應(yīng)的指令來訪問。
1.2 SPI協(xié)議
系統(tǒng)上電之后,如果主機在將CS線聲明為低電平的同時發(fā)送復(fù)位指令(CMDO),則SPI模式啟用。SD卡在SPI模式下按字節(jié)進(jìn)行通信,每一個指令和數(shù)據(jù)塊都由數(shù)個字節(jié)組成并與CS信號對齊(也就是長度為8個時鐘周期的整數(shù)倍)。
主機和SD卡之間是通過指令與響應(yīng)來實現(xiàn)交互的。
圖2給出了SPI模式下基本的指令與響應(yīng)的時序。
圖中一個方格代表一個字節(jié),H為邏輯全“1”,L為邏輯全“O”,X代表未知,Z為高阻態(tài)。NCS、NEC和NCR都是包含N個8時鐘周期,具體N的取值范圍在SD卡規(guī)范中給出了詳細(xì)的說明。
SD卡所有的指令,長度都是6字節(jié)。表2列出了指令格式。
在有效接收到主機發(fā)來的指令之后,SD卡將會把對應(yīng)的響應(yīng)數(shù)據(jù)段放在總線上,主機根據(jù)響應(yīng)的內(nèi)容判斷SD卡的狀態(tài)。所有的響應(yīng)都是MSB優(yōu)先傳輸。SD卡有4種類型的響應(yīng)格式,分別為R1、R1b、R2、R3。
除了SEND_STATUS和READ_OCR指令外,其他指令的響應(yīng)都是格式R1。格式R1的長度為1字節(jié),并且最高位總是0。其余每位均是錯誤指示,在指令接收過程中發(fā)生了什么樣的錯誤,對應(yīng)的錯誤位就會是“1”。R1b和R1具有相同的格式,它將伴隨一個附加的busy信號。busy信號的長度可以是任意個字節(jié)。全零表示卡處在“忙”的狀態(tài)。格式R2的長度為2字節(jié),它是指令SEND_STATUS的響應(yīng)。它的高字節(jié)和R1相同,低字節(jié)同樣作為狀態(tài)指示。
在SD卡規(guī)范中詳細(xì)描述了每條指令的格式內(nèi)容及作用,并給出了各條指令所對應(yīng)的響應(yīng)。對于每種響應(yīng)的信息也有詳細(xì)的說明,具體信息參閱參考文獻(xiàn)。
2 SD卡接口電路設(shè)計
16位的dsPIC33F系列DSC具有高達(dá)40 MIPS的指令周期,繼承了Microchip公司之前8位和16位MCU產(chǎn)品的優(yōu)點,并保持著對以往低成本開發(fā)系統(tǒng)的兼容性。dsPIC33FJ64GP706是其中一款64引腳的通用產(chǎn)品,擁有高達(dá)64 KB的Flash程序存儲器和16 KB的數(shù)據(jù)存儲器。
圖3所示為dsPIC33FJ64GP706與SD卡座的接口電路。為了防止在無卡接入或卡驅(qū)動器呈高阻態(tài)時總線懸空,在每根信號線上要接一個上拉電阻,根據(jù)SD卡規(guī)范(見參考文獻(xiàn),第6章),電阻的阻值可以取10~90kΩ。卡座的CD引腳是SD卡檢測信號引腳,當(dāng)有卡插入時,該引腳對地短路。WP是寫保護(hù)信號引腳,在卡插入且沒有寫保護(hù)時,該引腳對地短路;如果SD卡寫保護(hù)或沒有卡插入,該引腳通過上拉電阻接到電源正極。
3 SD卡接口的實現(xiàn)
3.1 選擇SD卡的SPI模式并初始化SD卡
在上電之后,主機開始發(fā)送時鐘信號,此時的時鐘頻率不能超過400 kHz。主機要連續(xù)發(fā)送至少74個時鐘周期的“1”才能使SD卡準(zhǔn)備好通信,然后選擇SPI模式。SD卡進(jìn)入SPI模式之后,就可以接收來自主機的操作指令了。這時候主機發(fā)送SEND_OP_COND指令,激活卡的初始化過程。在得到正確的響應(yīng)之后,主機再發(fā)送SEND_CSD指令讀取CSD寄存器的內(nèi)容。
3.2 指令和響應(yīng)交互過程的軟件實現(xiàn)
typSD_CMD是自定義的結(jié)構(gòu)類型,包含指令索引、CRC和響應(yīng)格式。最后一個字節(jié)數(shù)據(jù)用來說明該指令有無后續(xù)數(shù)據(jù)塊,例如READ_SINGLE_BLOCK(單數(shù)據(jù)塊讀指令),它需要SD卡發(fā)送一個數(shù)據(jù)塊的數(shù)據(jù),因此其后的數(shù)據(jù)為“1”。對于指令索引,是把開始位和傳輸位與6位索引值包含在一起的數(shù)據(jù)。例如G0_IDLE_STATE的索引值是二進(jìn)制“000000”,加上開始位“O”和傳輸位“1”,成為“01000000”,即“Ox40”,READ_SINGLE_BLOCK的索引值是“010001”,加上開始位和傳輸位,成為“01010001”即0x51”。
定義發(fā)送指令函數(shù)為SendSDCmd(),返回值為從總線上讀取的響應(yīng)數(shù)據(jù)。(具體函數(shù)略——編者注)函數(shù)的第一個參數(shù)是指令列表數(shù)組中相應(yīng)指令元素的序號,函數(shù)會根據(jù)它的值在指令表中查到對應(yīng)的信息,第二個參數(shù)是指令的附加內(nèi)容。函數(shù)中CMD_PACKET是按指令格式(見表2)定義的聯(lián)合類型,程序通過查表的方式將指令的內(nèi)容裝載到該類型定義的變量中,并通過函數(shù)Write_sd()發(fā)送出去。write_sd()的作用是把一個字節(jié)的數(shù)據(jù)放到SPI2模塊的burfer里,完成一個字節(jié)的發(fā)送。函數(shù)ReadSd()用來讀取SPI2接收的一個字節(jié)數(shù)據(jù)。
以上程序按照圖2所示時序執(zhí)行,來實現(xiàn)一次指令和響應(yīng)數(shù)據(jù)的交互。當(dāng)某條指令有后續(xù)數(shù)據(jù)時,按照規(guī)范中的時序發(fā)送或者讀取數(shù)據(jù)。
3.3 讀寫操作的實現(xiàn)
READ_SINGLE_BLOCK是單數(shù)據(jù)塊讀指令,在接收到有效的讀指令后SD卡將會送出一個響應(yīng)。緊接著是一個帶16位CRC校驗后綴的數(shù)據(jù)塊,數(shù)據(jù)塊的長度要在之前由SET_BLOCKEN(CMDl6)指令定義,一般為512字節(jié),正好一個扇區(qū)的大小。該操作的通信過程如圖4所示。
WRITE_SINGLE_BLOCK是單數(shù)據(jù)寫操作指令,在接收到主機傳來的數(shù)據(jù)后,SD卡會發(fā)送一個值為0x5的數(shù)據(jù)響應(yīng),之后進(jìn)入busy狀態(tài)。該操作的通信過程如圖5所示。
按照以上通信過程編寫程序,單數(shù)據(jù)塊讀和寫的程序流程如圖6所示。
4 結(jié)果驗證
將容量為1 GB的SD卡插入SD讀卡器,再將讀卡器插入PC機的USB接口中,此時系統(tǒng)出現(xiàn)“可移動磁盤(H:)”根目錄。打開winhex軟件,點擊“工具”下拉菜單中的“打開磁盤”,選擇“物理磁盤”中的“RMl:Ceneric STORAGE DEVICE(O.9G,USB)”,單擊“確定”按鈕,得到該SD卡第一個物理扇區(qū)的數(shù)據(jù)。該SD卡在偏移量從446開始的16個字節(jié)有數(shù)據(jù)“00 03 3D 00 06 OD ED DB F9 00 00 OO 07 5F 1E 00”,該扇區(qū)結(jié)束的兩個字節(jié)為“55AA”,其余部分?jǐn)?shù)據(jù)均為“00”。
將SD卡取出,插入本設(shè)計電路的SD卡座中,用示波器連接D0、CLK和DI線,接通電源,測量SPI總線上的波形。
本設(shè)計利用dsPIC33FJ64GP706的SPI接口實現(xiàn)了對SD存儲卡的操作,可以把SD卡和dsPIC33F系列DSC兩方面的優(yōu)點集中到一個嵌入式系統(tǒng)中,有較高的利用價值。
上拉電阻相關(guān)文章:上拉電阻原理
評論