单片机驱动SD卡

合集下载

单片机系统中的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卡接口,物联网设备可以实现本地存储和离线数据处理。

单片机读写SD卡电路设计

单片机读写SD卡电路设计

单片机读写SD卡电路设计【摘要】本文设计了单片机读写SD卡电路,从硬件设计到软件实现的过程。

本文以STC32为例,描述了设计工作原理,并给出连接图和程序。

【关键字】SD卡单片机1引言安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写PDA)和多媒体播放器等。

2SD卡SD卡就是SecureDigitalCard--安全数码卡,是由日本松下公司,东芝公司和美国SANDISK公司1999年8月共同开发研制的,具有大容量,高性能,尤其是安全等多种特点的多功能存储卡。

3系统设计方案系统硬件组成本设计硬件电路采用的整体结构如图1所示。

RS232—HOST(单片机)—SD 卡。

其中单片机采用流行的stc32,降低生产成本,串行接口RS232为标准3线制。

由稳定电压器供给5V电压,单片机通过SPI总线:时钟、输入、输出、片选4个I/O接口控制SD卡的读写操作。

由于SD卡的供电电压为3.3V,所以我采用了LM317对SD卡提供3.3V的电压。

SD的输入输出电压电平是3.3V的,而单片机的4个I/O接是5V的TTL电平,所以采用了74LVX4245电平转换驱动芯片,对SD卡的数据传输进行驱动。

当上电后,直接给单片机提供5V工作电压,通过LM317电压转换给SD卡提供3.3V工作电压。

单片机通过复位键对SD卡进行读写控制,单片机对SD卡不断发出数据,同时SD卡的DataOutI/O接口把数据发送给单片机。

实现单片机对SD卡的一次读写操作。

4系统程序设计4.1SD卡模态选择SD卡在工作时有两种总线模式:SD总线模式和SPI总线模式。

两种模式下从管脚定义到数据传输协议都是不同的,比较如下:SD总线模式的优点是可以采用4条数据线并行传输数据,数据传输速率高。

缺点是传输协议较为复杂,只有少数高档的单片机才提供此接口,若用软件的方法来模拟SD总线,则是很繁琐的,而且这样将大大降低SD卡的数据传输速率。

89C51单片机读取SD卡驱动程序

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);}/**********************************************************/。

基于SD卡的单片机数据存储系统

基于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卡中。

单片机驱动SD卡

单片机驱动SD卡

大连科技学院毕业设计 (论文) 题目基于单片机的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)和多媒体播放器等。

4根线单片机读写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卡读写系列(三)
对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卡程序

单片机读取SD卡程序
uint count; printf("SD_read_block"); SD_CS=0; SdCommand(0x11,address,0xff); if(SdResponse()==00) { while(SdRead()!=0xfe);
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){
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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卡的可能。

出于对安全工作的考虑,有必要解决电平匹配问题。

要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。

一般来说,通用的电平转换方案是采用类似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的晶体振荡器时,读写速度和功耗都基本令人满意,可以应用于对读写速度要求不高的情况下。

相关文档
最新文档