版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.SD卡資料協(xié)議規(guī)范 2009-09-25 21:30:55 閱讀344 評論0 字號:大中小 這些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這里為大家總結(jié)了一下編寫該程序所需要的知識: 1.SD卡的官方資料(我承認這個資料很垃圾,比起民間的技術(shù)總結(jié)它的內(nèi)容可謂又臭又長,但是作為基礎(chǔ)也要了解一下,SD協(xié)議不用看) 2.清晰明了的MMC卡時序圖(雖然這個是MMC卡的,但是在初始化的時候CMD0的時序是一樣的)電路:我用的SD卡的電路其實很簡單,參考SD卡的官方資料中的電路鏈接就可以的。供電問題:由于SD卡的電壓是3.3V,所以你的CPU必須支持3.3V的IO端口輸出。再來說一說雞毛
2、蒜皮的細節(jié):1.為了使SD卡初始化進入SPI模式,我們需要使用的命令有3個:CMD0,ACMD41,CMD55(使用ACMD類的指令前應(yīng)先發(fā)CMD55,CMD55起到一個切換到ACMD類命令的作用)。2. 為什么在使用CMD0以后不使用CMD1?CMD1是MMC卡使用的指令,雖然本文并不想討論MMC卡的問題,但是我還是要說:為了實現(xiàn)兼容性,上電或者 發(fā)送CMD0后,應(yīng)該首先發(fā)送CMD55+ACMD41確認是否有回應(yīng),如果有回應(yīng)則為SD卡,如果等回應(yīng)超時,則可能是MMC卡,再發(fā)CMD1確認。3.正確的回應(yīng)內(nèi)容應(yīng)該是: CMD00x01(SD卡處于in-idle-state) CMD550x01(
3、SD卡處于in-idle-state) ACMD410x00(SD卡跳出in-idle-state,完成初始化準備接受下一條指令) 這里要說的是如果最后的回應(yīng)內(nèi)容還是0x01的話,可以循環(huán)發(fā)送CMD55+ACMD41,直到回應(yīng)的內(nèi)容0x00。4. 在所有的指令中,唯獨CMD0特殊,在向SD卡發(fā)送以前需要向SD卡發(fā)送74+個時鐘。那么為什么要74個CLK呢?因為在上電初期,電壓的上升過程據(jù) SD卡組織的計算約合64個CLK周期才能到達SD卡的正常工作電壓他們管這個叫做Supply ramp up time,其后的10個CLK是為了與SD卡同步,之后開始CMD0的操作,嚴格按照此項操作,一定沒有問
4、題。5.關(guān)于SD卡的SPI總線,在讀入數(shù)據(jù)時SD卡的SPI是CLK的上升沿輸入鎖存,輸出數(shù)據(jù)也是在上升沿。6.向SD卡寫入一個CMD或者ACMD指令的過程是這樣的:首先使CS為低電平,SD卡使能;其次在SD卡的Din寫入指令;寫入指令后還要附加8個填充時鐘,是SD卡完成內(nèi)部操作;之后在SD卡的Dout上接受回應(yīng);回應(yīng)接受完畢使CS為低電平,再附加8個填充時鐘。7.在SD卡的Din沒有數(shù)據(jù)寫入時,應(yīng)使Din保持高電平SD卡命令SD卡命令共分為12類,分別為class0到class11,不同的SDd卡,主控根據(jù)其功能,支持不同的命令集 如下Class0 :(卡的識別、初始化等基本命令集)CMD0:
5、復(fù)位SD 卡.CMD1:讀OCR寄存器.CMD9:讀CSD寄存器.CMD10:讀CID寄存器.CMD12:停止讀多塊時的數(shù)據(jù)傳輸CMD13:讀 Card_Status 寄存器Class2 (讀卡命令集):CMD16:設(shè)置塊的長度CMD17:讀單塊.CMD18:讀多塊,直至主機發(fā)送CMD12為止 .Class4(寫卡命令集) :CMD24:寫單塊.CMD25:寫多塊.CMD27:寫CSD寄存器 .Class5 (擦除卡命令集):CMD32:設(shè)置擦除塊的起始地址.CMD33:設(shè)置擦除塊的終止地址.CMD38: 擦除所選擇的塊.Class6(寫保護命令集):CMD28:設(shè)置寫保護塊的地址.CMD29
6、:擦除寫保護塊的地址.CMD30: Ask the card for the status of the write protection bitsclass7:卡的鎖定,解鎖功能命令集 class8:申請?zhí)囟罴?。class10 11 :保留其中class1,class3,class9:SPI模式不支持 SD卡接口的完整規(guī)范中小 特性: 容量:32MB/64MB/128MB/256MB/512MB/1GByte 兼容規(guī)范版本1.01 卡上錯誤校正 支持CPRM 兩個可選的通信協(xié)議:SD模式和SPI模式 可變時鐘頻率025MHz 通信電壓范圍:2.0-3.6V 工作電壓范圍:2.0-3.6
7、V 低電壓消耗:自動斷電及自動睡醒,智能電源管理 無需額外編程電壓 卡片帶電插拔保護 正向兼容MMC卡 高速串行接口帶隨即存取 支持雙通道閃存交叉存取 快寫技術(shù):一個低成本的方案,能夠超高速閃存訪問和高可靠數(shù)據(jù)存儲 最大讀寫速率:10Mbyte/s 最大10個堆疊的卡(20MHz,Vcc=2.7-3.6V) 數(shù)據(jù)壽命:10萬次編程/擦除 CE和FCC認證 PIP封裝技術(shù) 尺寸:24mm寬×32mm長×1.44mm厚說明: 本SD卡高度集成閃存,具備串行和隨機存取能力。可以通過專用優(yōu)化速度的串行接口訪問,數(shù)據(jù)傳輸可靠。接口允許幾個卡垛疊,通過他們的外部連接。接口完全符合最新的
8、消費者標準,叫做SD卡系統(tǒng)標準,由SD卡系統(tǒng)規(guī)范定義。 SD卡系統(tǒng)是一個新的大容量存儲系統(tǒng),基于半導(dǎo)體技術(shù)的變革。 它的出現(xiàn),提供了一個便宜的、結(jié)實的卡片式的存儲媒介,為了消費多媒體應(yīng)用。 SD卡可以設(shè)計出便宜的播放器和驅(qū)動器而沒有可移動的部分。 一個低耗電和廣供電電壓的可以滿足移動電話、電池應(yīng)用比如音樂播放器、個人管理器、掌上電腦、電子書、電子百科全書、電子詞典等等。 使用非常有效的數(shù)據(jù)壓縮比如MPEG,SD卡可以提供足夠的容量來應(yīng)付多媒體數(shù)據(jù)。 框圖: SD卡上所有單元由內(nèi)部時鐘發(fā)生器提供時鐘。接口驅(qū)動單元同步外部時鐘的DAT和CMD信號到內(nèi)部所用時鐘。
9、本卡由6線SD卡接口控制,包括:CMD,CLK,DAT0-DAT3。 在多SD卡垛疊中為了標識SD卡,一個卡標識寄存器(CID)和一個相應(yīng)地址寄存器(RCA)預(yù)先準備好。 一個附加的寄存器包括不同類型操作參數(shù)。 這個寄存器叫做CSD。 使用SD卡線訪問存儲器還是寄存器的通信由SD卡標準定義。 卡有自己的電源開通檢測單元。 無需附加的主復(fù)位信號來在電源開啟后安裝卡。 它防短路,在帶電插入或移出卡時。 無需外部編程電壓。 編程電壓卡內(nèi)生成。 SD卡支持第二接口工作模式SPI。 如果接到復(fù)位命令(CMD0)時,CS信號有效(低電平),SPI模式啟用。 接口 該SD卡的接口可以支
10、持兩種操作模式:。SD卡模式。SPI模式主機系統(tǒng)可以選擇以上其中任一模式,SD卡模式允許4線的高速數(shù)據(jù)傳輸。 SPI模式允許簡單通用的SPI通道接口, 這種模式相對于SD模式的不足之處是喪失了速度。SD卡模式針腳定義 針腳名稱類型描述1CD DAT3I/O/PP卡監(jiān)測數(shù)據(jù)位32CMDPP命令/回復(fù)3VssS地4VccS供電電壓5CLKI時鐘6Css2S地7DAT0I/O/PP數(shù)據(jù)位08DAT1I/O/PP數(shù)據(jù)位19DAT2I/O/PP數(shù)據(jù)位21:S:電源供電,I:輸入O:輸出 I/O:雙向 PP:I/O使用推挽驅(qū)動SD卡的總線概念SD總線允許強大的1線到4線數(shù)據(jù)信號設(shè)置。當默認的上電
11、后,SD卡使用DAT0。 初始化之后,主機可以改變線寬(譯者按:即改為2根線,3根線。)?;旌偷腟D卡連接方式也適合于主機。在混和連接中Vcc,Vss和CLK的信號連接可以通用。但是,命令,回復(fù),和數(shù)據(jù)(DAT03)這幾根線,各個SD卡必須從主機分開。這個特性使得硬件和系統(tǒng)上交替使用。SD總線上通信的命令和數(shù)據(jù)比特流從一個起始位開始,以停止位中止。CLK:每個時鐘周期傳輸一個命令或數(shù)據(jù)位。頻率可在025MHz之間變化。SD卡的總線管理器可以不受任何限制的自由產(chǎn)生025MHz的頻率。CMD:命令從該CMD線上串行傳輸。一個命令是一次主機到從卡操作的開始。命令可以以單機尋址(尋址命令)或呼叫所有卡
12、(廣播命令)方式發(fā)送。 回復(fù)從該CMD線上串行傳輸。一個命令是對之前命令的回答。回復(fù)可以來自單機或所有卡。DAT03:數(shù)據(jù)可以從卡傳向主機或副versa。數(shù)據(jù)通過數(shù)據(jù)線傳輸。 SD卡總線拓撲 SPI模式針腳定義針腳名稱類型描述1CSI片選(負有效)2DII數(shù)據(jù)輸入3VssS地4VccS供電電壓5CLKI時鐘6Vss2S地7DOO數(shù)據(jù)輸出8RSV- 9RSV- 1:S:電源供電,I:輸入O:輸出 I/O:雙向 PP:I/O使用推挽驅(qū)動注意:SPI模式時,這些信號需要在主機端用10100K歐的電阻上拉。SPI 總線概念SPI總線允許通過2通道(
13、數(shù)據(jù)入和出)傳輸比特數(shù)據(jù)。SPI兼容模式使得MMC主機系統(tǒng)通過很小的改動就可以使用卡。SPI模式使用字節(jié)傳輸。所有的數(shù)據(jù)被融合到一些字節(jié)中并aligned to the CS signal(可能是:同過CS信號來校正)。SPI模式的優(yōu)點就是簡化主機的設(shè)計。特別的,MMC主機需要小的改動。SPI模式相對于SD模式的不足之處是喪失了速度性能。 SD卡的電特性SD卡的連接電路圖直流特性完全最大值評估最大值評估指即使在瞬間也不能超出限制電壓。當你在歸定的最大值評估范圍內(nèi)使用該產(chǎn)品,不會出現(xiàn)永久性損壞。但是這并不能保證正常的邏輯操作。轉(zhuǎn)SD卡在單片機上的應(yīng)用(一)經(jīng)典轉(zhuǎn)
14、載 2010-01-09 09:18:18 閱讀50 評論0 字號:大中小 SD卡在單片機上的應(yīng)用(一) 文章來源:振南單片機講壇 SD卡在現(xiàn)在的日常生活與工作中使用非常廣泛,時下已經(jīng)成為最為通用的數(shù)據(jù)存儲卡。在諸如MP3、數(shù)碼相機等設(shè)備上也都采用SD卡作為其存儲設(shè)備。SD卡之所以得到如此廣泛的使用,是因為它價格低廉、存儲容量大、使用方便、通用性與安全性強等優(yōu)點。既然它有著這么多優(yōu)點,那么如果將它加入到單片機應(yīng)用開發(fā)系統(tǒng)中來,將使系統(tǒng)變得更加出色。這就要求對SD卡的硬件與讀寫時序進行研究。對于SD卡的硬件結(jié)構(gòu),在官方的文檔上有很詳細的介紹,如SD卡內(nèi)的存儲器結(jié)構(gòu)、存儲單元組織方式等內(nèi)
15、容。要實現(xiàn)對它的讀寫,最核心的是它的時序,筆者在經(jīng)過了實際的測試后,使用51單片機成功實現(xiàn)了對SD卡的扇區(qū)讀寫,并對其讀寫速度進行了評估。下面先來講解SD卡的讀寫時序。(1) SD卡的引腳定義: SD卡引腳功能詳述:引腳編號SD模式 SPI模式名稱類型描述名稱類型描述1CD/DAT3IO或PP卡檢測數(shù)據(jù)線3#CSI片選2CMDPP命令
16、回應(yīng)DII數(shù)據(jù)輸入3VSS1S電源地VSSS電源地4VDDS電源VDDS電源5CLKI時鐘SCLKI時鐘6VSS2S電源地VSS2S電源地7DAT0IO或PP數(shù)據(jù)線0DOO或PP數(shù)據(jù)輸出8DAT1IO或PP數(shù)據(jù)線1RSV 9DAT2IO或PP數(shù)據(jù)線2RSV 注:S:電源供給 I:輸入 O:采用推拉驅(qū)動的輸出 PP:采用推拉驅(qū)動的輸入輸出 SD卡SPI模式下與單
17、片機的連接圖: SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK、CMD、DAT0DAT3進行數(shù)據(jù)通信。而SPI方式采用4線制,使用CS、CLK、DataIn、DataOut進行數(shù)據(jù)通信。SD方式時的數(shù)據(jù)傳輸速度與SPI方式要快,采用單片機對SD卡進行讀寫時一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。這里只對其SPI方式進行介紹。(2) SPI方式驅(qū)動SD卡的方法 SD卡
18、的SPI通信接口使其可以通過SPI通道進行數(shù)據(jù)讀寫。從應(yīng)用的角度來看,采用SPI接口的好處在于,很多單片機內(nèi)部自帶SPI控制器,不光給開發(fā)上帶來方便,同時也見降低了開發(fā)成本。然而,它也有不好的地方,如失去了SD卡的性能優(yōu)勢,要解決這一問題,就要用SD方式,因為它提供更大的總線數(shù)據(jù)帶寬。SPI接口的選用是在上電初始時向其寫入第一個命令時進行的。以下介紹SD卡的驅(qū)動方法,只實現(xiàn)簡單的扇區(qū)讀寫。1) 命令與數(shù)據(jù)傳輸1. 命令傳輸SD卡自身有完備的命令系統(tǒng),以實現(xiàn)各項操作。命令格式如下:
19、0; 命令的傳輸過程采用發(fā)送應(yīng)答機制,過程如下: 每一個命令都有自己命令應(yīng)答格式。在SPI模式中定義了三種應(yīng)答格式,如下表所示:字節(jié)位含義 17開始位,始終為06參數(shù)錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復(fù)位0閑置狀態(tài) 字節(jié)位含義 17開始位,始終為06參數(shù)錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復(fù)位0閑置狀態(tài) 27溢出
20、,CSD覆蓋6擦除參數(shù)5寫保護非法4卡ECC失敗3卡控制器錯誤2未知錯誤1寫保護擦除跳過,鎖解鎖失敗0鎖卡字節(jié)位含義 17開始位,始終為06參數(shù)錯誤5地址錯誤4擦除序列錯誤3CRC錯誤2非法命令1擦除復(fù)位0閑置狀態(tài)25全部操作條件寄存器,高位在前 寫命令的例程:/- 向SD卡中寫入命令,并返回回應(yīng)的第二個字節(jié)/-unsigned char Write_Command_SD(unsigned char *CMD) uns
21、igned char tmp; unsigned char retry=0; unsigned char i; /禁止SD卡片選 SPI_CS=1; /發(fā)送8個時鐘信號 Write_Byte_SD(0xFF); /使能SD卡片選 SPI_CS=0; /向SD卡發(fā)送6字節(jié)命令 for (i=0;i<0x06;i+)
22、 Write_Byte_SD(*CMD+); /獲得16位的回應(yīng) Read_Byte_SD(); /read the first byte,ignore it. do /讀取后8位 tmp = Read_Byte_SD(); retry+;
23、while(tmp=0xff)&&(retry<100); return(tmp);2) 初始化SD卡的初始化是非常重要的,只有進行了正確的初始化,才能進行后面的各項操作。在初始化過程中,SPI的時鐘不能太快,否則會造初始化失敗。在初始化成功后,應(yīng)盡量提高SPI的速率。在剛開始要先發(fā)送至少74個時鐘信號,這是必須的。在很多讀者的實驗中,很多是因為疏忽了這一點,而使初始化不成功。隨后就是寫入兩個命令CMD0與CMD1,使SD卡進入SPI模式 &
24、#160; 初始化時序圖: 初始化例程:/- 初始化SD卡到SPI模式/-unsigned char SD_Init() unsigned char retry,temp; unsigned char i; unsigned char CMD = 0x40,0x00,0x00,0x00,0x00,0x95; SD_Po
25、rt_Init(); /初始化驅(qū)動端口 Init_Flag=1; /將初始化標志置1 for (i=0;i<0x0f;i+) Write_Byte_SD(0xff); /發(fā)送至少74個時鐘信號 /向SD卡發(fā)送CMD0 retry=0; do /為了能夠成功寫入CMD0,在這里寫200次
26、temp=Write_Command_SD(CMD); retry+; if(retry=200) /超過200次 return(INIT_CMD0_ERROR);/CMD0 Error! while(temp!=1); /回應(yīng)01h,停止寫入
27、 /發(fā)送CMD1到SD卡 CMD0 = 0x41; /CMD1 CMD5 = 0xFF; retry=0; do /為了能成功寫入CMD1,寫100次 temp=Write_Command_SD(CMD); retry+; if(retry=100) /超過10
28、0次 return(INIT_CMD1_ERROR);/CMD1 Error! while(temp!=0);/回應(yīng)00h停止寫入 Init_Flag=0; /初始化完畢,初始化標志清零 SPI_CS=1; /片選無效 return(0); /初始化成功3) 讀取CIDCID寄存
29、器存儲了SD卡的標識碼。每一個卡都有唯一的標識碼。CID寄存器長度為128位。它的寄存器結(jié)構(gòu)如下:名稱域數(shù)據(jù)寬度CID劃分生產(chǎn)標識號MID8127:120OEM/應(yīng)用標識OID16119:104產(chǎn)品名稱PNM40103:64產(chǎn)品版本PRV863:56產(chǎn)品序列號PSN3255:24保留423:20生產(chǎn)日期MDT1219:8CRC7校驗合CRC77:1未使用,始終為110:0它的讀取時序如下: 與此時序相對應(yīng)的程序如下:/- 讀取SD卡的CID寄存器 16
30、字節(jié) 成功返回0/-unsigned char Read_CID_SD(unsigned char *Buffer) /讀取CID寄存器的命令 unsigned char CMD = 0x4A,0x00,0x00,0x00,0x00,0xFF; unsigned char temp; temp=SD_Read_Block(CMD,Buffer,16); /read 16 bytes return(temp);
31、60; 4)讀取CSD CSD(Card-Specific Data)寄存器提供了讀寫SD卡的一些信息。其中的一些單元可以由用戶重新編程。具體的CSD結(jié)構(gòu)如下:名稱域數(shù)據(jù)寬度單元類型CSD劃分CSD結(jié)構(gòu)CSD_STRUCTURE2R127:126保留-6R125:120數(shù)據(jù)讀取時間1TAAC8R119:112數(shù)據(jù)在CLK周期內(nèi)讀取時間2(NSAC*100)NSAC8R111:104最大數(shù)據(jù)傳輸率TRAN_SPEED8
32、R103:96卡命令集合CCC12R95:84最大讀取數(shù)據(jù)塊長READ_BL_LEN4R83:80允許讀的部分塊READ_BL_PARTIAL1R79:79非線寫塊WRITE_BLK_MISALIGN1R78:78非線讀塊READ_BLK_MISALIGN1R77:77DSR條件DSR_IMP1R76:76保留-2R75:74設(shè)備容量C_SIZE12R73:62最大讀取電流VDD minVDD_R_CURR_MIN3R61:59最大讀取電流VDD maxVDD_R_CURR_MAX3R58:56最大寫電流VDD minVDD_W_CURR_MIN3R55:53最大寫電流VDD maxVDD_W
33、_CURR_MAX3R52:50設(shè)備容量乘子C_SIZE_MULT3R49:47擦除單塊使能ERASE_BLK_EN1R46:46擦除扇區(qū)大小SECTOR_SIZE7R45:39寫保護群大小WP_GRP_SIZE7R38:32寫保護群使能WP_GRP_ENABLE1R31:31保留-2R30:29寫速度因子R2W_FACTOR3R28:26最大寫數(shù)據(jù)塊長度WRITE_BL_LEN4R25:22允許寫的部分部WRITE_BL_PARTIAL1R21:21保留-5R20:16文件系統(tǒng)群FILE_OFRMAT_GRP1R/W15:15拷貝標志COPY1R/W14:14永久寫保護PERM_WRITE_
34、PROTECT1R/W13:13暫時寫保護TMP_WRITE_PROTECT1R/W12:12文件系統(tǒng)FIL_FORMAT2R/W11:10保留-2R/W9:8CRCCRC7R/W7:1未用,始終為1-1 0:0 讀取CSD 的時序:相應(yīng)的程序例程如下: /- 讀SD卡的CSD寄存器 共16字節(jié) 返回0說明讀取成功/-unsigned char Read_CSD_SD(u
35、nsigned char *Buffer) /讀取CSD寄存器的命令 unsigned char CMD = 0x49,0x00,0x00,0x00,0x00,0xFF; unsigned char temp; temp=SD_Read_Block(CMD,Buffer,16); /read 16 bytes return(temp);4) 讀取SD卡信息綜合上面對CID與CSD寄存器的讀取,可以知道很多關(guān)于SD卡的信息,以下程序可以獲取
36、這些信息。如下:/-/返回/ SD卡的容量,單位為M/ sector count and multiplier MB are in u08 = C_SIZE / (2(9-C_SIZE_MULT)/ SD卡的名稱/-void SD_get_volume_info() unsigned char i; unsigne
37、d char c_temp5; VOLUME_INFO_TYPE SD_volume_Info,*vinf; vinf=&SD_volume_Info; /Init the pointoer;/讀取CSD寄存器 Read_CSD_SD(sectorBuffer.dat);/獲取總扇區(qū)數(shù) vinf->sector_count = sectorBuffer.dat6 & 0x03; vinf->sector_coun
38、t <<= 8; vinf->sector_count += sectorBuffer.dat7; vinf->sector_count <<= 2; vinf->sector_count += (sectorBuffer.dat8 & 0xc0) >> 6; / 獲取multiplier vinf->sector_multiply = sectorBuffer.dat9 & 0x03; &
39、#160; vinf->sector_multiply <<= 1; vinf->sector_multiply += (sectorBuffer.dat10 & 0x80) >> 7;/獲取SD卡的容量 vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply); / get the name of the card Read_CID_SD(sectorBu
40、ffer.dat); vinf->name0 = sectorBuffer.dat3; vinf->name1 = sectorBuffer.dat4; vinf->name2 = sectorBuffer.dat5; vinf->name3 = sectorBuffer.dat6; vinf->name4 = sectorBuffer.dat7; vinf->name5 = 0x00; /end flag
41、; 以上程序?qū)⑿畔⒀b載到一個結(jié)構(gòu)體中,這個結(jié)構(gòu)體的定義如下:typedef struct SD_VOLUME_INFO /SD/SD Card info unsigned int size_MB; unsigned char sector_multiply; unsigned int sector_count; unsigned char name6; VOLUME_
42、INFO_TYPE;5) 扇區(qū)讀扇區(qū)讀是對SD卡驅(qū)動的目的之一。SD卡的每一個扇區(qū)中有512個字節(jié),一次扇區(qū)讀操作將把某一個扇區(qū)內(nèi)的512個字節(jié)全部讀出。過程很簡單,先寫入命令,在得到相應(yīng)的回應(yīng)后,開始數(shù)據(jù)讀取。扇區(qū)讀的時序: 扇區(qū)讀的程序例程:unsigned char SD_Read_Sector(unsigned long sector,unsigned char *buffer) unsigne
43、d char retry; /命令16 unsigned char CMD = 0x51,0x00,0x00,0x00,0x00,0xFF; unsigned char temp; /地址變換 由邏輯塊地址轉(zhuǎn)為字節(jié)地址 sector = sector << 9; /sector = sector * 512 CMD1 = (sector & 0xFF000000) &g
44、t;>24 ); CMD2 = (sector & 0x00FF0000) >>16 ); CMD3 = (sector & 0x0000FF00) >>8 ); /將命令16寫入SD卡 retry=0; do /為了保證寫入命令 一共寫100次 temp=Write_Command_MMC(CMD);
45、0; retry+; if(retry=100) return(READ_BLOCK_ERROR); /block write Error! while(temp!=0);
46、0; /Read Start Byte form MMC/SD-Card (FEh/Start Byte) /Now data is ready,you can read it out. while (Read_Byte_MMC() != 0xfe); readPos=0; SD_get_data
47、(512,buffer) ; /512字節(jié)被讀出到buffer中 return 0;其中SD_get_data函數(shù)如下:/- 獲取數(shù)據(jù)到buffer中/-void SD_get_data(unsigned int Bytes,unsigned char *buffer) unsigned int j; for (j=0;j<Bytes;j+) *buffer+ = Read_Byte_SD();6) 扇區(qū)寫扇區(qū)
48、寫是SD卡驅(qū)動的另一目的。每次扇區(qū)寫操作將向SD卡的某個扇區(qū)中寫入512個字節(jié)。過程與扇區(qū)讀相似,只是數(shù)據(jù)的方向相反與寫入命令不同而已。扇區(qū)寫的時序:扇區(qū)寫的程序例程:/- 寫512個字節(jié)到SD卡的某一個扇區(qū)中去 返回0說明寫入成功/-unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer) unsigned char tmp,retry; unsigned int i;
49、60; /, 命令24 unsigned char CMD = 0x58,0x00,0x00,0x00,0x00,0xFF; addr = addr << 9; /addr = addr * 512 CMD1 = (addr & 0xFF000000) >>24 ); CMD2 = (addr & 0x00FF0000) >>16 ); CMD3 = (addr & 0x000
50、0FF00) >>8 ); /寫命令24到SD卡中去 retry=0; do /為了可靠寫入,寫100次 tmp=Write_Command_SD(CMD); retry+; if(retry=100)
51、0; return(tmp); /send commamd Error! while(tmp!=0); /在寫之前先產(chǎn)生100個時鐘信號 for (i=0;i<100;i+) Read_Byte_SD();
52、160; /寫入開始字節(jié) Write_Byte_MMC(0xFE); /現(xiàn)在可以寫入512個字節(jié) for (i=0;i<512;i+) Write_Byte_MMC(*Buffer+); /CRC-Byte Write_Byte_M
53、MC(0xFF); /Dummy CRC Write_Byte_MMC(0xFF); /CRC Code tmp=Read_Byte_MMC(); / read response if(tmp & 0x1F)!=0x05) / 寫入的512個字節(jié)是未被接受 SPI_CS=1; return(WRITE_BLO
54、CK_ERROR); /Error! /等到SD卡不忙為止/因為數(shù)據(jù)被接受后,SD卡在向儲存陣列中編程數(shù)據(jù) while (Read_Byte_MMC()!=0xff); /禁止SD卡 SPI_CS=1; return(0);/寫入成功 此上內(nèi)容在筆者的實驗中都已調(diào)試通過。單片機采用STC89LE單片機(SD卡的初始化電壓為2.0V3.6V,操作電壓為3.1V3.5V,因此不能用
55、5V單片機,或進行分壓處理),工作于22.1184M的時鐘下,由于所采用的單片機中沒硬件SPI,采用軟件模擬SPI,因此讀寫速率都較慢。如果要半SD卡應(yīng)用于音頻、視頻等要求高速場合,則需要選用有硬件SPI的控制器,或使用SD模式,當然這就需要各位讀者對SD模式加以研究,有了SPI模式的基礎(chǔ),SD模式應(yīng)該不是什么難事。前言長期以來,以Flash Memory為存儲體的SD卡因具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應(yīng)用于消費類電子產(chǎn)品中。特別是近年來,隨著價格不斷下降且存儲容量不斷提高,它的應(yīng)用范圍日益增廣。當數(shù)據(jù)采集系統(tǒng)需要長時間地采集、記錄海量數(shù)據(jù)時,選擇SD卡作為存儲媒質(zhì)是開發(fā)
56、者們一個很好的選擇。在電能監(jiān)測以及無功補償系統(tǒng)中,要連續(xù)記錄大量的電壓、電流、有功功率、無功功率以及時間等參數(shù),當單片機采集到這些數(shù)據(jù)時可以利用SD作為存儲媒質(zhì)。本文主要介紹了SD卡在電能監(jiān)測及無功補償數(shù)據(jù)采集系統(tǒng)中的應(yīng)用方案。設(shè)計方案應(yīng)用AT89C52讀寫SD卡有兩點需要注意。首先,需要尋找一個實現(xiàn)AT89C52單片機與SD卡通訊的解決方案;其次,SD卡所能接受的邏輯電平與AT89C52提供的邏輯電平不匹配,需要解決電平匹配問題。通訊模式SD卡有兩個可選的通訊協(xié)議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,但是在選用SD模式時,往往需要選擇帶有SD卡控制器接口的MCU,或者必須加
57、入額外的SD卡控制單元以支持SD卡的讀寫。然而,AT89C52單片機沒有集成SD卡控制器接口,若選用SD模式通訊就無形中增加了產(chǎn)品的硬件成本。在SD卡數(shù)據(jù)讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數(shù)據(jù)交換,并且目前市場上很多MCU都集成有現(xiàn)成的SPI接口電路,采用SPI模式對SD卡進行讀寫操作可大大簡化硬件電路的設(shè)計。雖然AT89C52不帶SD卡硬件控制器,也沒有現(xiàn)成的SPI接口模塊,但是可以用軟件模擬出SPI總線時序。本文用SPI總線模式讀寫SD卡。電平匹配SD卡的邏輯電平相當于3.3V TTL電平標準,而控制芯片
58、AT89C52的邏輯電平為5V CMOS電平標準。因此,它們之間不能直接相連,否則會有燒毀SD卡的可能。出于對安全工作的考慮,有必要解決電平匹配問題。要解決這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應(yīng)該大于接收電平器件識別為高電平的最低電壓值;另一條為輸出電平器件輸出低電平的最大電壓值,應(yīng)該小于接收電平器件識別為低電平的最高電壓值。一般來說,通用的電平轉(zhuǎn)換方案是采用類似SN74ALVC4245的專用電平轉(zhuǎn)換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個方案代價相對昂貴,而且一般的專用電平轉(zhuǎn)換芯片都是同
59、時轉(zhuǎn)換8路、16路或者更多路數(shù)的電平,相對本系統(tǒng)僅僅需要轉(zhuǎn)換3路來說是一種資源的浪費??紤]到SD卡在SPI協(xié)議的工作模式下,通訊都是單向的,于是在單片機向SD卡傳輸數(shù)據(jù)時采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在SD卡向單片機傳輸數(shù)據(jù)時可以直接連接,因為它們之間的電平剛好滿足上述的電平兼容原則,既經(jīng)濟又實用。 這個方案需要雙電源供電(一個5V電源、一個3.3V電源供電),3.3V電源可以用AMS1117穩(wěn)壓管從5V電源穩(wěn)壓獲取。硬件接口設(shè)計SD卡提供9Pin的引腳接口便于外圍電路對其進行操作,9Pin的引腳隨工作模式的不同有所差異。在SPI模式下,引腳1(DAT3)作為S
60、PI片選線CS用,引腳2(CMD)用作SPI總線的數(shù)據(jù)輸出線MOSI,而引腳7(DAT0)為數(shù)據(jù)輸入線MISO,引腳5用作時鐘線(CLK)。除電源和地,保留引腳可懸空。本文中控制SD卡的MCU是ATMEL公司生產(chǎn)的低電壓、高性能CMOS 8位單片機AT89C52,內(nèi)含8K字節(jié)的可反復(fù)擦寫的只讀程序存儲器和256字節(jié)的隨機存儲數(shù)據(jù)存儲器。由于AT89C52只有256字節(jié)的數(shù)據(jù)存儲器,而SD卡的數(shù)據(jù)寫入是以塊為單位,每塊為512字節(jié),所以需要在單片機最小系統(tǒng)上增加一片RAM。本系統(tǒng)中RAM選用存儲器芯片HM62256,容量為32K。對RAM進行讀寫時,鎖存器把低8位地址鎖存,與P2口的8位地址數(shù)據(jù)
61、構(gòu)成16位地址空間,從而可使SD卡一次讀寫512字節(jié)的塊操作。系統(tǒng)硬件圖如圖2所示。 軟件設(shè)計SPI工作模式SD卡在上電初期自動進入SD總線模式,在此模式下向SD卡發(fā)送復(fù)位命令CMD0。如果SD卡在接收復(fù)位命令過程中CS低電平有效,則進入SPI模式,否則工作在SD總線模式。對于不帶SPI串行總線接口的AT89C52單片機來說,用軟件來模擬SPI總線操作的具體做法是:將P1.5口(模擬CLK線)的初始狀態(tài)設(shè)置為1,而在允許接收后再置P1.5為0。這樣,MCU在輸出1位SCK時鐘的同時,將使接口芯片串行左移,從而輸出1位數(shù)據(jù)至AT89C52單片機的P1.7(模擬MISO線),此后再置P1.5為1,使單片機從P1.6(模擬MOSI線)輸出1位數(shù)據(jù)(先為高位)至串行接口芯片。至此,模擬1位數(shù)據(jù)輸入輸出便完成。此后再置P1.5為0,模擬下1位數(shù)據(jù)的輸入輸出,依此循環(huán)8次,即可完成1次通過SPI總線傳輸8位數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無人化采煤技術(shù)研究-深度研究
- 古代中藥方劑傳承研究-深度研究
- 交通出行行為研究-深度研究
- 多點觸控性能分析-深度研究
- 天然氣泄露對大氣化學組分的影響-深度研究
- 并購信息不對稱研究-深度研究
- 化工廠機器人操作與維護-深度研究
- 容器資源隔離技術(shù)-第1篇-深度研究
- 數(shù)據(jù)中心能源審計與優(yōu)化-深度研究
- 數(shù)學與數(shù)據(jù)挖掘-深度研究
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 人教版初中語文2022-2024年三年中考真題匯編-學生版-專題08 古詩詞名篇名句默寫
- 2024-2025學年人教版(2024)七年級(上)數(shù)學寒假作業(yè)(十二)
- 山西粵電能源有限公司招聘筆試沖刺題2025
- 醫(yī)療行業(yè)軟件系統(tǒng)應(yīng)急預(yù)案
- 使用錯誤評估報告(可用性工程)模版
- 《精密板料矯平機 第2部分:技術(shù)規(guī)范》
- 2024光伏發(fā)電工程交流匯流箱技術(shù)規(guī)范
- 旅游活動碳排放管理評價指標體系構(gòu)建及實證研究
- 2022年全國職業(yè)院校技能大賽-電氣安裝與維修賽項規(guī)程
- 2024年黑龍江省政工師理論知識考試參考題庫(含答案)
評論
0/150
提交評論