51单片机的SD卡的读写设计
51单片机SD卡读写

return temp; //返回读取的数据
}
//复位函数//
uchar sd_reset()
{
uchar i,temp=0xff,time;
uchar table[]={0x40,0x00,0x00,0x00,0x00,0x95};
flag_time=1;
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//错误码定义//
#define cmd0_error 0x01
#define cmd1_error 0x02
}
write_sd(0xff);
write_sd(0xff); //两字节奇偶校验
temp=read_sd(); //读取返回值
if((temp&0x1f)!=0x05) //如果返回值是 xxx00101 说明数据已经被写入
if(time==100)
{
return read_error;
}
}
while(temp!=0);
write_sd(0xff); //补偿8个时钟
//由于sd卡操作一次性只能写一个扇区也就是512个字节
//所以这里通过将长整型地址左移九位来将地址乘上512
//用于地址操作
table[1]=((add&0xff000000)>>24);
table[2]=((add&0x00ff0000)>>16);
单片机读写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卡的数据传输速率。
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电平标准。
51读写SD汇编语言

DSEG AT 30H
CS BIT P2.0 ;SD卡接口
CLK BIT P2.1
SPI_IN BIT P2.2
SPI_OUT BIT P2.3
RS BIT P2.4 ;12864接口
RW BIT P2.5
E BIT P2.6
ResponceSD EQU 30H ;保存SD卡应答信号
;说明:上升沿写入数据,高位开始,从A中写入.CS/CLK/SPI_IN
SPI_WriteByte:
MOV R4,#08H
CLR CLK ;L
LCALL F_DelayShort
Loop_WriteByte:
RLC A
JC L_Next1
CLR SPI_IN
LJMP L_Next2
;<<SPI读1字节>>
;出口参数:A
;说明:下降沿读出数据,高位开始,保存到A中.CS/CLK/SPI_OUT
SPI_ReadByte:
MOV R4,#08H
SETB CLK ;H
LCALL F_DelayShort
L_ReadByte:
MOV C,SPI_OUT
LCALL F_DelayShort
/***********************************************************
名称: SD卡读写 *
描述: SD卡与单片机连接读写数据,另外MCU与12864液晶相连 *
硬件: SD卡与MCU的P2.0-P2.3相连,12864与P1口和P2.4-2.6相连 * *
51单片机读写SD_MMC卡设计报告

51单片机读写SD_MMC卡设计报告杨文斌(qq:292942278) 2007-08-20一、总则本文件介绍了在51平台通过SPI方式读写SD/MMC卡,包括软硬件需求, SD/MMC硬件连接, SPI接口软件模拟,SD/MMC上电初始化,写单块,读单块,写多块,读多块,块擦除,上位串口通讯协议,PC上位软件操作说明等。
二、软硬件需求a)单片机固件编译环境:Keil C51 uVision2b)PC上位软件编译环境:Visual C++ 6.0c)硬件环境:1)W78E52B一片;2)SD/MMC卡插座一个;3)MAX232一片;4)cross串口线一条;三、SD/MMC硬件连接SD/MMC与51单片机引脚连接如下表1,供参考:注意:SD/MMC引脚除VDD(PIN4)/VSS(PIN3/6)外,其它引脚连接上拉电阻(47k)至 3.3v 电源。
四、SPI接口软件模拟由于W78E52B没有集成硬件SPI接口,所以固件需要通过软件来模拟实现SPI接口;a)SPI接口基本原理:SPI采用HOST/SLAVE结构,HOST与SLAVE以字节为传输单位,支持4种模式; SPI接口定义有4个引脚CS,SI,SO,SCK;SD SPI接口工作于模式0,各引脚功能分别描述如下:1)CS为片选引脚,低电平为有效;2)SI为Host输出Slave输入引脚,空闲为高电平,SCK上升有效,;3)SO为Slave输出Host输入引脚,SCK下降有效;4)SCK为同步时钟;b)SPI HAL:包括4个函数,上层软件通过调用这4个函数,来实现与SD/MMC以SPI方式进行数据交换。
1)SPI_SendByte(INT8U onebyte)――以SPI方式向SD/MMC发送一个字节2)INT8U SPI_RecByte(void)――以SPI方式从SD/MMC接收一个字节3)SPI_CS_Assert(void)――将CS引脚置为低电平有效4)SPI_CS_Deassert(void)――将CS引脚置为高电平无效c)通过SPI HAL发送的RESET命令CMD0波形图,如下图1,以供参考:图1-RESET命令CMD0波形图五、SD/MMC上电初始化当SD/MMC卡上电后,单片机需要对其进行上电初始化,上电初始化步骤顺序所列如下:1)置CS为低,至少延时74个CLK,延时波形图,如图2,以供参考:图2-延时波形图2)发送RESET命令CMD0,其波形图参考图1:3)发送命令CMD1(SD卡使用命令ACMD41)激活SD/MMC卡, 固件需重复发送命令CMD1直到R1 idle state位为0。
51单片机读写SD卡(命令解释)

51单片机读写SD卡(命令解释)SD卡命令共分为12类,分别为class0到class11,不同的SDd卡,主控根据其功能,支持不同的命令集如下: Class0 :(卡的识别、初始化等基本命令集)CMD0:复位SD 卡.CMD1:读OCR寄存器.CMD9:读CSD寄存器.CMD10:读CID寄存器.CMD12:停止读多块时的数据传输CMD13:读Card_Status 寄存器Class2 (读卡命令集):CMD16:设置块的长度CMD17:读单块.CMD18:读多块,直至主机发送CMD12为止 .Class4(写卡命令集):CMD24:写单块.CMD25:写多块.CMD27:写CSD寄存器 .Class5 (擦除卡命令集):CMD32:设置擦除块的起始地址.CMD33:设置擦除块的终止地址.CMD38: 擦除所选择的块.Class6(写保护命令集):CMD28:设置写保护块的地址.CMD29:擦除写保护块的地址.CMD30: Ask the card for the status of the write protection bitsclass7:卡的锁定,解锁功能命令集class8:申请特定命令集。
class10 -11 :保留其中class1, class3,class9:SPI模式不支持51单片机读写SD卡(概述,硬件连接)SD卡全称为Secrue Digital Memory Card,具有轻巧、可加密、传输速度高、适用于手持设备使用等优点。
SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口:SD模式接口和SPI接口。
由于51单片机的速度的原因,一般采用SPI接口方式连接SD卡, 在连接时需要在SD卡边接10-100K上拉电阻,SD卡的电源是DC3.3V51单片机读写SD卡(寄存器)SD卡有以下几种内部寄存器1.CID 卡的识别号宽度128,详细描述如下2.RCA 卡的相对地址(SPI模式不可用)3.DSR 可选寄存器宽度164.CSD 描述操作该卡的规则(时序规则)。
51单片机读写SD卡程序
/thread/118916/1
回复
回复本帖
回到顶端 [4楼]
2009-6-4 ห้องสมุดไป่ตู้3:32:41
51单片机读写SD卡程序!!!
uchar SD_Init(void) { uchar retry,temp; uchar i; MMC_PORT&=~MMC_CS_PIN; //SD卡使能
RE: 51单片机读写SD卡程序!!!
l0p0c
If winter comes,Can spring be far behind?? 爱“拼”才会赢,1980元仿真器免费等你拿!
发表于 2007-11-13 09:38:52
现在不知道该怎么整? SD卡的资料是英文的,有好多地方整明白啊!
回复
回复本帖
51单片机读写SD卡程序!!! 发表于 2007-11-12 16:02:25
l0p0c
有没有做过51单片机读写SD卡项目的同行? 现在需要帮助一下咯! o(∩_∩)o...
我是GG 高级会员 加为好友 发短消息 最后登陆时间:2009-05-21 15:30:00 状态:离线
51读写SD卡
一、SD卡的检测:插入时6脚CSS2与中端口相连,同时6脚在卡内部又与3脚地相连,这样利用6脚的低电平触发中断来检测SD卡的插入;SD卡的引脚说明:CLK:空闲时保持高电平;SD卡上电后,默认是关闭的;二、初始化:SPI的时钟不能太快。
刚开始先发送至少74个时钟信号,这是必须的,随后写命令CMD0和CMD1,使SD卡进入SPI模式。
详见附件:《SD卡初始化》i.SD卡和MMC卡:上电后,卡出于IDLE状态,主机用CMD0 复位卡,用CMD55和ACMD 41判别当前电压是否在工作范围内。
因为MMC卡不能正确识别CMD55,所以,通过判别此命令的响应正确与否,来侦知是SD卡还是MMC卡。
ii.SD模式和SPI模式选择:SD卡在上电初期,通过检测引脚1(DAT3)来决定。
如果此脚外界上拉电阻(50k)为高电平,则进入SD模式;此脚接地为低电平,进入SPI模式。
三、命令时序i.高位先发一般情况下降沿发送数据上升沿读取数据ii.发送命令:1.命令字;1字节0x40+命令序号;2.命令参数:4字节地址数:基本单位512;3.响应:R1和R1B(1字节(CRC7+1))R2(2字节)或R3(5字节)4.大部分命令的响应是1个字节,读取状态寄存器响应R2,读取OCR响应R3;四、数据传送:读写以512字节为基本单位;i.读数据:1.MCU发送“读”命令;2.SD卡回应:0x00;3.SD发送起始字节:0xFE;4.SD发送连续的512字节数据;5.SD发送2字节的CRC(任意,但最后一位要是1);ii.写数据:1.MCU发送“写”命令;2.SD卡回应:0x00;3.MCU发送起始字节:0xFE;4.MCU发送连续的512字节数据;5.MCU发送2字节的CRC校验码;6.SD卡发送5位的回应数据:xxx0 0101B (0x05)。
五、擦除操作可以加速写操作,因为在写之前会进行擦除。
六、SD卡的六个寄存器:七、SD卡的命令序号:i.Calss0 :1.CMD0 复位SD卡2.CMD1 读OCR3.CMD9 读CSD4.CMD10 读CID5.CMD12 停止读多块数据传输6.CMD13 读Card_Status 寄存器ii.Calss 21.CMD16 设置块的长度不设的话默认长度512 设的话:4字节所表示的数;2.CMD17 读单块3.CMD18 读多块直到发送CMD12iii.Calss 41.CMD 24 写单块2.CMD 25 写多块iv.Calss 5 擦除卡1.CMD 32 设擦除块的起始地址2.CMD 33 设擦除块的终止地址3.CMD 38 擦除所选块//实验目的:学习SD卡的操作//软件设计// 1、SD卡采用SPI通信// 2、先往SD里顺序写入0-255共256个数据,然后再读回送LCD1602显示//硬件要求:// 拨码开关S11置ON// 跳线J18全部接通#include <p30f6014.h> //dsPIC30F6014标准头文件_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍频晶振,Failsafe 时钟关闭_FWDT(WDT_OFF); //关闭看门狗定时器_FBORPOR(PBOR_OFF & MCLR_EN); //掉电复位禁止,MCLR复位使能。
用51单片机读写SD卡
引脚号 1 2 3 4 5 6 7 8 9
图 1 SD 卡外形 表 1 SD 卡引脚功能
名称
功能 (SD 模式) 功能 (SPI 模式)
DAT3/CS
数据线 3
片选/从选 (SS)
CMD/DI
命令线
主出从入 (MOSI)
VSS1 VDD CLK VSS2 DAT0/DO DAT1/IRQ DAT2/NC
DAT2 / NC DAT3 / CS CMD / DI VSS1 VDD CLK / SCK VSS2 DAT0 / DO DAT1 / IRQ
图2
3 软件实现
软件部分 主 要 实 现 底 层 SPI 通 信 , SD 卡 的 复 位 , SD 卡 的 初始化、 以及 SD 卡的通用写命令和单块数据的读写等功能。
3.1 底层 SPI 通信函数
//======================================= //写一字节到 SD 卡,模拟 SPI 总线方式 void SD_spi_write(unsigned char n) {
unsigned char i;
for(i=0;i<8;i++) { SD_CLK=0; if(is_init) delay(DELAY_TIME); SD_DI=(n&0x80)>>7; SD_CLK=1; if(is_init) delay(DELAY_TIME);
在 SPI 模式中, 命令都是以如表 2 的 6 字节形式发送的。 表2
第一字节
第 2-5 字节
第 6 字节
0
1
命令号
参数
CRC 校验 1
每帧命令都以 “01” 开头, 然后是 6 位命令号和 4 字节的 参 数 (高 位 在 前 , 低 位 在 后), 最 后 是 7 位 CRC 校 验 和 1 位 停 止位 “1”。
用51单片机读写SD卡
…
实用第一 智慧密集
… . … … … … … … ~ …
2
非 法命 令
n<< 1 :
1
l
O
擦 除 复 位
空 闲 状 态
)
/= , l ==== ==:= ===== :=== =:==: ====== ==== =====
结 构 .在 官 方 的文 档 上有 很 详 细 的介 绍 ,如 S 卡 内 的存 储 器 D 结 构 、存 储单 元组 织 方 式 等 内容 。
1 S 卡标 准 D
S D卡标 准是 S D卡协 会针 对可 移动 存 储设 备设 计 专 利并 授权
命 令 和 专 。 命 令 ,后 面接 命 令 的 编 号 。例 如 ,C 用 MD1 是 一 7就
u sg e h r n in dc a
p SD s iwre “n in dc a ) a g me t3 ) i “ J s e h r & r u n ) ] t g f ;
_
_
SD s iwr eCR : p i ( C) t
— _
d o
f rI0 8i +) o ( < : _ +
个 通 用 命 令 ,用来 读 单 块 数 据 。
的一 种标 准 .主要用 于制 定卡 的外形 尺 寸 、电气接 口和 通信协 议 。
在 SI P 模式 中 ,命 令 都 是 以如 表 2的 6字 节 形 式 发 送 的 。
表 2
第 一 字 节 第 2 5字 节 - 第 6字 节
的 响 应 类 型 都 是 R1 ,这 里 的通 用 写 命 令 函数 所 接 收 的 响 应 类
C LK / CK S VS 2 S DA TO,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于AT89C52单片机的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卡在电能监测及无功补偿数据采集系统中的用途。