版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程論文</b></p><p> 題 目: 基于STM32的SD卡設(shè)計(jì) </p><p> 課程名稱: ARM嵌入式系統(tǒng) </p><p> 學(xué)生姓名: X X </p&
2、gt;<p> 學(xué)生學(xué)號(hào): </p><p> 系 別: 電子工程學(xué)院 </p><p> 專 業(yè): 電子信息科學(xué)與技術(shù) </p><p> 年 級(jí): 2013級(jí) </p><
3、p> 任課教師: </p><p><b> 電子工程學(xué)院制</b></p><p><b> 2015年10月</b></p><p> 基于STM32的SD卡設(shè)計(jì)</p><p><b> 學(xué)生:</b>&l
4、t;/p><p><b> 指導(dǎo)教師:</b></p><p> 電子工程學(xué)院:電子信息科學(xué)與技術(shù)</p><p><b> 1概述</b></p><p><b> 1.1設(shè)計(jì)背景</b></p><p> 21世紀(jì)是一信息傳遞及應(yīng)用高速的時(shí)代,
5、信息在人類社會(huì)活動(dòng)中已經(jīng)必不可缺,使用嵌入式系統(tǒng)的電子產(chǎn)品已經(jīng)在人們的日常生活中廣泛普及應(yīng)用。其中人們?nèi)粘I钪凶罱?jīng)常接觸使用到的數(shù)碼相機(jī)、手機(jī)、MP3、MP4、多媒體播放器等,其信息數(shù)據(jù)的存儲(chǔ)大部分都是使用的SD卡。所以SD卡在嵌入式上應(yīng)用有著十分大市場(chǎng)空間。 </p><p> SD卡擁有輕小、高存儲(chǔ)容量、高速的傳輸速率以及很高的安全性,更換和編程也相當(dāng)方便。根據(jù)SD卡胡特性,它已然成為非常多數(shù)碼產(chǎn)品的外
6、部應(yīng)用儲(chǔ)存的第一選擇目標(biāo)。ALIENTKE MiniSTM32開發(fā)板就帶有SD卡接口,利用STM32自帶的 SPI接口,最大通信速度可達(dá)18Mbps,每秒可傳輸數(shù)據(jù) 2M 字節(jié)以上,對(duì)于一般應(yīng)用足夠了。 </p><p><b> 2硬件設(shè)計(jì)</b></p><p><b> 2.1硬件讀寫模塊</b></p><p>
7、; SD卡存儲(chǔ)模式是Flash。SD卡的卡內(nèi)智能控制模塊包含電源和時(shí)鐘的管理、協(xié)議、算法安全、存取數(shù)據(jù)、ECC算法、處理缺陷和分析數(shù)據(jù)。FLASH每個(gè)扇區(qū)的寫壽命在10萬(wàn)次左右,讀的次數(shù)是無(wú)限制的。</p><p> SD卡一般支持2種操作模式: </p><p> 1、SD卡模式; 2、PI模式;</p><p> SD卡的引腳排序如下圖所示:</p
8、><p> 圖1 SD卡的引腳排序 </p><p> SD卡的九個(gè)引腳功能:</p><p> 表1:SD卡引腳功能表</p><p> SD卡只能使用3.3V的IO電平,所以,MCU一定要能夠支持3.3V的IO端口輸出。注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉電阻。</p>
9、<p> 在STM32中,開板使用的是SPI的接口模式來(lái)進(jìn)得讀寫,所以,主要應(yīng)用的便是SPI的模式。由于SD卡內(nèi)部的供電電壓上升是需要一段時(shí)間,大約是64個(gè)時(shí)鐘,而且需要10個(gè)時(shí)鐘與SD卡同步,所以在發(fā)送CMD0之前,要發(fā)送>74個(gè)時(shí)鐘。SD卡與STM32 進(jìn)行數(shù)據(jù)交換,要將SD卡外部驅(qū)動(dòng),將外部?jī)?chǔ)存卡與STM32聯(lián)系起來(lái)。開發(fā)板對(duì)成為外部?jī)?chǔ)存空間的SD卡進(jìn)行讀寫,把讀寫命令解析并傳送到SD卡中,從而實(shí)現(xiàn)開發(fā)板對(duì)外部?jī)?chǔ)
10、存卡的操作與控制。</p><p><b> 2.2硬件設(shè)計(jì)模塊</b></p><p> 所需要的硬件資源如下: </p><p><b> 1、SD卡。 </b></p><p> 2、STM32F103ZET6。 </p><p> 3、DS0(外部 LED0
11、)。</p><p><b> 4、串口 1。 </b></p><p> SD卡和STM32的連接:SPI1與安全數(shù)碼卡通信,如下其引腳的連接定義為: </p><p> PE3:SPI1-SPI2全雙工通訊,低電平作用; PA7:通訊結(jié)束后跟隨一個(gè)CRC校驗(yàn); </p><p> PA5:SPI1、SPI2的
12、NSS引腳是斷開的; PA6:SPI驅(qū)動(dòng),NSS引腳由軟件設(shè)置配置; </p><p> PC12:MOSI輸出,與STM32通信; CLK:時(shí)鐘信號(hào); CMD:雙向命令和響應(yīng)信號(hào); DAT0-3:雙向數(shù)據(jù)信號(hào); VDD,VSS:電源和地信號(hào);</p><p><b> 原理圖如下:</b></p><p> 圖2 SD卡接口與ST
13、M32連接原理圖 </p><p> 在SPI模式下,引腳1(DAT3)作為SPI片選線CS用,引腳2(CMD)用作SPI總線的數(shù)據(jù)輸出線MOSI,而引腳7(DAT0)為數(shù)據(jù)輸入線MISO ,NSS由硬件配置, SPI2為主機(jī), SPI1為從機(jī),使 SS輸出(置位 SPI_ CR2 SSOE位),SPI2 NSS引腳復(fù)位 SPI1的 NSS引腳并配置 SPI1為從機(jī)。在通訊中使用DMA可以減少代碼密度和執(zhí)行時(shí)
14、間,容易接收和發(fā)送數(shù)據(jù)。利用各種硬件設(shè)備自身的特點(diǎn)來(lái)減小其運(yùn)轉(zhuǎn)開銷,例如減小中斷次數(shù)、利用DMA傳輸方式等。安全數(shù)碼卡傳輸給STM32,STM32和SD卡進(jìn)行數(shù)據(jù)間的互換。</p><p><b> 3軟件設(shè)計(jì)</b></p><p><b> 3.1SD卡初始化</b></p><p> SD卡的典型初始化過程如下
15、:</p><p> 初始化與SD卡連接的硬件條件(MCU的SPI配置,I/O口配置)。</p><p> 上電延時(shí)(>74個(gè)CLK)</p><p> 復(fù)位卡(CMD0),進(jìn)入LDLE狀態(tài)。</p><p> 發(fā)送CMD8,檢查是否支持2.0協(xié)議。</p><p> 根據(jù)不同協(xié)議檢查SD卡(命令包括C
16、MD55、CMD41、CMD58和CMD1等)。</p><p> 取消片選,發(fā)多8個(gè)CLK,結(jié)束初始化。</p><p> 圖3 流程圖(SD卡初始化)</p><p><b> 3.2讀SD卡</b></p><p> SD卡讀取數(shù)據(jù),這里通過CMD17來(lái)實(shí)現(xiàn),具體過程如下:</p><p
17、><b> 發(fā)送CMD17。</b></p><p><b> 接收卡響應(yīng)R1。</b></p><p> 接收數(shù)據(jù)起始令牌0XFE。</p><p><b> 接收數(shù)據(jù)。</b></p><p> 接收2個(gè)字節(jié)的CRC,如果不使用CRC,兩個(gè)字節(jié)在讀取后可以丟
18、掉。</p><p> 禁止片選之后,發(fā)多8個(gè)CLK。</p><p><b> 3.3寫SD卡</b></p><p> 寫數(shù)據(jù)通過CMD24來(lái)實(shí)現(xiàn),具體過程如下:</p><p><b> 發(fā)送CMD24.</b></p><p><b> 接收卡響應(yīng)
19、R1。</b></p><p> 發(fā)送寫數(shù)據(jù)起始令牌0XFE。</p><p><b> 發(fā)送數(shù)據(jù)。</b></p><p> 發(fā)送2字節(jié)的偽CRC。</p><p> 禁止片選之后,發(fā)多8個(gè)CLK。</p><p> 圖4 流程圖(讀SD卡) 圖5
20、流程圖(寫SD卡)</p><p><b> 4軟件仿真</b></p><p> 打開keil5編譯運(yùn)行編寫好的程序,沒有錯(cuò)誤后選擇軟件仿真(Debug)使用波形仿真。點(diǎn)開Setup設(shè)置引腳PORTA.3,PORTA.5,PORTA.6,PORTA.7選擇Bit模式。按下KEY0初始化SD卡,SD卡開始發(fā)送接收數(shù)據(jù)。點(diǎn)擊Run.仿真情況如下圖:</p>
21、;<p><b> 5總結(jié)</b></p><p> SD卡應(yīng)用使讓人越來(lái)依賴它,可以說是已經(jīng)成為人類社會(huì)生活中不可或缺的一部分,SD卡具有廣闊的發(fā)展前景和市場(chǎng)前景。21世紀(jì)是一信息傳遞及應(yīng)用高速的時(shí)代,信息在人類社會(huì)活動(dòng)中已經(jīng)必不可缺,使用嵌入式系統(tǒng)的電子產(chǎn)品已經(jīng)在人們的日常生活中廣泛普及應(yīng)用。 </p><p> 通過本次設(shè)計(jì)實(shí)驗(yàn),讓我各方面
22、都有了一個(gè)提升。技術(shù)上,我更加深入了解STM32和SD卡,學(xué)到了以前沒有學(xué)過的知識(shí)。在做這個(gè)設(shè)計(jì)時(shí),也有著各種各樣的困難,通過請(qǐng)教老師、同學(xué)和查找各種資料克服了一個(gè)又一個(gè)困難,最終完成了這篇論文。</p><p> 本次設(shè)計(jì)實(shí)驗(yàn)從選題之初到準(zhǔn)備材料到編寫論文到完成論文,讓我深刻的人數(shù)到我有很多不足之處,比如書本知識(shí)不能學(xué)以致用,缺乏綜合應(yīng)用知識(shí)的能力,分析問題的能力也比較弱。通過這次的學(xué)習(xí)和實(shí)踐,我清楚的認(rèn)識(shí)到
23、自己的知識(shí)還很不全面,處理問題等方面都還需要一個(gè)更大的提升,做任何都要認(rèn)真對(duì)待、全力以赴。也明白任何事都不像看起來(lái)那么簡(jiǎn)單,只有通過認(rèn)真學(xué)習(xí)和動(dòng)手實(shí)踐才能克服困難,走向成功。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]張洋,劉軍,嚴(yán)漢宇.原子教你玩STM32(庫(kù)函數(shù)版) [M].北京航空航天大學(xué)出版社,2013. </p>
24、<p> [2]鄧奕.電子線路CAD實(shí)用教程(第2版)[M]. 華中科技大學(xué)出版社.2012 </p><p> [3]劉明福. 基于STM32的SD卡設(shè)計(jì)[D].江西科技學(xué)院.2012</p><p> [4]劉同法,肖志剛,彭繼衛(wèi). ARM Cortex-M3內(nèi)核微控制器快速入門與應(yīng)用.[M]北京航空航天大學(xué)出版社.2009 </p><p>
25、 [5] Cortex-M3 技術(shù)參考手冊(cè).pdf </p><p> [6]STM32不完全手冊(cè)_庫(kù)函數(shù)版本_V3.1.pdf</p><p> [7]STM32固件庫(kù)使用手冊(cè)的中文翻譯版.pdf</p><p> [8]protel99se不完全使用手冊(cè).pdf</p><p> [9]喻金錢、喻斌.STM32F系列ARM
26、60;Cortex-M3核微控制器開發(fā)與應(yīng)用[M].清華大學(xué)出版社. </p><p> [10] 百度百科SD卡</p><p> http://baike.baidu.com/link?url=DgRftLuAiKBwz2Lmng4lZQB5AcOXDAlk_kP1A3oXGBBxXeT3CGhtCez1GEkyR45NosBOeacPnIbVwKhzAqeECa<
27、/p><p><b> 附錄:</b></p><p> #include "sys.h"</p><p> #include "mmc_sd.h"</p><p> #include "spi.h"</p><p> #inclu
28、de "usart.h" </p><p> u8 SD_Type=0;//SD卡的類型 </p><p> ////////////////////////////////////移植修改區(qū)///////////////////////////////////</p><p><b> //移植時(shí)候的接口</b>&
29、lt;/p><p> //data:要寫入的數(shù)據(jù)</p><p> //返回值:讀到的數(shù)據(jù)</p><p> u8 SD_SPI_ReadWriteByte(u8 data)</p><p><b> {</b></p><p> return SPI1_ReadWriteByte(data
30、);</p><p><b> } </b></p><p> //SD卡初始化的時(shí)候,需要低速</p><p> void SD_SPI_SpeedLow(void)</p><p><b> {</b></p><p> SPI1_SetSpeed(SPI_
31、BaudRatePrescaler_256);//設(shè)置到低速模式</p><p><b> }</b></p><p> //SD卡正常工作的時(shí)候,可以高速了</p><p> void SD_SPI_SpeedHigh(void)</p><p><b> {</b></p>
32、<p> SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//設(shè)置到高速模式</p><p><b> }</b></p><p> //SPI硬件層初始化</p><p> void SD_SPI_Init(void)</p><p><b> {<
33、;/b></p><p> //設(shè)置硬件上與SD卡相關(guān)聯(lián)的控制引腳輸出</p><p> //禁止其他外設(shè)(NRF/W25Q64)對(duì)SD卡產(chǎn)生影響</p><p> GPIO_InitTypeDef GPIO_InitStructure;</p><p> RCC_APB2PeriphClockCmd(RCC_APB2Peri
34、ph_GPIOA, ENABLE ); //PORTA時(shí)鐘使能 </p><p> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PA2.3.4 推挽 n_3|GPIO_Pin_4;</p><p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
35、 </p><p> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p> GPIO_Init(GPIOA, &GPIO_InitStructure);</p><p> GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);//PA
36、2.3.4上拉 </p><p> SPI1_Init();</p><p><b> SD_CS=1;</b></p><p><b> }</b></p><p> //取消選擇,釋放SPI總線</p><p> void SD_DisSelect(void)&
37、lt;/p><p><b> {</b></p><p><b> SD_CS=1;</b></p><p> SD_SPI_ReadWriteByte(0xff);//提供額外的8個(gè)時(shí)鐘</p><p><b> }</b></p><p> /
38、/選擇sd卡,并且等待卡準(zhǔn)備OK</p><p> //返回值:0,成功;1,失敗;</p><p> u8 SD_Select(void)</p><p><b> {</b></p><p><b> SD_CS=0;</b></p><p> if(SD_Wa
39、itReady()==0)return 0;//等待成功</p><p> SD_DisSelect();</p><p> return 1;//等待失敗</p><p><b> }</b></p><p><b> //等待卡準(zhǔn)備好</b></p><p>
40、//返回值:0,準(zhǔn)備好了;其他,錯(cuò)誤代碼</p><p> u8 SD_WaitReady(void)</p><p><b> {</b></p><p><b> u32 t=0;</b></p><p><b> do</b></p><p&g
41、t;<b> {</b></p><p> if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK</p><p><b> t++; </b></p><p> }while(t<0XFFFFFF);//等待 </p><p>&l
42、t;b> return 1;</b></p><p><b> }</b></p><p><b> //等待SD卡回應(yīng)</b></p><p> //Response:要得到的回應(yīng)值</p><p> //返回值:0,成功得到了該回應(yīng)值</p><p
43、> // 其他,得到回應(yīng)值失敗</p><p> u8 SD_GetResponse(u8 Response)</p><p><b> {</b></p><p> u16 Count=0xFFFF;//等待次數(shù) </p><p> while ((SD_SPI_ReadWr
44、iteByte(0XFF)!=Response)&&Count)Count--;//等待得到準(zhǔn)確的回應(yīng) </p><p> if (Count==0)return MSD_RESPONSE_FAILURE;//得到回應(yīng)失敗 </p><p> else return MSD_RESPONSE_NO_ERROR;//正確回應(yīng)</p><p&
45、gt;<b> }</b></p><p> //從sd卡讀取一個(gè)數(shù)據(jù)包的內(nèi)容</p><p> //buf:數(shù)據(jù)緩存區(qū)</p><p> //len:要讀取的數(shù)據(jù)長(zhǎng)度.</p><p> //返回值:0,成功;其他,失敗;</p><p> u8 SD_RecvData(u8*bu
46、f,u16 len)</p><p><b> { </b></p><p> if(SD_GetResponse(0xFE))return 1;//等待SD卡發(fā)回?cái)?shù)據(jù)起始令牌0xFE</p><p> while(len--)//開始接收數(shù)據(jù)</p><p><b> {</b&g
47、t;</p><p> *buf=SPI1_ReadWriteByte(0xFF);</p><p><b> buf++;</b></p><p><b> }</b></p><p> //下面是2個(gè)偽CRC(dummy CRC)</p><p> SD_SPI
48、_ReadWriteByte(0xFF);</p><p> SD_SPI_ReadWriteByte(0xFF); </p><p> return 0;//讀取成功</p><p><b> }</b></p><p> //向sd卡寫入一個(gè)數(shù)據(jù)包的內(nèi)容 512字節(jié)<
49、;/p><p> //buf:數(shù)據(jù)緩存區(qū)</p><p><b> //cmd:指令</b></p><p> //返回值:0,成功;其他,失敗;</p><p> u8 SD_SendBlock(u8*buf,u8 cmd)</p><p><b> {</b>&
50、lt;/p><p> u16 t; </p><p> if(SD_WaitReady())return 1;//等待準(zhǔn)備失效</p><p> SD_SPI_ReadWriteByte(cmd);</p><p> if(cmd!=0XFD)//不是結(jié)束指令</p><p><b> {&
51、lt;/b></p><p> for(t=0;t<512;t++)SPI1_ReadWriteByte(buf[t]);//提高速度,減少函數(shù)傳參時(shí)間</p><p> SD_SPI_ReadWriteByte(0xFF);//忽略crc</p><p> SD_SPI_ReadWriteByte(0xFF);</p><p&
52、gt; t=SD_SPI_ReadWriteByte(0xFF);//接收響應(yīng)</p><p> if((t&0x1F)!=0x05)return 2;//響應(yīng)錯(cuò)誤 </p><p> } </p><p> return 0;//寫入成功</p>
53、<p><b> }</b></p><p> //向SD卡發(fā)送一個(gè)命令</p><p> //輸入: u8 cmd 命令 </p><p> // u32 arg 命令參數(shù)</p><p> // u8 crc crc校驗(yàn)值 </p><p&
54、gt; //返回值:SD卡返回的響應(yīng) </p><p> u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc)</p><p><b> {</b></p><p><b> u8 r1;</b></p><p> u8 Retry
55、=0; </p><p> SD_DisSelect();//取消上次片選</p><p> if(SD_Select())return 0XFF;//片選失效 </p><p><b> //發(fā)送</b></p><p> SD_SPI_ReadWriteByte(cmd | 0x40);//分別寫入命令<
56、;/p><p> SD_SPI_ReadWriteByte(arg >> 24);</p><p> SD_SPI_ReadWriteByte(arg >> 16);</p><p> SD_SPI_ReadWriteByte(arg >> 8);</p><p> SD_SPI_ReadWriteBy
57、te(arg); </p><p> SD_SPI_ReadWriteByte(crc); </p><p> if(cmd==CMD12)SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading</p><p> //等待響應(yīng),或超時(shí)退出</p><p>
58、Retry=0X1F;</p><p><b> do</b></p><p><b> {</b></p><p> r1=SD_SPI_ReadWriteByte(0xFF);</p><p> }while((r1&0X80) && Retry--); <
59、;/p><p><b> //返回狀態(tài)值</b></p><p> return r1;</p><p> } </p><p> //獲取SD卡的CID信息,包括制造商信息</p><p> //輸入: u8 *cid_data(存放CID的內(nèi)存
60、,至少16Byte) </p><p> //返回值:0:NO_ERR</p><p> // 1:錯(cuò)誤 </p><p> u8 SD_GetCID(u8 *cid_data)</p><p><b> {</b></p><p> u8 r1;
61、 </p><p> //發(fā)CMD10命令,讀CID</p><p> r1=SD_SendCmd(CMD10,0,0x01);</p><p> if(r1==0x00)</p><p><b> {</b></p><p> r1=SD_RecvData(cid_data,16
62、);//接收16個(gè)字節(jié)的數(shù)據(jù) </p><p><b> }</b></p><p> SD_DisSelect();//取消片選</p><p> if(r1)return 1;</p><p> else return 0;</p><p> }
63、 </p><p> //獲取SD卡的CSD信息,包括容量和速度信息</p><p> //輸入:u8 *cid_data(存放CID的內(nèi)存,至少16Byte) </p><p> //返回值:0:NO_ERR</p><p> //1:錯(cuò)誤 </p><p>
64、u8 SD_GetCSD(u8 *csd_data)</p><p><b> {</b></p><p><b> u8 r1; </b></p><p> r1=SD_SendCmd(CMD9,0,0x01);//發(fā)CMD9命令,讀CSD</p><p><b> if(r1
65、==0)</b></p><p><b> {</b></p><p> r1=SD_RecvData(csd_data, 16);//接收16個(gè)字節(jié)的數(shù)據(jù) </p><p><b> }</b></p><p> SD_DisSelect();//取消片選</p>
66、<p> if(r1)return 1;</p><p> else return 0;</p><p><b> } </b></p><p> //獲取SD卡的總扇區(qū)數(shù)(扇區(qū)數(shù)) </p><p> //返回值:0: 取容量出錯(cuò) </p><p> // 其他:S
67、D卡的容量(扇區(qū)數(shù)/512字節(jié))</p><p> //每扇區(qū)的字節(jié)數(shù)必為512,因?yàn)槿绻皇?12,則初始化不能通過.</p><p> u32 SD_GetSectorCount(void)</p><p><b> {</b></p><p> u8 csd[16];</p><
68、;p> u32 Capacity; </p><p><b> u8 n;</b></p><p> u16 csize; </p><p> //取CSD信息,如果期間出錯(cuò),返回0</p><p> if(SD_GetCSD(csd)!=0) return 0; </
69、p><p> //如果為SDHC卡,按照下面方式計(jì)算</p><p> if((csd[0]&0xC0)==0x40) //V2.00的卡</p><p><b> {</b></p><p> csize = csd[9] + ((u16)csd[8] << 8) + 1;</p>
70、;<p> Capacity = (u32)csize << 10;//得到扇區(qū)數(shù) </p><p> }else//V1.XX的卡</p><p><b> {</b></p><p> n = (csd[5] & 15) + ((csd[10] & 128) >>
71、7) + ((csd[9] & 3) << 1) + 2;</p><p> csize = (csd[8] >> 6) + ((u16)csd[7] << 2) + ((u16)(csd[6] & 3) << 10) + 1;</p><p> Capacity= (u32)csize << (n - 9);
72、//得到扇區(qū)數(shù) </p><p><b> }</b></p><p> return Capacity;</p><p><b> }</b></p><p><b> //初始化SD卡</b></p><p> u8 SD_Initia
73、lize(void)</p><p><b> {</b></p><p> u8 r1; // 存放SD卡的返回值</p><p> u16 retry; // 用來(lái)進(jìn)行超時(shí)計(jì)數(shù)</p><p> u8 buf[4]; </p><p><b> u16 i;&
74、lt;/b></p><p> SD_SPI_Init();//初始化IO</p><p> SD_SPI_SpeedLow();//設(shè)置到低速模式 </p><p> for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//發(fā)送最少74個(gè)脈沖</p><p><b>
75、retry=20;</b></p><p><b> do</b></p><p><b> {</b></p><p> r1=SD_SendCmd(CMD0,0,0x95);//進(jìn)入IDLE狀態(tài)</p><p> }while((r1!=0X01) && re
76、try--);</p><p> SD_Type=0;//默認(rèn)無(wú)卡</p><p> if(r1==0X01)</p><p><b> {</b></p><p> if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0</p><p><b>
77、 {</b></p><p> for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF);//Get trailing return value of R7 resp</p><p> if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V</p><
78、p><b> {</b></p><p> retry=0XFFFE;</p><p><b> do</b></p><p><b> {</b></p><p> SD_SendCmd(CMD55,0,0X01);//發(fā)送CMD55</p>
79、<p> r1=SD_SendCmd(CMD41,0x40000000,0X01);//發(fā)送CMD41</p><p> }while(r1&&retry--);</p><p> if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鑒別SD2.0卡版本開始</p><p><b>
80、; {</b></p><p> for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF);//得到OCR值</p><p> if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC; //檢查CCS</p><p> else SD_Type=SD_TYPE_V2;
81、 </p><p><b> }</b></p><p><b> }</b></p><p> }else//SD V1.x/ MMCV3</p><p><b> {</b></p><p> SD_SendCmd(CMD55,0,0X
82、01);//發(fā)送CMD55</p><p> r1=SD_SendCmd(CMD41,0,0X01);//發(fā)送CMD41</p><p><b> if(r1<=1)</b></p><p><b> {</b></p><p> SD_Type=SD_TYPE_V1;<
83、;/p><p> retry=0XFFFE;</p><p> do //等待退出IDLE模式</p><p><b> {</b></p><p> SD_SendCmd(CMD55,0,0X01);//發(fā)送CMD55</p><p> r1=SD_SendCmd(CMD41,0,0X0
84、1);//發(fā)送CMD41</p><p> }while(r1&&retry--);</p><p> }else//MMC卡不支持CMD55+CMD41識(shí)別</p><p><b> {</b></p><p> SD_Type=SD_TYPE_MMC;//MMC V3</p>&
85、lt;p> retry=0XFFFE;</p><p> do //等待退出IDLE模式</p><p> { </p><p> r1=SD_SendCmd(CMD1,0,0X01);//發(fā)送CMD1</p><p> }while(r1&&retry--); </p>
86、;<p><b> }</b></p><p> if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)SD_Type=SD_TYPE_ERR;//錯(cuò)誤的卡</p><p><b> }</b></p><p><b> }</b></p&g
87、t;<p> SD_DisSelect();//取消片選</p><p> SD_SPI_SpeedHigh();//高速</p><p> if(SD_Type)return 0;</p><p> else if(r1)return r1; </p><p> return 0xaa;//其他錯(cuò)誤</
88、p><p><b> }</b></p><p><b> //讀SD卡</b></p><p> //buf:數(shù)據(jù)緩存區(qū)</p><p> //sector:扇區(qū)</p><p><b> //cnt:扇區(qū)數(shù)</b></p><
89、;p> //返回值:0,ok;其他,失敗.</p><p> u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)</p><p><b> {</b></p><p><b> u8 r1;</b></p><p> if(SD_Type!=SD_TYP
90、E_V2HC)sector <<= 9;//轉(zhuǎn)換為字節(jié)地址</p><p> if(cnt==1)</p><p><b> {</b></p><p> r1=SD_SendCmd(CMD17,sector,0X01);//讀命令</p><p> if(r1==0)//指令發(fā)送成功</p&g
91、t;<p><b> {</b></p><p> r1=SD_RecvData(buf,512);//接收512個(gè)字節(jié) </p><p><b> }</b></p><p><b> }else</b></p><p><b> {&
92、lt;/b></p><p> r1=SD_SendCmd(CMD18,sector,0X01);//連續(xù)讀命令</p><p><b> do</b></p><p><b> {</b></p><p> r1=SD_RecvData(buf,512);//接收512個(gè)字節(jié) &l
93、t;/p><p> buf+=512; </p><p> }while(--cnt && r1==0); </p><p> SD_SendCmd(CMD12,0,0X01);//發(fā)送停止命令</p><p><b> } </b></p><p> SD_Dis
94、Select();//取消片選</p><p> return r1;//</p><p><b> }</b></p><p><b> //寫SD卡</b></p><p> //buf:數(shù)據(jù)緩存區(qū)</p><p> //sector:起始扇區(qū)</p>
95、;<p><b> //cnt:扇區(qū)數(shù)</b></p><p> //返回值:0,ok;其他,失敗.</p><p> u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt)</p><p><b> {</b></p><p><b>
96、 u8 r1;</b></p><p> if(SD_Type!=SD_TYPE_V2HC)sector *= 512;//轉(zhuǎn)換為字節(jié)地址</p><p> if(cnt==1)</p><p><b> {</b></p><p> r1=SD_SendCmd(CMD24,sector,0X01);
97、//讀命令</p><p> if(r1==0)//指令發(fā)送成功</p><p><b> {</b></p><p> r1=SD_SendBlock(buf,0xFE);//寫512個(gè)字節(jié) </p><p><b> }</b></p><p><b&
98、gt; }else</b></p><p><b> {</b></p><p> if(SD_Type!=SD_TYPE_MMC)</p><p><b> {</b></p><p> SD_SendCmd(CMD55,0,0X01);</p><p&
99、gt; SD_SendCmd(CMD23,cnt,0X01);//發(fā)送指令</p><p><b> }</b></p><p> r1=SD_SendCmd(CMD25,sector,0X01);//連續(xù)讀命令</p><p><b> if(r1==0)</b></p><p><
100、;b> {</b></p><p><b> do</b></p><p><b> {</b></p><p> r1=SD_SendBlock(buf,0xFC);//接收512個(gè)字節(jié) </p><p> buf+=512; </p><p&g
101、t; }while(--cnt && r1==0);</p><p> r1=SD_SendBlock(0,0xFD);//接收512個(gè)字節(jié) </p><p><b> }</b></p><p><b> } </b></p><p> SD_DisSelect();
102、//取消片選</p><p> return r1;//</p><p><b> }</b></p><p> #include "led.h"</p><p> #include "delay.h"</p><p> #include &qu
103、ot;sys.h"</p><p> #include "usart.h"</p><p> #include "lcd.h"</p><p> #include "key.h"</p><p> #include "malloc.h" <
104、;/p><p> #include "MMC_SD.h" </p><p> //讀取SD卡的指定扇區(qū)的內(nèi)容,并通過串口1輸出</p><p> //sec:扇區(qū)物理地址編號(hào)</p><p> void SD_Read_Sectorx(u32 sec)</p><p><b>
105、{</b></p><p><b> u8 *buf;</b></p><p><b> u16 i;</b></p><p> buf=mymalloc(512);//申請(qǐng)內(nèi)存</p><p> if(SD_ReadDisk(buf,sec,1)==0)//讀取0扇區(qū)
106、的內(nèi)容</p><p><b> {</b></p><p> LCD_ShowString(60,190,200,16,16,"USART1 Sending Data...");</p><p> printf("SECTOR 0 DATA:\r\n");</p><p>
107、; for(i=0;i<512;i++)printf("%x ",buf[i]);//打印sec扇區(qū)數(shù)據(jù) </p><p> printf("\r\nDATA ENDED\r\n");</p><p> LCD_ShowString(60,190,200,16,16,"USART1 Send Data Over!&
108、quot;);</p><p><b> }</b></p><p> myfree(buf);//釋放內(nèi)存</p><p><b> }</b></p><p> int main(void)</p><p><b> { </b><
109、/p><p> u8 key; </p><p> u32 sd_size;</p><p><b> u8 t=0; </b></p><p> NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級(jí)分組2</p><p>
110、 delay_init(); //延時(shí)函數(shù)初始化 </p><p> uart_init(9600); //串口初始化為9600</p><p> LED_Init(); //初始化與LED連接的硬件接口</p><p> LCD_Init(); //初始化LCD</p><p> KEY_
111、Init();//按鍵初始化 </p><p> mem_init();//初始化內(nèi)存池 </p><p> POINT_COLOR=RED;//設(shè)置字體為紅色 </p><p> LCD_ShowString(60,50,200,16,16,"Mini STM32");</p><p> L
112、CD_ShowString(60,70,200,16,16,"SD CARD TEST");</p><p> LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");</p><p> LCD_ShowString(60,110,200,16,16,"2014/3/13"); &l
113、t;/p><p> LCD_ShowString(60,130,200,16,16,"KEY0:Read Sector 0"); </p><p> while(SD_Initialize())//檢測(cè)不到SD卡</p><p><b> {</b></p><p> LCD_ShowStr
114、ing(60,150,200,16,16,"SD Card Error!");</p><p> delay_ms(500);</p><p> LCD_ShowString(60,150,200,16,16,"Please Check! ");</p><p> delay_ms(500);</p>
115、;<p> LED0=!LED0;//DS0閃爍</p><p><b> }</b></p><p> POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色 </p><p> //檢測(cè)SD卡成功 </p><p> LCD_ShowString(60,150,20
116、0,16,16,"SD Card OK ");</p><p> LCD_ShowString(60,170,200,16,16,"SD Card Size: MB");</p><p> sd_size=SD_GetSectorCount();//得到扇區(qū)數(shù)</p><p> LCD_ShowNum(16
117、4,170,sd_size>>11,5,16);//顯示SD卡容量</p><p><b> while(1)</b></p><p><b> {</b></p><p> key=KEY_Scan(0);</p><p> if(key==KEY0_PRES)SD_Read_
118、Sectorx(0);//KEY0按,讀取SD卡扇區(qū)0的內(nèi)容</p><p><b> t++;</b></p><p> delay_ms(10);</p><p><b> if(t==20)</b></p><p><b> {</b></p>&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- sd卡-中文學(xué)習(xí)筆記,基于stm32
- 基于stm32μcosii貪吃蛇的設(shè)計(jì)課程設(shè)計(jì)
- 基于stm32的圖像顯示系統(tǒng)-大學(xué)課程設(shè)計(jì)報(bào)告
- 基于stm32的幾種讀sd卡方式的速度探究
- 課程設(shè)計(jì)(論文)-基于stm32的簡(jiǎn)易照相機(jī)設(shè)計(jì)
- 基于stm32μcos_ii貪吃蛇的課程設(shè)計(jì)報(bào)告
- 基于stm32的數(shù)字示波器設(shè)計(jì)
- 基于stm32的智能小車設(shè)計(jì)設(shè)計(jì)
- 基于stm32μcos_ii貪吃蛇的課程設(shè)計(jì)報(bào)告
- stm32數(shù)字示波器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--基于stm32的智能小車設(shè)計(jì)
- 基于stm32的滴灌系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)
- 基于stm32的四路搶答器課程設(shè)計(jì)說明書
- 畢業(yè)設(shè)計(jì)-基于stm32智能小車設(shè)計(jì)
- 基于stm32的智能家居系統(tǒng)設(shè)計(jì)
- 基于STM32的FreeRTOS以及驅(qū)動(dòng)設(shè)計(jì).pdf
- 基于stm32的智能家居系統(tǒng)設(shè)計(jì)
- 基于stm32的紅外測(cè)距系統(tǒng)設(shè)計(jì)資料
- 基于stm32的智能家居系統(tǒng)設(shè)計(jì)
- 基于STM32的ARM嵌入式風(fēng)力擺控制系統(tǒng)設(shè)計(jì).doc
評(píng)論
0/150
提交評(píng)論