单片机与MMC卡的接口

发布者:知识智慧最新更新时间:2012-01-06 关键字:单片机  MMC卡 手机看文章 扫描二维码
随时随地手机看文章
  多媒体卡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#。
   
  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中申请登记项的过程。登记项中包括文件名、文件长度和起始簇号等内容。为此定义了如下结构:   

  代码
  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; //文件长度   
  }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)*每簇扇区数
  
  MMC卡上隐藏的扇区数为0,每个FAT占用243个扇区,FDT固定占用32个扇区。写文件的相关代码如下(设文件长度小于512字节):

  代码
  void file_write(DIR_tag  *file_tag,char *data){   
  //data为指向数据的指针   
  u16  j,offset=file_tag.StartCluster*2;   
  //FAT16用16位表示1个簇   
  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);    //写FAT1   
  mmc_write_block(&sdc,fat2_addr+offset/512,mmc_buffer);    //写FAT2,与FAT1同   
  for(j=0,j  mmc_write_block(&sdc,519+(file_tag.StartCluster-2),mmc_buffer);    //写入数据   
  }  

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

  代码
  int file_delete(DIR_tag *file_tag){   
  u16 k,clust_buf,offset1,offset= file_tag.StartCluster*2; //FAT16用16位表示1个簇   
  file_tag.FileName[7]=0xe5;//FDT中文件被删除标志   
  write_fdt(file_tag);//写修改过的目录登记项写回MMC卡   
  k= file_tag.FileLength/512+1;//总循环次数   
  mmc_read_block(&sde,fat1_addr+offset/512,mmc_buffer);   
  //读取起始簇号所在的块   
  do {   
  clust_buf= mmc_buffer[offset%512]&0x00ff(mmc_buffer[offset%512+1]&0x00ff)<<8;   
  if(clust_buf!= 0xffff){ //不是文件终止   
  mmc_buffer[offset%512]=0; //空簇标志00 00   
  mmc_buffer[offset%512+1]=0;   
  offset1= clust_buf*2; //偏移地址   
  }   
  else{ //文件终止,完成返回1   
  mmc_buffer[offset%512]=0;   
  mmc_buffer[offset%512+1]=0;   
  mmc_write_block(&sde,fat1_addr+ offset/512,mmc_buffer); //写FAT1   
  mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //写FAT2,内容与FAT1同   
  return 1;   
  }   
  if(offset1/512 !=offset/512){   
  mmc_write_block(&sdc,fat1_addr+ offset/512,mmc_buffer); //写FAT1   
  mmc_write_block(&sdc,fat2_addr+ offset/512,mmc_buffer); //写FAT2,内容与FAT1同   
  mmc_read_block(&sdc,fat1_addr+ offset1/512,mmc_buffer); //读取下一簇号所在的块   
  }   
  offset= offset1; k--;   
  }while(k>=0);   
  return 0; //未找到文件结束标志,返回0  

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

关键字:单片机  MMC卡 引用地址:单片机与MMC卡的接口

上一篇:微处理器和JTAG总线桥接接口
下一篇:基于USB的ARINC429航空总线接口模块设计

推荐阅读最新更新时间:2024-05-02 21:50

基于单片机的模糊控制系统简介
1 引言 模糊控制(Fuzzy Control)是目前自动控制研究中活跃而富有成果的领域之一,模糊理论是当前能用来对信息进行软处理的最新技术,可以将人的定性思维和判断方法定量化 为适合计算机处理的过程,使计算机能判断像“大概”、“轻”这样的模糊信息。采用传统控制理论,不管是用经典控制理论还是用现代控制理论来设计一个控制系 统,都需要事先知道被控对象的精确数学模型。然而,在许多情况下被控对象(或生产过程)的精确数学模型很难建立;像建材工业生产中的水泥窑、玻璃窑,化学 生产中的化学反应过程,食品生产中的发酵过程,还有众多炉类的热处理过程。诸如此类过程具有变量多,各种参数存在不同程度的时变性;且过程具有非线性,强 耦合,较大的随机干
[单片机]
基于<font color='red'>单片机</font>的模糊控制系统简介
单片机2——动态数码管的一些实例
1.8只数码管滚动显示单个数字 #include reg52.h #include intrins.h unsigned char code duanma ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9 unsigned char code weima ={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮,即位码 unsigned char tempdata ; void delay(int ms) { unsigned char j; for(;ms 0;ms--)
[单片机]
51单片机数字钟温度计的编程案例
#include reg51.h char disp ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; char disp_dot ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0}; sbit DQ = P1^3; //定义通信端口 //晶振12MHz void delay_18B20(unsigned int i) { while(i--); } //初始化函数 Init_DS18B20(void) { unsigned char x=0; DQ = 1;
[单片机]
51<font color='red'>单片机</font>数字钟温度计的编程案例
AVR单片机红外解码程序
在网络上基本上没有avr的红外遥控解码函数,有的也不是ICC的。为了大家的需要,我特地把自己项目需要的红外解码函数发上博客,希望对需要的人有所帮助。本解码方法是伟纳电子51单片机的解码方法,算是移植吧,应用的是扫描方式,需要的可以加上外中断,用中断方式反应会更快,更实时。本解码程序的关键在于延时函数,如果要移植到别的单片机或别的晶振时,一定要把延时调好。 头文件: /****************************************** * 程序名称: 遥控接收程序 * 程序功能: 遥控操作 * 目标硬件: AVR MCU ATMEGA128 16.0000MHz * 文件名称:telecontrol.c *
[单片机]
单片机典型论文竞赛题精华集锦(一)
单片机是一门实践性非常强的学科,如果只看教程,光说不练是很难真正领会单片机技术的,更不用说进行单片机的相关产品开发了。电子发烧友网基于此整合《单片机典型论文竞赛题精华集锦》,以飨电子发烧友网读者。也希望读者能根据提供的相关单片机典型论文竞赛题要求结合单片机开发板,写源程序,不断调试实验,积累更多开发经验和思路,真正踏进单片机开发大门。    单片机论文一 简易数控直流电源   第一届(1994年)全国大学生电子设计竞赛题目   一、设计任务   设计出有一定输出电压范围和功能的数控电源。其原理示意图如下:      二、设计要求   1.基本要求   (1)输出电压:范围0~+9.9V,步进0.1V,纹波不大于
[模拟电子]
<font color='red'>单片机</font>典型论文竞赛题精华集锦(一)
51单片机12分频 ----- 学习笔记
51单片机12分频的原因 由于初期设计硬件技术缺陷,使执行指令时需要子时钟,就把12个振荡周度期规定为1个机器周期。 51单片机是12M晶振,如果是单指令周期的语句,刚好是1us,其他语句好似1us的整数倍,便于计算指令时间。 AT公司的AT89系列51单片机,工艺上存在不足,分频后频率降低,程序得以稳定执行,不易跑飞。 AT新出的单片机和一些公司出的新单片机不一定要用问12M的晶振,11.05925M也行,18M也行,即35M以内的无源晶振(两脚的)都可以的。 图片素材来源于网络 晶振频率为12MHz定时器/计数器计算 一个计算脉冲所用的时间=一个机器周期 一个机器周期=1
[单片机]
51<font color='red'>单片机</font>12分频 ----- 学习笔记
51单片机上实现控制跑马灯
在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的。在并行端口的编程学习中,“跑马灯”是单片机并行端口输出控制的典型实例。所谓跑马灯,是指将八个发光二极管分别连接到单片机的某一并行端口的八根线上,通过编程控制这八个发光二极管从低到高或从高到低依次点亮。 如图1所示,将8个发光二极管阴极接到MCS一51单片机P1端口的8根端口线上,阳极通过限流电阻接+5V电源。要让发光二极管点亮,则对应的端口线应该为低电平(‘’0’);而要让其熄灭,对应的端I=I线应该为高电平(“1”)。由此,我们假定“跑马灯”由端I=1的低位向高位轮流点亮.可以得到如下状态: 图1 跑马灯电路图
[单片机]
51<font color='red'>单片机</font>上实现控制跑马灯
实现不间断能源的智能备用电池第二部分:BBU微控制器的功能和操作
摘要 开放计算项目(OCP)是一个非营利组织,专注于推动各企业在数据中心产品设计及最佳实践方面加强交流。 近日,该组织发布了开放机架第三版(ORV3)规范。规范中比较显著的变化在于设计架构从12 V迁移到了48 V 。本系列文章重点介绍ADI公司的备用电池单元(BBU)参考设计,分为五部分,这是第二部分。“实现不间断能源的智能备用电池第一部分:电气和机械设计”讨论了BBU的电气和机械设计考虑因素。第二部分将深入介绍微控制器的软件,该软件主要负责确保进程平稳运行,从而为BBU的高效率和容量提供保障。硬件和软件必须顺畅协作,才能实现满足规范要求的系统级解决方案。 简介 在BBU模块中实施优良的管理至关重要,这能带来诸多显
[电源管理]
实现不间断能源的智能备用电池第二部分:BBU<font color='red'>微控制器</font>的功能和操作
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved