<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

單片機與MMC卡的接口

作者: 時(shí)間:2008-02-29 來(lái)源:電子開(kāi)發(fā)網(wǎng) 收藏

        多媒體卡MMC(MultiMedia Card)是由美國SanDisk公司和德國Simens公司于1997年共同開(kāi)發(fā)推出的一種多功能存儲卡。內置控制電路,可以使用在手機、數碼相機、MP3、PDA等多種數字設備上,可反復記錄30萬(wàn)次?,F在市場(chǎng)上的主流容量有128 MB~2 GB。   

本文引用地址:http://dyxdggzs.com/article/79408.htm

        文中首先介紹單片機對SPI協(xié)議下的MMC卡的底層讀寫(xiě)操作,然后分析MMC卡文件系統的結構,最后詳細說(shuō)明MMC卡文件的創(chuàng )建、讀寫(xiě)、刪除等操作。該方法可應用到與Windows有交互的嵌入式系統中,便于文件的統一管理。

       1 單片機與MMC卡的接口

       1.1 單片機與MMC卡的接口電路   

       接口電路采用的是Philips公司的增強型LPC93x系列單片機。它除了比普通的8051有更快的指令執行周期外,還提供多種在片的硬件接口功能,如UART、SPI、I2C等,因此用LPC93x的SPI接口實(shí)現單片機與MMC卡的互連。   

       MMC卡有7個(gè)引腳,支持兩種串行數據傳輸協(xié)議,即MMC(Multimedia Card)模式和SPI(Serial PeripheralInterface)模式。在SPI模式中,通過(guò)4條信號線(xiàn)完成數據的傳輸。這4條信號線(xiàn)分別是時(shí)鐘SPICLK、數據輸入MISO、數據輸出MOSI和片選SS#。   

        LPC93x單片機與MMC卡的接口電路如圖1所示。

 
       1.2 MMC卡底層讀寫(xiě)原理

        MMC卡讀寫(xiě)操作都是基于命令的,通過(guò)向MMC卡發(fā)送樞直的命令并讀取樞直的響應來(lái)實(shí)現對MMC卡的控制。在對MMC卡讀寫(xiě)之前,首先要進(jìn)行初始化操作。這是確保MMC卡能在SPI模式下進(jìn)行正常數據讀寫(xiě)的前提。需要注意的是,在發(fā)送使MMC卡空閑命令CMD0之前至少等待74個(gè)時(shí)鐘,確保MMC卡進(jìn)入SPI模式。

        初始化完成之后,如果使用默認的塊讀寫(xiě)長(cháng)度(512字節),就可進(jìn)行MMC卡的讀寫(xiě)。當然,也可用CMD16來(lái)設置。MMC卡的塊讀取長(cháng)度,可以是1~512字節之間的任意值。但是對MMC的寫(xiě)過(guò)程則要求塊長(cháng)度必須為512字節。無(wú)論是MMC卡的讀還是寫(xiě),都要求在讀寫(xiě)命令發(fā)送后有數據起始令牌FEH,數據傳輸結束之后有2個(gè)字節的循環(huán)冗余編碼CRC(Cyclic Redundancy Codes)。

        2 MMC卡文件系統的結構分析   

       要使寫(xiě)入MMC卡的數據在Windows下訪(fǎng)問(wèn),需要在MMC卡上創(chuàng )建Windows支持的FATl6文件系統。MMC卡上的FATl6文件系統的結構包含分區引導記錄、文件分配表、文件目錄表以及數據區4個(gè)部分。   

      分區引導記錄通常包含4塊內容;
      ①BIOS參數記錄塊BPB(BIPS Parameter Block);
      ②磁盤(pán)標志記錄表;
      ③分區引導記錄代碼區;
      ④結束標志55AA。   

       BPB表從扇區字節位移0bH開(kāi)始,共占25字節。表1是從MMC卡的首扇區中讀出的BPB表的內容。

       在分區引導記錄之后是FAT(File Allocation Table,文件分配表)區。FATl6的文件系統中有兩份完全相同的文件分配表FAT1和FAT2,每份FAT表占用空間的大小可從BPB表中查得。
   
       文件在磁盤(pán)上以簇為單位存儲,但是同一個(gè)文件的數據并不一定完整地存放在磁盤(pán)的一個(gè)連續的區域內,往往會(huì )分成若干簇,FAT表就是記錄文件存儲中簇與簇之問(wèn)連接信息的,這就是文件的鏈式存儲。FATl6以2個(gè)字節(即16位)表示1個(gè)簇,起始2個(gè)字為F8FFH、FFFFH,后面的FFFFH表示終止,0000H表示未使用。
   
       緊接在FAT表之后的是文件目錄表FDT,固定占32個(gè)扇區,每個(gè)扇區可以容納16個(gè)登記項,每個(gè)登記項的長(cháng)度是32字節。   

        文件目錄表之后就是數據區DATA,用來(lái)存放文件數據,占用大部分的磁盤(pán)空間。

       3 MMC卡文件系統的實(shí)現
   
        單片機對MMC底層的讀寫(xiě),按照FAT16的格式對MMC卡上數據進(jìn)行操作,就可在MMC卡上創(chuàng )建文件、讀寫(xiě)文件和刪除文件等,從而實(shí)現文件的管理。3.1 文件(或目錄)的創(chuàng )建     在MMC卡上創(chuàng )建文件(或目錄)的過(guò)程就是在文件目錄表FDT中申請登記項的過(guò)程。登記項中包括文件名、文件長(cháng)度和起始簇號等內容。為此定義了如下結構: 
     代碼
typedef struct{   
  u8 FileName[8]; //文件名,不足8字節用空格補充   
  u8 ExtName[3]; //擴展名   
  u8 attribute; //屬性,典型值:存檔(0x20)、卷標(0x08)   
  u8 reserved[10]; //保留   
  u16 time; //time=Hr*2048+Min*32+Sec+2   
  u16 date; //date=(Yr-1980)*512+Mon*32+Day   
  u16 StartCluster; //起始簇號   
  u32 FileLength; //文件長(cháng)度   
}DIR_tag;  

        文件名一般占用8字節,長(cháng)的文件名需要用resetx,ed[]數組。文件名的首字節又表明該文件的狀態(tài),00H表示該目錄項未使用,E5H表示該文件(或目錄)已被刪除。創(chuàng )建目錄時(shí),屬性值設置為10H(表示子目錄),文件長(cháng)度為0。

      3.2 文件的讀寫(xiě)
   
        MMC卡上文件都是以簇為單位存取的。當讀取MMC卡上的文件時(shí),首先要根據文件名查找到該文件的目錄登記項。根據目錄登記項中的起始簇號既可找到文件在數據區DATA中第1簇的內容,又可在FAT表中找到第2個(gè)簇號。根據第2個(gè)簇號又能找到第2簇的內容和FAT表中的第3個(gè)簇號。這樣,就可以根據FAT表中的簇號讀取到全部文件數據。寫(xiě)文件時(shí)要保證FAT1和FAT2中內容的一致性,即對兩塊都要進(jìn)行同樣的寫(xiě)操作。對于FATl6,可以由下面的公式計算出數據起始邏輯扇區號:   

       起始邏輯扇區=隱藏扇區數+1+2*每FAT扇區數+FDT扇區數+(起始簇號-2)*每簇扇區數 

       從表1可知,MMC卡上隱藏的扇區數為0,每個(gè)FAT占用243個(gè)扇區,FDT固定占用32個(gè)扇區。寫(xiě)文件的相關(guān)代碼如下(設文件長(cháng)度小于512字節):
  
       代碼
void file_write(DIR_tag  *file_tag,char *data){   
    //data為指向數據的指針   
    u16  j,offset=file_tag.StartCluster*2;   
    //FAT16用16位表示1個(gè)簇   
    mmc_read block(&sdc,fat1_addr+offset/512,mmc_buffer);    //讀取起始簇號所在的塊   
    mmc_buffer[offset%512]=0xff;//文件結束標志ff ff   
    mme_buffer[offset%512+1]=0xff;   
    mmc_write_block(&sdc,fat1_addr+offset/512,mmc_buffer);    //寫(xiě)FAT1   
  mmc_write_block(&sdc,fat2_addr+offset/512,mmc_buffer);    //寫(xiě)FAT2,與FAT1同   
  for(j=0,j   mmc_write_block(&sdc,519+(file_tag.StartCluster-2),mmc_buffer);    //寫(xiě)入數據   
}  

       3.3 文件的刪除   

        文件的刪除也是對MMC卡上文件管理的一個(gè)重要方面。刪除文件時(shí),并不涉及數據區的操作,只須在文件的目錄登記項上作一個(gè)刪除標記,并把文件在FAT表中所占用的簇標記為“空簇”。刪除文件的代碼如下:

        代碼
  1. int file_delete(DIR_tag *file_tag){   
  2.   u16 k,clust_buf,offset1,offset= file_tag.StartCluster*2; //FAT16用16位表示1個(gè)簇   
  3.   file_tag.FileName[7]=0xe5;//FDT中文件被刪除標志   
  4.   write_fdt(file_tag);//寫(xiě)修改過(guò)的目錄登記項寫(xiě)回MMC卡   
  5.   k= file_tag.FileLength/512+1;//總循環(huán)次數   
  6.   mmc_read_block(&sde,fat1_addr+offset/512,mmc_buffer);   
  7. //讀取起始簇號所在的塊   
  8.   do {   
  9.     clust_buf= mmc_buffer[offset%512]&0x00ff(mmc_buffer[offset%512+1]&0x00ff)<<8;   
  10.     if(clust_buf!= 0xffff){ //不是文件終止   
  11.     mmc_buffer[offset%512]=0; //空簇標志00 00   
  12.     mmc_buffer[offset%512+1]=0;   
  13.     offset1= clust_buf*2; //偏移地址   
  14.     }   
  15.     else//文件終止,完成返回1   
  16.     mmc_buffer[offset%512]=0;   
  17.     mmc_buffer[offset%512+1]=0;   
  18.     mmc_write_block(&sde,fat1_addr+ offset/512,mmc_buffer); //寫(xiě)FAT1   
  19.     mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //寫(xiě)FAT2,內容與FAT1同   
  20.     return 1;   
  21.     }   
  22.     if(offset1/512 !=offset/512){   
  23.     mmc_write_block(&sdc,fat1_addr+ offset/512,mmc_buffer); //寫(xiě)FAT1   
  24.     mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //寫(xiě)FAT2,內容與FAT1同   
  25.     mmc_read_block(&sdc,fat1_addr+ offset1/512,mmc_buffer); //讀取下一簇號所在的塊   
  26.     }   
  27.     offset= offset1; k--;   
  28. }while(k>=0);   
  29. return 0; //未找到文件結束標志,返回0。

     4 小結   

       通過(guò)對SPI模式下MMC卡讀寫(xiě)和文件系統的研究,實(shí)現了單片機對MMC卡FAT16文件的管理,包括文件的創(chuàng )建、讀寫(xiě)、刪除等操作。該方法為數據采集系統提供了一種非易失性存儲器的解決方案,采集到的數據會(huì )以標準文件的格式記錄到MMC卡上,數據文件可在Windows下用讀卡器讀取,在保證高性?xún)r(jià)比的同時(shí),又方便了數據的進(jìn)一步分析、處理。通過(guò)在長(cháng)時(shí)間心電圖監測系統中的實(shí)際應用,證明了該方法的可行性。該方案也可應用到諸如MP3等與Windows有交互的移動(dòng)存儲設備中,便于文件的統一管理。   

        系統采用SPI接口,占用較少的I/O資源。由于SD卡也支持SPI模式,故文中的MMC卡也可以用SD卡替代。



關(guān)鍵詞: 單片機 MMC 接口

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>