单片机驱动SD卡
单片机系统中的SD卡接口技术及其应用场景解析

单片机系统中的SD卡接口技术及其应用场景解析引言随着电子设备的普及和技术的进步,存储媒体的需求日益增长。
SD(Secure Digital)卡作为一种常见的存储媒介,被广泛应用于各类电子设备中。
本文将对单片机系统中的SD卡接口技术进行解析,并探讨其应用场景。
一、SD卡简介SD卡是一种非易失性的随机存储器,具有高容量、高速度和可移动性的特点。
它的外形小巧,使用方便,能够提供可靠稳定的数据存储。
SD卡广泛应用于数码相机、移动电话、音乐播放器、车载导航等各种消费电子产品中。
二、SD卡接口技术SD卡接口技术是指将SD卡与单片机系统进行连接的方法和协议。
目前,常用的SD卡接口技术主要有SPI(Serial Peripheral Interface)接口和SDIO(Secure Digital Input/Output)接口。
1. SPI接口SPI接口是一种串行通信接口,通过四根线(SCLK、MISO、MOSI、CS)来连接单片机和SD卡。
SPI接口的优点是接线简单、易于实现,但数据传输速度相对较慢。
在低速应用场景下,如存储小容量数据或频繁读写文件的情况下,SPI接口是一种经济实用的选择。
2. SDIO接口SDIO接口是一种高速并行接口,通过多线传输数据,支持高速数据传输和访问。
SDIO接口可以提供更大的带宽和更高的速度,适用于需要大容量存储和高速数据交换的应用场景。
但是,相对于SPI接口,SDIO接口的设计和实现会更加复杂。
三、SD卡的应用场景1. 嵌入式系统SD卡广泛应用于各类嵌入式系统中,如工控设备、仪器仪表、智能家居等。
通过SD卡接口,嵌入式系统可以实现大容量数据存储、数据传输和固件升级等功能。
例如,在智能家居系统中,SD卡可以存储家庭视频监控设备的录像数据,方便用户随时回放和查看。
2. 物联网设备SD卡也被广泛应用于物联网设备中。
物联网设备通常需要高效地收集、处理和存储海量数据。
通过SD卡接口,物联网设备可以实现本地存储和离线数据处理。
用51单片机读写SD卡

电源地 电源 时钟 电源地 数据线 0 数据线 1 数据线 2
电源地 电源 时钟 (SCK) 电源地 主入从出 (MISO) 保留 保留
SD 模 式 多 用 于 对 SD 卡 读 写 速 度 要 求 较 高 的 场 合 , SPI 模 式 则 是 以 牺 牲 读 写 速 度 换 取 更 好 的 硬 件 接 口 兼 容 性 。 由 于 SPI 协议是目前广泛流行的通信协议, 大多数高性能单片机都配 备 了 SPI 硬 件 接 口 , 硬 件 连 接 相 对 简 单 , 因 此 , 在 对 SD 卡 读 写 速 度 要 求 不 高 的 情 况 下 , 采 用 SPI 模 式 无 疑 是 一 个 不 错 的 选择。
89C51单片机读取SD卡驱动程序

89C51单片机读取SD卡驱动程序本程序是应用于51单片机的 89c52#include "MMC.h"bit Init_Flag; //Set it to 1 when Init is processing.bit card_type;//uchar csd_data[16];//uchar cid_data[16];unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};//CMD0/**********************************************************延时子函数**********************************************************/void delay(unsigned int time){while(time--);}/**********************************************************us延时子程序 (4.34us)**********************************************************/void delayNOP(){_nop_();_nop_();_nop_();_nop_();}/************************************************************ 卡端口初始化************************************************************/ void MMC_Port_Init(){SPI_CLK=1;SPI_DO =1;SPI_CS=1;}//************************************************************* ***************//Routine for sending a byte to MMC/SD-Card//write a byte//************************************************************* ***************void Write_Byte_MMC(uchar value){unsigned char i;for (i=0;i<8;i++){if (value&0x80)SPI_DI=1; //Send bit by bit(MSB First)elseSPI_DI=0;SPI_CLK=0; //Clock lowif(Init_Flag)delayNOP();SPI_CLK=1; //Clock Highif(Init_Flag)delayNOP();value <<=1;}}//************************************************************* ***************//Routine for reading a byte from MMC/SD-Card//Software SPI//************************************************************* ***************unsigned char Read_Byte_MMC(){unsigned char temp=0;unsigned char i;SPI_DO=1;for (i=0;i<8;i++) //MSB First{SPI_CLK=0; //Clock Lowif(Init_Flag)delayNOP();SPI_CLK=1; //Clock Highif(Init_Flag)delayNOP();temp=(temp<<1)|SPI_DO; //read mmc data out pin}return (temp);}//************************************************************* ***************//Send a Command to MMC/SD-Card//Return: the second byte of response register of MMC/SD-Card//************************************************************* ***************unsigned char Write_Command_MMC(unsigned char *CMD) {unsigned char tmp;unsigned char i;//set MMC_Chip_Select to high (MMC/SD-Card disable)SPI_CS=1;//send 8 Clock ImpulseWrite_Byte_MMC(0xFF);//set MMC_Chip_Select to low (MMC/SD-Card active) SPI_CS=0;//send 6 Byte Command to MMC/SD-Cardfor (i=0;i<0x06;i++){Write_Byte_MMC(*CMD++);}i = 0;//get 16 bit responseRead_Byte_MMC(); //read the first byte,ignore it.do{ //Only last 8 bit is used here.Read it out.tmp = Read_Byte_MMC();i++;}while((tmp==0xff)&&(i<100));return(tmp);}//********************************************************** //Routine for Init MMC/SD card(SPI-MODE)unsigned char MMC_Init()//********************************************************** {unsigned char temp;unsigned char i;MMC_Port_Init(); //Init SPI portdelay(200);Init_Flag=1; //Set the init flagfor (i=0;i<0x0f;i++){Write_Byte_MMC(0xff); //send 74 clock at least}//Send Command CMD0 to MMC/SD Cardi = 0;do{ //retry 200 times to send CMD0 commandtemp=Write_Command_MMC(CMD);i++;if(i >= 200){ //time outreturn(INIT_CMD0_ERROR); //CMD0 Error!}}while(temp!=1);i = 0;do{CMD[0] = 0x77; //CMD55命令temp = Write_Command_MMC(CMD); //先发送 CMD55if(temp == 0x01) //如果有反应{CMD[0] = 0x69; //ACMD41命令temp = Write_Command_MMC(CMD); //发送CMD41进行激活if(temp == 0x00) //激活成功就是SD卡{card_type =1; //SD}}else //如果发送CMD55无反应,改发送CMD1{CMD[0] = 0x41; //CMD1命令CMD[5] = 0xFF;temp = Write_Command_MMC(CMD); //发送CMD1进行激活if(temp == 0x00) //激活成功就是MMC卡{card_type =0; //MMC}}i++;if(i >= 200){return(INIT_CMD1_ERROR); //CMD1 Error!}}while(temp != 0x00); // MMC和SD卡激活后的返回值均为0x00Init_Flag=0; //Init is completed,clear the flagSPI_CS=1; //set MMC_Chip_Select to high// wr_string(0,2," INIT SUCCESS ");return(0); //All commands have been taken.}//************************************************************ //Routine for reading data Registers of MMC/SD-Card//Return 0 if no Error.//************************************************************ unsigned char MMC_Read_Block(uchar *CMD,uchar *Buffer,uint Bytes){unsigned int i;unsigned char temp;//Send Command CMD to MMC/SD-Cardi = 0;do{ //Retry 100 times to send command.temp=Write_Command_MMC(CMD);i++;if(i == 100){return(READ_BLOCK_ERROR); //block write Error!}}while(temp!=0);//Read Start Byte form MMC/SD-Card (FEh/Start Byte)while (Read_Byte_MMC()!=0xfe) ;//Write blocks(normal 512Bytes) to MMC/SD-Cardfor (i=0;i<bytes;i++){*Buffer++ = Read_Byte_MMC();}Read_Byte_MMC();//CRC - ByteRead_Byte_MMC();//CRC - ByteSPI_CS=1;return(0);}//************************************************************ //Routine for</bytes;i++)reading CSD Registers from MMC/SD-Card (16Bytes)//Return 0 if no Error.//Command for reading CSD Registers//************************************************************ unsigned char Read_CSD_MMC(unsigned char *Buffer) {unsigned char temp;CMD[0]=0X49; //CMD9:读CSD寄存器.CMD[5]=0XFF;temp=MMC_Read_Block(CMD,Buffer,16); //read 16 bytes return(temp);}//************************************************************ //Routine for reading CID Registers from MMC/SD-Card (16Bytes)//Return 0 if no Error.//Command for reading CID Registers//************************************************************ unsigned char Read_CID_MMC(unsigned char *Buffer){unsigned char temp;CMD[0]=0X4A; //CMD10:读CID寄存器.CMD[5]=0XFF;temp=MMC_Read_Block(CMD,Buffer,16); //read 16 bytesreturn(temp);}/**********************************************************/。
51单片机spi驱动sd卡程序

AT89C52单片机驱动SD卡系统设计本文详细阐述了用AT89C52单片机对SD卡进行操作的过程,提出了一种不带SD卡控制器,MCU读写SD卡的方法,实现了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卡的单片机数据存储系统

基于SD卡的单片机数据存储系统第一章:引言1.1 背景随着科技的不断发展,单片机在各个领域得到了广泛的应用。
而数据存储是单片机应用中的一个重要环节,用于将数据保存在可移动介质中,方便数据的传输与处理。
1.2 目的本文旨在介绍一种基于SD卡的单片机数据存储系统,通过该系统,可以实现单片机与SD卡之间的数据传输,方便数据的读取与存储,提高系统的可靠性与稳定性。
第二章:SD卡介绍2.1 SD卡简介SD卡(Secure Digital Card)是一种用于存储数据的存储卡。
它具有体积小、容量大、读写速度快、可擦写次数多、可靠性高等特点,被广泛应用于各个领域。
2.2 SD卡的工作原理SD卡采用了FAT32文件系统,通过SPI总线与单片机进行通信。
SD卡内部有一个控制器,负责管理数据的读写等操作。
第三章:单片机与SD卡的通信3.1 单片机SD卡驱动芯片为了实现单片机与SD卡之间的通信,需要使用一个专门的SD卡驱动芯片。
该芯片可以将单片机的IO口与SD卡的SPI总线进行连接。
3.2 SPI总线通信SPI(Serial Peripheral Interface)是一种串行通信接口,可以实现多个设备与单片机之间的通信。
在SD卡中,使用SPI总线与单片机进行通信,通过发送指令来控制SD卡的读写操作。
第四章:SD卡的初始化4.1 SD卡的硬件连接在将SD卡与单片机连接之前,需要将它们的引脚进行正确的连接。
根据SD卡的接口类型,选择相应的引脚进行连接。
4.2 SD卡的初始化流程SD卡的初始化流程包括发送初始化命令、等待SD卡的回应、设置SPI总线时钟等操作。
通过这些步骤,可以使SD卡进入正常工作状态。
第五章:单片机数据的读写5.1 数据的读取在使用SD卡存储系统时,首先需要将数据从SD卡中读取出来。
通过发送读取指令,设置读取的起始地址和读取的长度,然后将读取到的数据保存在单片机的内存中。
5.2 数据的写入当需要将数据写入SD卡时,首先将待写入的数据保存在单片机的内存中,然后通过发送写入指令,设置写入的起始地址和写入的数据长度,将数据写入SD卡中。
4根线单片机读写SD卡

还记得刚才说的那 6 字节命令格式吗?【1 字节】(0x40+命令序号)+【4 字】节参 数+【1 字节】CRC 校验码。套用这命令的格式,我们得到如下 SD 卡比较常用的命令串。 读 SD 卡 0 扇区的命令串:{0x51,0x00,0x00,0x00,0x00,0xff};
写 SD 卡 1 扇区的命令串:{0x58,0x00,0x00,0x02,0x00,0xff};
七、 驱动程式
文末了,在本文的文件夹中,有我已经写好的 SD 卡读写驱动。供大家学习使用,程序 写的比较简单。
SD_MMC.C 的文件里有 3 个函数:1、初始化 SD 卡,2、读 SD 卡指定扇区,3、写 SD 卡指定扇区。
初始化 SD 卡函数 SD_INIT():它使 SD 卡进入 SPI 模式并复位。读 SD 卡指定扇区函数 sd_read(),函数的入口是 4 字节 SD 卡地址,用了 unsigned long 数据类型,如果函数返回 1 表示操作成 功,返回 0 则表示操作失败。写 SD 卡指定扇区函数 sd_write(),方式和读 SD 卡指定扇区一样。
SD 卡复位的命令串:{0x40,0x00,0x00,0x00,0x00,0x95};
SD 卡进入 SPI 模式的命令串:{0x41,0x00,0x00,0x00,0x00,0xff};
五、 数据传送
当 SD 卡接收到“读” 命令后,SD 卡会在 MISO 线上回应命令(0x00),其后 SD 卡再向单片机,发送 1 字节的起始字节(0xfe),紧接着发送连续的 512 字节数据。在发送 完这些数据后,还有 2 个字节的 CRC 校验码,也是紧接着发送的。同样,单片机通过 MOSI 线向 SD 卡发送“写 SD 卡” 命令后,单片机需要先读取 SD 卡向 MISO 线上传送的回应数 据(0x00)。当接收到回应后,单片机就可以先发送 1 个字节的起始字节(0xfe)。随后,单 片机再发送 512 字节的 RAM 数据。最后再加上 2 个字节的 CRC 校验码。不过,SD 卡默认 是不对数据进行校验的。也就是说,2 字节校验码可以是任意数据,但一定要发送的。发完 这 515 字节个数据后,SD 卡会又有一个 5 位的回应数据(二进制:XXX00101B)。表示数 据已经写入完毕。
单片机对SD卡读写系列(三)
单片机对SD卡读写系列(三)
对SD 卡的驱动主要有初始化、读、写、擦除等。
1、初始化步骤:
(1)延时至少74clock
(2)发送CMD0,需要返回0x01,进入Idle 状态
(3)循环发送CMD55+ACMD41,直到返回0x00,进入Ready 状态。
如果是MMC,此步应发送CMD1。
2、读步骤:
(1)发送CMD17(单块)或CMD18(多块)读命令,返回0x00
(2)接收数据开始令牌0xfe(或0xfc)+正式数据512Bytes + CRC 校验2Bytes
默认正式传输的数据长度是512Bytes,可用CMD16 设置。
3、写步骤:
(1)发送CMD24(单块)或CMD25(多块)写命令,返回0x00
(2)发送数据开始令牌0xfe(或0xfc)+正式数据512Bytes + CRC 校验2Bytes
4、擦除步骤:
(1)发送CMD32,跟一个参数来指定首个要擦出的扇区号(SD 手册上说
是块号)
(2)发送CMD33,,指定最后的扇区号
(3)发送CMD38,擦除指定区间的扇区
此3 步顺序不能颠倒。
还要注意发送CMD 命令时,后面要跟一个字节的CRC 校验数据,总之要保证每次发送的数据包长度符合协议要求,命令、数据符合时序要求。
单片机读取SD卡程序
for(count=0;count<len;count++) *Block++=SdRead(); for(;count<512;count++) SdRead(); SdRead(); SdRead(); SD_CS=1; SdRead(); printf(" Read Data as Follows\n");
buf1[i]=0;
}
SdReadBlock (buf1,0x00,512); //读地址为0x00的存储块, 大小为512字节
for(i=0;i<0x20;i++) {
//读取的数据通过串行口输出
for(j=0; j<0x10; j++){
printf("%4bX",buf1[(i<<4)+j]);
return 1; } printf("Command 0x11 (Read) was not received by the SD.\n"); return 0; }
/******************************* 主函数 *******************************/
uchar xdata buf1[512]; uchar xdata buf2[30];
/********************** *****************************/ void SdWrite(uchar n){
单片机驱动ch376读写SD卡
xWriteCH376Cmd(CMD0H_DISK_MOUNT);//检测 sd 卡 while(CH376_INT==1); xWriteCH376Cmd(CMD_GET_STATUS); delayms(10); status=xReadCH376Status(); if(status==0x84) printf("SD OK\n"); else printf("SD FALSE\n"); } void main () {
CH376_CS = 0; CH376_RD = 0; CH376_CS = 0; 40nS*/
// /* 输出有效读控制信号, 读 CH376 芯片的数据端口 */ //?/* 该操作无意义,仅作延时, CH376 要求读写脉冲宽度大于
mData = CH376_DATA_DAT_IN( );//?* 从 CH376 的并口输入数据 */ CH376_RD = 1; ///* 输出无效的控制信号, 完成操作 CH376 芯片 */ CH376_CS = 1; //? return( mData );// //? }
xWriteCH376Data('C'); xWriteCH376Data(0x0D);//0x0D, 0x0A 是换行符 xWriteCH376Data(0x0A); xWriteCH376Data('A'); xWriteCH376Data('B'); xWriteCH376Data('C'); xWriteCH376Cmd(CMD_BYTE_WR_GO);// while(CH376_INT); if(USB_INT_DISK_WRITE!=xReadCH376Status()) printf("writed\n"); } xWriteCH376Cmd(CMD_FILE_CLOSE); xWriteCH376Data(1); while(1); }
单片机读写SD卡教程
郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开win hex软件,用读卡器读SD卡,在win hex中查看SD卡FPrlrj 旧nmg *御日・曲日尺 立件(日轄:号iifllPI 讥吵:当Tfllll 春罰;〔I SW (£)旨口凹帶此|;也S X电a► O C3 * -0 畫・■€■*电bld! IbiljUA ] 初1 悶「1|馆口曲佃 AgraaSBJLXsta InAEiqptetEJ' 03839535 16BH(*J-): 0曲* ?;第詞 EKt £i2f UrEiib&d MT 1 SOB 66.5 K0 1.2 MB Famof 跆hl 色 TipHium 1 Offset 0 1 2 3 4 5 6 7 3 9 A B c n E F /1 ModSfA'v wC Cans Ae^defDOOOOOD Ec 00 00 OD 00 00 DO aa 00 00 00 00 DO ao DO oo fc 1j uFirmwlrf Atv.. 1.D0 OCIIDOOOI 00 00 00 00 oo 00 00 OiO 00 no 00 00 GO no no 00..DUS : USB D000002D 00 00 00 00 00 00 DO 00 :ir 00 00 00 DO 00 DO ao I! ■DerauitEdnDD00003D 00 00 00 00 00 ao DO aa 00 00 00 00 DO a)a DO aa ■i ■ j 4Sl5te: original oomoQQin 00 00 00 00 00 on on OQ 00 no 00 00 00 Qi Q 00 00. .Undo lewef: 0 00000050 oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO QO r i ■, f Undo rsverses: Ma D000006D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO o)a DO aa -・ --oonoau70 on 00 00 OQ 00 00 DO oa oa OQ 00 QO 00 ao DO 00. ■1.^7,1126.576 诩跆 DOOaOOBD oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO 00 r ・ ■■ 1D000009D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oaii i J 4 Siapkis seclorfi 创 entE51 3 DOOQOaM) 00 00 00 OQ 00 00 no a>a 00 00 00 00 do00 DO-”4 4OOOOOOB oa 00 00 00 00 00 DO OU 00 00 00 00 DO 00 DO 00 r i■1 f Psritllfln: -:1 DOOOOOC D 00 00 00 aa 00 ao DO aa 00 00 00 ao DO a)o DO oa h ij 4R C ISW B S-BCbO r Ho Na OOOOOOD 00 QO m 00 00 00 00 no 00 00 GO 00 DO 00 00 ao MDC J B : hiBoodewnalOOOOOOE D 00 00 00 00 00 00 DO ao 00 00 00 00 00 00 DO 00, ,Cuaiader 虻I ANSI ASCIIoooaaoFD 00 OD 0000 DO ao DO aa 00 00 00 00 DO a)a DO aoOR 曲: hexadecwnaloomoaioo 00 00 00OQ oo 00 no aa 00 OQ 00 00 lOO Qi O 00 DOoooaoiiD 00 00 00 00 00 00 DO □ Q 00 00 00 00 m00DO 00 r ilnllnuiiw *. 1No ofwIridcrBVK' ID000012D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oa ii iJ 4D000013Q oo 00 oo00 oo 00 oo ao oo no do Qfl oo oo 00 so加 Aab 用 00000140 DU 00 00 00 00 00 DO QO 00 00 00 00 DO ao DO 00 ,, ,.TEMPltilifer 1.2GBffee D000015D 00 OD 00 OQ 00 ao DO aa 00 00 00 ao DO a)a DO aa B1J 4 ^D MINI -IIL OC AL S'1 打 amp QOOOQ1B O 00 QO 00 QO oo 00 DO aa 00 00 00 00 lOO Qi O 00 DO..tJ 00000170 00 00 0000 00 00 DO 00 00 00 00 00 uo 00DO 00 r i■1 1J4D00001BD 00 00 00OQ 00 aoDO aa0000 00ao DO a)o DO oa “.J-SedamoT 胡4■加轴 0tT9«l:a=D Blatk-^ParHion 1Siad BecWrsUnp3it(jon^b*5 阿苗点击查找(ctrl+F ) Find Text 3 3 J J J J J J J J 3 ] ] ] ] ]The folouing text string wil be searched: FAT| caseASCII/Code page vUse this as a wildcardI I Whole wo(d^ odjjSearch:□ Cond.: offset mod =I_ Search in plgk only]Search in dll open windows |—| List search hits, 14)to 1Cancel输入FAT (找到 DBR 处)发现DBR 起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含 512BYTE ,所以 在程序中读一个扇区时一定要是 512整数倍,否则会出错。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大连科技学院毕业设计 (论文) 题目基于单片机的sd卡数据操作设计学生姓名专业班级机械电子工程 09 指导教师许鸣宇职称讲师所在单位机械工程系教研室主任许鸣宇完成日期 2012年 6 月 21 日摘要许多工业现场需要数据采集器完成各类数据采集工作。
实际应用中要求数据采集器工作可靠,成本低廉,操作简单便于数据收集和分析;既要方便与PC机联机,又能独立完成数据采集、存储工作。
SD卡在现在的日常生活与工作中使用也非常广泛,时下已经成为最为通用的数据存储卡。
在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。
SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。
既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。
这就要求对SD卡的硬件与读写时序进行研究。
长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。
特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。
当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。
论文介绍了SD卡存储采集数据电路设计原理、电路以及程序,详细阐述了用AT89C51单片机对SD卡进行操作的过程。
关键词:单片机 sd卡串口通信ABSTRACTMany industry site need data collector of all kinds of data acquisition work completed. Practical application request data collector reliable, low cost, easy to operate, easy to data collection and analysis; Both convenient and PC online, and independently complete the data acquisition, storage work.SD card is widely used in daily life and work. Now, it has become the most common data storage card. Such as MP3, digital cameras and other equipment are also using the SD card as the storage device. SD card is so widely used, because it has the advantages of low price, the advantages of large storage capacity, convenient use, versatility and strong safety. Since it has so many advantages, so if it is added to the MCU application development system, will make the system better. This requires hardware and read SD card to write time study.Long-term since, to Flash Memory memory SD card has small size, low power consumption, erasable and non-volatile characteristics have been widely used in consumer electronic products. Especially in recent years, with falling prices and increasing storage capacity, its application range is extended. When the data acquisition system needs a long time to collect, record data, select the SD card as storage medium is the developers a good choice.This paper introduces the SD card store data acquisition circuit design principle, circuit and program.This paper describes in detail the process of operation of SD card with AT89C51 single chip microcomputer.Key Words:Single chip microcomputer SD card Serial port Signalcommunication目录1 前言 (1)2 系统方案设计 (2)3 系统硬件部分设计 (3)3.1 SD卡简介 (3)3.1.1 SD卡的使用 (3)3.1.2 SD卡发展历程 (4)3.2单片机的介绍 (4)3.2.1 单片机历史 (6)3.2.2 单片机的特点 (7)3.2.3 单片机的基本组成 (7)3.3 电源模块 (8)3.4 单片机最小系统 (8)3.5 sd卡内部结构和工作原理 (10)3.5.1 SD卡内部结构 (10)3.5.2 sd卡引脚及功能 (11)3.6 单片机与sd卡链接 (12)3.6.1通讯模式 (12)3.6.2电平匹配 (12)3.7硬件接口设计 (13)4 软件设计 (14)4.1 软件设计目标 (14)4.2 设计环境 (14)4.3 系统软件设计 (14)4.3.1 SD卡初始化 (14)4.3.2 数据块的读写 (15)4.3.3 定时器T0函数流程图 (18)结论 (19)谢辞 (20)参考文献 (21)附录 (22)1 前言SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。
SD卡为9引脚,目的是通过把传输方式由串行变成并行,以提高传输速度。
它最大的特点就是通过加密功能,可以保证数据资料的安全保密,它还具备版权保护技术,所采用的版权保护技术是DVD中使用的CPRM技术(可刻录介质内容保护)。
大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。
近年来, 单片机系统发展迅猛, 这不仅体现在 CPU处理能力迅速提升、外界设备与处理器交互能力快速提高, 更体现在单片机系统的复杂性日益提高、系统存储容量急剧增大。
这些变化对于数据操作的灵活性提出了越来越高的要求。
因此, 如何系统地、灵活地管理数据文件就成了单片机系统开发者无法回避的问题。
文件系统的使用使开发者获得“路径”的概念, 从而回避了存储介质的地址空间, 不用每次都从头对物理介质进行操作。
文件系统提供清晰明了的 API 函数, 使上层应用层不再关心底层存储介质, 而方便地利用标准接口访问底层存储器。
标准化的接口和层次分明的程序增加了程序的可移植性。
因此在单片机系统中植入文件系统是单片机系统发展的必然结果。
由于该系统是通过 SD卡模组向 SD卡写入一系列文件, 这些文件需要被Windows 系列操作系统正确识别, 并进行读写操作, 因此, 我们选择了应用最为广泛的 FAT16 文件系统。
FAT16 是 Microsoft 开发的文件系统, 是一种技术成熟、结构简单、系统资源开销小、易于在单片机系统上的硬件平台上实现的文件系统。
它是 Microsoft 公司在其 MS2DOS操作系统中采用的文件系统,具有出色的文件管理性能,能被当前大多数操作系统识别。
因此,SD卡与 FAT16 文件系统相结合是嵌入式数据存储、记录系统的理想方案,可以将采集记录的数据直接在 PC上读取和处理。
2 系统方案设计本系统采用 MCS 251 架构的 AT89S51单片机。
AT89S51是一种低成本、低功耗、高性能的 CMOS 8 位微控制器,具有 8 KB 在系统可编程 Flash 存储器。
应用AT89S52 读写 SD 卡,首先要确定它们之间的通信方案。
SD卡有 2 种可选的通信协议: SD 模式和 SPI 模式。
SD模式是 SD 卡的标准读写方式,选用此模式需要选择带SD卡控制接口的 MCU 或者额外的 SD 卡控制单元; SPI模式通过SPI 总线完成 SD 卡与主控制器的通信。
AT89S51没有集成 SD 卡控制器,为了不增加额外的 SD卡控制单元硬件成本,本设计方案采用 SD 卡的 SPI 通信模式。
虽然 AT89S51也没有集成 SPI 接口模块,但可以用软件的方式模拟 SPI接口时序。
另外一个要解决的问题是SD卡与AT89S51的电平匹配。
SD卡的逻辑电平相当于3. 3 V 的 TTL 电平标准,AT89S51的逻辑电平为5 V CMOS电平。
解决电平匹配问题的原则有2条:一为输出电平器件输出的高电平的最小值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。
考虑到SD卡在SPI工作模式下,数据的传输都是单向的,这样可以在单片机向 SD 卡传输数据时采用晶体管加下拉电阻的方法,基本电路如图2-1所示。
而在SD卡向单片机传输数据时可以采用直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。
这个方案需要双电源供电,1 个5 V电源,1 个3.3 V电源。
3 系统硬件部分设计3.1 SD卡简介SD卡在24mm×32mm×2.1mm的体积内结合了SanDisk快闪记忆卡控制与MLC (Multilevel Cell)技术和Toshiba(东芝)0.16u及0.13u的NAND技术,通过9针的接口界面与专门的驱动器相连接,不需要额外的电源来保持其上记忆的信息。
而且它是一体化固体介质,没有任何移动部分,所以不用担心机械运动的损坏。