久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12718|回復: 12
打印 上一主題 下一主題
收起左側

[分享]單片機應用----SD卡讀寫設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:3695 發表于 2008-9-16 16:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前言


長期以來,以Flash Memory為存儲體的SD卡因具備體積小、功耗低、可擦寫以及非易失性等特點而被廣泛應用于消費類電子產品中。特別是近年來,隨著價格不斷下降且存儲容量不斷提高,它的應用范圍日益增廣。當數據采集系統需要長時間地采集、記錄海量數據時,選擇SD卡作為存儲媒質是開發者們一個很好的選擇。在電能監測以及無功補償系統中,要連續記錄大量的電壓、電流、有功功率、無功功率以及時間等參數,當單片機采集到這些數據時可以利用SD作為存儲媒質。本文主要介紹了SD卡在電能監測及無功補償數據采集系統中的應用方案。


設計方案


應用AT89C52讀寫SD卡有兩點需要注意。首先,需要尋找一個實現AT89C52單片機與SD卡通訊的解決方案;其次,SD卡所能接受的邏輯電平與AT89C52提供的邏輯電平不匹配,需要解決電平匹配問題。


通訊模式


SD卡有兩個可選的通訊協議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,但是在選用SD模式時,往往需要選擇帶有SD卡控制器接口的mcu,或者必須加入額外的SD卡控制單元以支持SD卡的讀寫。然而,AT89C52單片機沒有集成SD卡控制器接口,若選用SD模式通訊就無形中增加了產品的硬件成本。在SD卡數據讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數據交換,并且目前市場上很多mcu都集成有現成的SPI接口電路,采用SPI模式對SD卡進行讀寫操作可大大簡化硬件電路的設計。


雖然AT89C52不帶SD卡硬件控制器,也沒有現成的SPI接口模塊,但是可以用軟件模擬出SPI總線時序。本文用SPI總線模式讀寫SD卡。


電平匹配


SD卡的邏輯電平相當于3.3V TTL電平標準,而控制芯片AT89C52的邏輯電平為5V CMOS電平標準。因此,它們之間不能直接相連,否則會有燒毀SD卡的可能。出于對安全工作的考慮,有必要解決電平匹配問題。


要解決這一問題,最根本的就是解決邏輯器件接口的電平兼容問題,原則主要有兩條:一為輸出電平器件輸出高電平的最小電壓值,應該大于接收電平器件識別為高電平的最低電壓值;另一條為輸出電平器件輸出低電平的最大電壓值,應該小于接收電平器件識別為低電平的最高電壓值。


一般來說,通用的電平轉換方案是采用類似SN74ALVC4245的專用電平轉換芯片,這類芯片不僅可以用作升壓和降壓,而且允許兩邊電源不同步。但是,這個方案代價相對昂貴,而且一般的專用電平轉換芯片都是同時轉換8路、16路或者更多路數的電平,相對本系統僅僅需要轉換3路來說是一種資源的浪費。


考慮到SD卡在SPI協議的工作模式下,通訊都是單向的,于是在單片機向SD卡傳輸數據時采用晶體管加上拉電阻法的方案,基本電路如圖1所示。而在SD卡向單片機傳輸數據時可以直接連接,因為它們之間的電平剛好滿足上述的電平兼容原則,既經濟又實用。

這個方案需要雙電源供電(一個5V電源、一個3.3V電源供電),3.3V電源可以用AMS1117穩壓管從5V電源穩壓獲取。

硬件接口設計


SD卡提供9Pin的引腳接口便于外圍電路對其進行操作,9Pin的引腳隨工作模式的不同有所差異。在SPI模式下,引腳1(DAT3)作為SPI片選線CS用,引腳2(CMD)用作SPI總線的數據輸出線MOSI,而引腳7(DAT0)為數據輸入線MISO,引腳5用作時鐘線(CLK)。除電源和地,保留引腳可懸空。


本文中控制SD卡的mcu是ATMEL公司生產的低電壓、高性能CMOS 8位單片機AT89C52,內含8K字節的可反復擦寫的只讀程序存儲器和256字節的隨機存儲數據存儲器。由于AT89C52只有256字節的數據存儲器,而SD卡的數據寫入是以塊為單位,每塊為512字節,所以需要在單片機最小系統上增加一片RAM。本系統中RAM選用存儲器芯片HM62256,容量為32K。對RAM進行讀寫時,鎖存器把低8位地址鎖存,與P2口的8位地址數據構成16位地址空間,從而可使SD卡一次讀寫512字節的塊操作。系統硬件圖如圖2所示。



軟件設計


SPI工作模式


SD卡在上電初期自動進入SD總線模式,在此模式下向SD卡發送復位命令CMD0。如果SD卡在接收復位命令過程中CS低電平有效,則進入SPI模式,否則工作在SD總線模式。


對于不帶SPI串行總線接口的AT89C52單片機來說,用軟件來模擬SPI總線操作的具體做法是:將P1.5口(模擬CLK線)的初始狀態設置為1,而在允許接收后再置P1.5為0。這樣,mcu在輸出1位SCK時鐘的同時,將使接口芯片串行左移,從而輸出1位數據至AT89C52單片機的P1.7(模擬MISO線),此后再置P1.5為1,使單片機從P1.6(模擬MOSI線)輸出1位數據(先為高位)至串行接口芯片。至此,模擬1位數據輸入輸出便完成。此后再置P1.5為0,模擬下1位數據的輸入輸出,依此循環8次,即可完成1次通過SPI總線傳輸8位數據的操作。


本文的實現程序把SPI總線讀寫功能集成在一起,傳遞的val變量既是向SPI寫的數據,也是從SPI讀取的數據。具體程序如下:(程序是在Keil uVision2的編譯環境下編寫)


  sbit CS="P3"^5;


  sbit CLK= P1^5;


  sbit DataI="P1"^7;


  sbit DataO="P1"^6;


  #define SD_Disable() CS="1" //片選關


  #define SD_Enable() CS="0" //片選開


  unsigned char SPI_TransferByte(unsigned char val)


  {


  unsigned char BitCounter;


  for(BitCounter=8; BiCounter!=0; BitCounter--)


  { CLK="0";


  DataI=0; // write


  if(val&0x80) DataI="1";


  val<<=1;


  CLK=1;


  if(DataO)val|=1; // read


  }


  CLK=0;


  return val;


  }


SD卡的初始化


對SD卡進行操作首先要對SD卡進行初始化,初始化的過程中設置SD卡工作在SPI模式,其流程圖如圖3所示。


在復位成功之后可以通過CMD55和ACMD41判斷當前電壓是否在工作范圍內。主機還可以繼續通過CMD10讀取SD卡的CID寄存器,通過CMD16設置數據Block長度,通過CMD9讀取卡的CSD寄存器。從CSD寄存器中,主機可獲知卡容量,支持的命令集等重要參數。SD卡初始化的C語言程序如下:


  unsigned char SD_Init(void)


  { unsigned char retry,temp;


  unsigned char i;


  for (i=0;i<0x0f;i++)


  { SPI_TransferByte(0xff); //延遲74個以上的時鐘


  }


  SD_Enable(); //開片選


  SPI_TransferByte(SD_RESET); //發送復位命令


  SPI_TransferByte(0x00);


  SPI_TransferByte(0x00);


  SPI_TransferByte(0x00);


  SPI_TransferByte(0x00);


  SPI_TransferByte(0x95);


  SPI_TransferByte(0xff);


  SPI_TransferByte(0xff);


  retry=0;


  do{ temp="Write"_Command_SD(SD_INIT,0);


  //發送初始化命令


  retry++;


  if(retry==100) //重試100次


  {SD_Disable(); //關片選


  return(INIT_CMD1_ERROR);


  //如果重試100次失敗返回錯誤號


  }


  }while(temp!=0);


  SD_Disable(); //關片選


  return(TRUE); //返回成功


  }


數據塊的讀寫


完成SD卡的初始化之后即可進行它的讀寫操作。SD卡的讀寫操作都是通過發送SD卡命令完成的。SPI總線模式支持單塊(CMD24)和多塊(CMD25)寫操作,多塊操作是指從指定位置開始寫下去,直到SD卡收到一個停止命令CMD12才停止。單塊寫操作的數據塊長度只能是512字節。單塊寫入時,命令為CMD24,當應答為0時說明可以寫入數據,大小為512字節。SD卡對每個發送給自己的數據塊都通過一個應答命令確認,它為1個字節長,當低5位為00101時,表明數據塊被正確寫入SD卡。


在需要讀取SD卡中數據的時候,讀SD卡的命令字為CMD17,接收正確的第一個響應命令字節為0xFE,隨后是512個字節的用戶數據塊,最后為2個字節的CRC驗證碼。


可見,讀寫SD卡的操作都是在初始化后基于SD卡命令和響應完成操作的,寫、讀SD卡的程序流程圖如圖4和圖5所示。


結束語


實驗結果表明單片機使用12MHz的晶體振蕩器時,讀寫速度和功耗都基本令人滿意,可以應用于對讀寫速度要求不高的情況下。本文詳細闡述了用AT89C52單片機對SD卡進行操作的過程,提出了一種不帶SD卡控制器,mcu讀寫SD卡的方法,實現了SD卡在電能監測及無功補償數據采集系統中的用途。


[此貼子已經被作者于2008-9-17 11:44:59編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:5858 發表于 2008-10-12 21:15 | 只看該作者
太深奧了
回復

使用道具 舉報

板凳
ID:4353 發表于 2008-11-2 21:24 | 只看該作者

高手

回復

使用道具 舉報

地板
ID:6728 發表于 2008-11-11 15:55 | 只看該作者
回復

使用道具 舉報

5#
ID:9213 發表于 2009-3-6 13:00 | 只看該作者
不錯
回復

使用道具 舉報

6#
ID:9120 發表于 2009-3-14 23:35 | 只看該作者

高手

回復

使用道具 舉報

7#
ID:70371 發表于 2014-12-12 16:30 | 只看該作者
回復

使用道具 舉報

8#
ID:134543 發表于 2016-8-5 17:08 | 只看該作者
牛叉,看不太懂
回復

使用道具 舉報

9#
ID:185293 發表于 2017-4-1 10:37 | 只看該作者
所以硬件圖呢樓主
回復

使用道具 舉報

10#
ID:202675 發表于 2017-5-19 20:58 | 只看該作者
我們現在用的就是這種
回復

使用道具 舉報

11#
ID:79094 發表于 2024-5-5 21:25 | 只看該作者
大哥  求你們 別坑 你這是mmc 初始化  和sd  不一樣   有sd的程序不 給新人個 我用cmd 1 搞了好久 失敗 總算從坑里爬出來了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人99久久亚洲综合精品 | 中文字幕精品一区 | 久久国产精品视频 | 天天干com | 九色视频网站 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 羞羞视频网站在线观看 | 日本成人久久 | 日韩精品一区二区三区在线观看 | 亚洲高清在线观看 | 日韩视频a | 精品欧美色视频网站在线观看 | 日韩一区二区三区在线播放 | 91精品国产综合久久婷婷香蕉 | 国产三区四区 | 青青久久 | 亚洲日韩中文字幕一区 | 免费观看一级视频 | 国产日韩久久久久69影院 | 成年视频在线观看福利资源 | 少妇精品久久久久久久久久 | 黄色综合 | 91免费观看国产 | 成年无码av片在线 | 国产99久久精品一区二区永久免费 | 午夜精品久久久久久久99黑人 | 午夜精品久久久久久久久久久久久 | 久久高清| 亚洲视频手机在线 | 日本午夜网站 | 欧美综合一区二区三区 | 久久久久久久99 | 欧州一区 | 久久久久久国产精品免费免费男同 | 激情欧美一区二区三区中文字幕 | 超碰在线网站 | 日韩成人精品一区 | 亚洲精品视频一区二区三区 | 久精品久久 | 欧美1区 | 欧美一级做性受免费大片免费 |