SD卡读写
前言
长期以~以来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卡
在长能长长及无功长长据采集系长中的用数途。