2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論