伟杰龙电子
首页 | 产品中心 | 文章中心 | 下载中心 | 电子博客 | 电子论坛 | 开发板商城 | 各地代理 | 淘宝店 | 拍拍店 | 百度店
文章首页  |  业界动态  |  单片机  |  嵌入式系统  |  DSP  |  FPGA/CPLD  |  EDA技术  |  软件编程  |  元器件
电源技术  |  模拟电子  |  高频电子  |  无线通信  |  网络通信  |  消费电子  |  汽车电子  |  接口电路  |  职场人生
您现在的位置: 首页 >> 文章中心 >> 单片机 >> 单片机与MMC卡的接口
单片机与MMC卡的接口

来源:电子开发网  作者:未知  人气:426  时间:2008-03-09 00:47:27


    多媒体卡MMC(MultiMedia Card)是由美国SanDisk公司和德国Simens公司于1997年共同开发推出的一种多功能存储卡。内置控制电路,可以使用在手机、数码相机、MP3、PDA等多种数字设备上,可反复记录30万次。现在市场上的主流容量有128 MB~2 GB。

  文中首先介绍单片机对SPI协议下的MMC卡的底层读写操作,然后分析MMC卡文件系统的结构,最后详细说明MMC卡文件的创建、读写、删除等操作。该方法可应用到与Windows有交互的嵌入式系统中,便于文件的统一管理。

1 单片机与MMC卡的接口
1.1 单片机与MMC卡的接口电路
  接口电路采用的是Philips公司的增强型LPC93x系列单片机。它除了比普通的8051有更快的指令执行周期外,还提供多种在片的硬件接口功能,如UART、SPI、I2C等,因此用LPC93x的SPI接口实现单片机与MMC卡的互连。

  MMC卡有7个引脚,支持两种串行数据传输协议,即MMC(Multimedia Card)模式和SPI(Serial PeripheralInterface)模式。在SPI模式中,通过4条信号线完成数据的传输。这4条信号线分别是时钟SPICLK、数据输入MISO、数据输出MOSI和片选SS#。
  LPC93x单片机与MMC卡的接口电路如图1所示。

 
 
1.2 MMC卡底层读写原理
  MMC卡读写操作都是基于命令的,通过向MMC卡发送枢直的命令并读取枢直的响应来实现对MMC卡的控制。在对MMC卡读写之前,首先要进行初始化操作。这是确保MMC卡能在SPI模式下进行正常数据读写的前提。需要注意的是,在发送使MMC卡空闲命令CMD0之前至少等待74个时钟,确保MMC卡进入SPI模式。

  初始化完成之后,如果使用默认的块读写长度(512字节),就可进行MMC卡的读写。当然,也可用CMD16来设置。MMC卡的块读取长度,可以是1~512字节之间的任意值。但是对MMC的写过程则要求块长度必须为512字节。无论是MMC卡的读还是写,都要求在读写命令发送后有数据起始令牌FEH,数据传输结束之后有2个字节的循环冗余编码CRC(Cyclic Redundancy Codes)。

2 MMC卡文件系统的结构分析
  要使写入MMC卡的数据在Windows下访问,需要在MMC卡上创建Windows支持的FATl6文件系统。MMC卡上的FATl6文件系统的结构包含分区引导记录、文件分配表、文件目录表以及数据区4个部分。
 

分区引导记录通常包含4块内容;
①BIOS参数记录块BPB(BIPS Parameter Block);
②磁盘标志记录表;
③分区引导记录代码区;
④结束标志55AA。
BPB表从扇区字节位移0bH开始,共占25字节。表1是从MMC卡的首扇区中读出的BPB表的内容。

 
 
  在分区引导记录之后是FAT(File Allocation Table,文件分配表)区。FATl6的文件系统中有两份完全相同的文件分配表FAT1和FAT2,每份FAT表占用空间的大小可从BPB表中查得。
 
  文件在磁盘上以簇为单位存储,但是同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,往往会分成若干簇,FAT表就是记录文件存储中簇与簇之问连接信息的,这就是文件的链式存储。FATl6以2个字节(即16位)表示1个簇,起始2个字为F8FFH、FFFFH,后面的FFFFH表示终止,0000H表示未使用。

  紧接在FAT表之后的是文件目录表FDT,固定占32个扇区,每个扇区可以容纳16个登记项,每个登记项的长度是32字节。

  文件目录表之后就是数据区DATA,用来存放文件数据,占用大部分的磁盘空间。

3 MMC卡文件系统的实现
  单片机对MMC底层的读写,按照FAT16的格式对MMC卡上数据进行操作,就可在MMC卡上创建文件、读写文件和删除文件等,从而实现文件的管理。3.1 文件(或目录)的创建
  在MMC卡上创建文件(或目录)的过程就是在文件目录表FDT中申请登记项的过程。登记项中包括文件名、文件长度和起始簇号等内容。为此定义了如下结构:

 

 
代码
  1. typedef struct{   
  2.   u8 FileName[8]; //文件名,不足8字节用空格补充   
  3.   u8 ExtName[3]; //扩展名   
  4.   u8 attribute; //属性,典型值:存档(0x20)、卷标(0x08)   
  5.   u8 reserved[10]; //保留   
  6.   u16 time; //time=Hr*2048+Min*32+Sec+2   
  7.   u16 date; //date=(Yr-1980)*512+Mon*32+Day   
  8.   u16 StartCluster; //起始簇号   
  9.   u32 FileLength; //文件长度   
  10. }DIR_tag;  
 

   文件名一般占用8字节,长的文件名需要用resetx,ed[]数组。文件名的首字节又表明该文件的状态,00H表示该目录项未使用,E5H表示该文件(或目录)已被删除。创建目录时,属性值设置为10H(表示子目录),文件长度为0。

3.2 文件的读写
  MMC卡上文件都是以簇为单位存取的。当读取MMC卡上的文件时,首先要根据文件名查找到该文件的目录登记项。根据目录登记项中的起始簇号既可找到文件在数据区DATA中第1簇的内容,又可在FAT表中找到第2个簇号。根据第2个簇号又能找到第2簇的内容和FAT表中的第3个簇号。这样,就可以根据FAT表中的簇号读取到全部文件数据。写文件时要保证FAT1和FAT2中内容的一致性,即对两块都要进行同样的写操作。对于FATl6,可以由下面的公式计算出数据起始逻辑扇区号:

  起始逻辑扇区=隐藏扇区数+1+2*每FAT扇区数+FDT扇区数+(起始簇号-2)*每簇扇区数
从表1可知,MMC卡上隐藏的扇区数为0,每个FAT占用243个扇区,FDT固定占用32个扇区。写文件的相关代码如下(设文件长度小于512字节):
 


 
代码
  1. void file_write(DIR_tag  *file_tag,char *data){   
  2.     //data为指向数据的指针   
  3.     u16  j,offset=file_tag.StartCluster*2;   
  4.     //FAT16用16位表示1个簇   
  5.     mmc_read block(&sdc,fat1_addr+offset/512,mmc_buffer);    //读取起始簇号所在的块   
  6.     mmc_buffer[offset%512]=0xff;//文件结束标志ff ff   
  7.     mme_buffer[offset%512+1]=0xff;   
  8.     mmc_write_block(&sdc,fat1_addr+offset/512,mmc_buffer);    //写FAT1   
  9.   mmc_write_block(&sdc,fat2_addr+offset/512,mmc_buffer);    //写FAT2,与FAT1同   
  10.   for(j=0,j<file_tag.FileLength;j++) mmc_buffer[i]=data[j];   
  11.   mmc_write_block(&sdc,519+(file_tag.StartCluster-2),mmc_buffer);    //写入数据   
  12. }  
 

3.3 文件的删除
  文件的删除也是对MMC卡上文件管理的一个重要方面。删除文件时,并不涉及数据区的操作,只须在文件的目录登记项上作一个删除标记,并把文件在FAT表中所占用的簇标记为“空簇”。删除文件的代码如下:

 
代码
 
  1. int file_delete(DIR_tag *file_tag){   
  2.   u16 k,clust_buf,offset1,offset= file_tag.StartCluster*2; //FAT16用16位表示1个簇   
  3.   file_tag.FileName[7]=0xe5;//FDT中文件被删除标志   
  4.   write_fdt(file_tag);//写修改过的目录登记项写回MMC卡   
  5.   k= file_tag.FileLength/512+1;//总循环次数   
  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); //写FAT1   
  19.     mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //写FAT2,内容与FAT1同   
  20.     return 1;   
  21.     }   
  22.     if(offset1/512 !=offset/512){   
  23.     mmc_write_block(&sdc,fat1_addr+ offset/512,mmc_buffer); //写FAT1   
  24.     mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //写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 小结

  通过对SPI模式下MMC卡读写和文件系统的研究,实现了单片机对MMC卡FAT16文件的管理,包括文件的创建、读写、删除等操作。该方法为数据采集系统提供了一种非易失性存储器的解决方案,采集到的数据会以标准文件的格式记录到MMC卡上,数据文件可在Windows下用读卡器读取,在保证高性价比的同时,又方便了数据的进一步分析、处理。通过在长时间心电图监测系统中的实际应用,证明了该方法的可行性。该方案也可应用到诸如MP3等与Windows有交互的移动存储设备中,便于文件的统一管理。

  系统采用SPI接口,占用较少的I/O资源。由于SD卡也支持SPI模式,故文中的MMC卡也可以用SD卡替代。
收藏此页】【打印】【关闭窗口】   

 相关产品
  WJ89S52V2.1单片机开发板 ¥380元 (2007-10-22)
  WJ430F149V2.0单片机开发板 ¥480元 (2007-11-08)
  WJ89C52V1.2单片机开发板 ¥280元 (2008-07-05)
  WJ51PV2.1 51单片机编程器 ¥180元 (2007-09-17)
  ICD2.5 PIC单片机仿真器 ¥280元 (2007-03-13)
  WJ16F877AV2.0单片机开发板 ¥380元 (2007-03-13)
 相关文章
  单片机入门  (2008-03-10 00:46:13)
  用单片机模拟I2C总线实现串行E2PROM的读写  (2008-05-24 22:45:31)
  单片机与MMC卡的接口  (2008-03-09 00:47:27)
  12位A/D转换器ADS7804与51单片机的接口及程序设计  (2008-03-10 01:11:41)
  单片机显控系统中的汉字输入  (2008-03-10 01:03:03)
  80C51单片机与MCS-51单片机的区别  (2008-05-24 22:37:06)
  基于MSP430单片机和nRF905的无线通信系统  (2008-04-28 14:21:52)
  基于单片机控制的高精密直流电流源的设计  (2008-04-28 14:28:57)
  51单片机与串行AD转换器TLC2543的接口设计  (2008-05-24 22:30:04)
  基于C8051F单片机的红外轴温探测器零点校正技术  (2008-04-28 14:13:16)
 
   MSP430并口仿真器
   ATMEL ISP下载线
   WJ89C52V1.2单片机开发板
   WJ1C6V2.0 FPGA开发板
   PIC16F877A
   SST89E516 仿真芯片
   STC89C52
   USB AVRISP/STK500下载器
   WJ430F149V2.0单片机开发板
   WJ89S52V2.1单片机开发板
   WJ89S52V2.1单片机开发板
   1602字符型液晶屏
   Altera ByteBlasterII下载线
   USB BLASTER下载线
   128*64图形液晶屏
   WJ430F149V2.0单片机开发板
   WJ1C6V2.0 FPGA开发板
   WJ89C52V1.2单片机开发板
   WJ51PV2.1 51单片机编程器
   AT89S52
   程序的书写规则(程序的编码规
   c8051f单片机使用经验总结
   纯c语言实现动态分配多维数组
   从Cygnal C8051F看8位单片机
   51单片机控制的DS1302时钟程
   几种常用单片机介绍
   DSP开发中值得注意的几个问题
   德州仪器认为DSP技术正快速推
   Linux内核技术分析
   Linux操作系统12则经典应用技
   Linux操作系统发展简史
   教你一招 Linux常见紧急情况
   嵌入式Linux操作系统的驱动程
   基于嵌入式Linux平台多协议路
   系统学习linux的十一点
   单片机入门
   89S51与89C51的不同之处
   Keil C51程序设计中几种精确
   汇编程序编写的一些原则
   用单片机模拟I2C总线实现串行
   单片机与MMC卡的接口
   12位A/D转换器ADS7804与51单
   单片机显控系统中的汉字输入
   80C51单片机与MCS-51单片机的
   用FIFO实现高速模数转换器与
   基于MSP430单片机和nRF905的
   C51编程规则讲述
   基于单片机控制的高精密直流
   8051的汇编控制指令
   51单片机与串行AD转换器TLC2
关于我们 -- 各地代理 -- 付款方式 -- 购物流程 -- 售后服务 -- 淘宝店 -- 百度店 -- 拍拍店
Copyright © 2006-2008 伟杰龙电子 All Rights Reserved 沪ICP备08014295号
陈先生:QQ: 手机:13818903490 Email:
李先生:QQ: 手机:13622090409 Email:
宋先生:QQ: 手机:15881645409 Email:
电话:021-22819431 传真:021-66341252 地址:上海市宝山区大华路1380弄37号