用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);
用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电平标准。
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相连 * *
单片机读取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){
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卡
…
实用第一 智慧密集
… . … … … … … … ~ …
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,
MCS51 MCU读写SD卡版(单片机论文)
摘要摘要近年来, SD存储卡在嵌入式产品中的应用越来越广泛, 但SD卡接口一般仅集成在32位高端处理器中, 一般51单片机则由于资源限制没有该接口。
因此,如何解决51单片机应用系统存取SD卡大容量数据就显得很有实际意义。
本系统使用MXT8051F04A作为单片机与SD卡的接口芯片, 采用SPI串行方式对SD卡的扇区进行读写,读写过程和结果通过串口调试助手在主机上显示。
本论文的核心主要从硬件设计和软件编程两个大的方面介绍了系统的实现。
硬件电路设计主要包括MXT8051F04A最小系统电路、电源电路、串口电路、SD卡接口电路。
程序采用C语言在Keil软件下进行编写、调试,程序主要包括SD卡扇区读写程序、串口程序等软件模块。
系统实现了对SD卡扇区的读写,达到了设计的要求和目的。
关键字:MXT8051F04A,SD卡,KeilIABSTRACTABSTRACTIn recent years, SD memory card applications in the embedded products more widely, but generally only the integrated SD card interface in 32-bit high-end processor, microcontroller 51 is generally not the interface due to resource constraints. Therefore, how to solve the 51 SCM applications to access data on large-capacity SD cards seem very practical.The system uses MXT8051F04A as SCM and SD card interface chip, using SPI mode on the SD card serial read and write sectors, reading and writing process and results through the serial port on the host display debugging assistant. The core of this thesis, the main hardware and software design introduces two major aspects of the system implementation. Hardware design includes MXT8051F04A minimum system circuit, power circuit, the serial port circuitry, SD card interface circuit. Program using C language under the Keil software write, debug, the program includes reading and writing SD card sector program, serial procedures of software modules. System realizes the SD card read and write sectors, meets the design requirements and objectives.Keywords: MXT8051F04A,SD Card,KeilII目录第1章引言 (1)1.1 选题背景 (1)1.2 研究目标和意义 (1)1.3 本文要完成的工作 (1)第2章单片机读写SD卡的硬件电路设计 (3)2.1 系统硬件平台组成 (3)2.2 电源模块 (3)2.3 MXT8051F04A单片机最小系统电路设计 (4)2.3.1 MXT8051F04A简介 (4)2.3.2 晶振复位电路 (8)2.4 SD卡电路设计 (8)2.4.1 通讯模式 (9)2.4.2 电平匹配 (9)2.4.3 硬件接口设计 (10)2.5 串口电路设计 (12)2.6 PCB绘制 (13)2.7 本章小结 (14)第3章单片机读写SD卡的软件设计 (14)3.1 SD卡的扇区读写 (14)3.1.1 模拟SPI协议 (14)3.1.2 SD卡命令 (15)3.1.3 SD卡的初始化 (19)3.1.4 数据块的读写 (20)3.2 串口程序 (25)第4章调试 (26)4.1 系统硬件调试 (26)4.2 软件调试 (27)4.3 软硬件的联合调试 (27)III4.4 本章小结 (29)第5章结束语 (30)5.1 总结 (30)5.2 展望 (30)参考文献 (31)致谢 (32)附录 (33)附录一:单片机读写SD卡的完整原理图 (33)附录二:单片机读写SD卡的完整程序 (36)外文资料原文 (63)译文 (64)IV第1章引言第1章引言1.1选题背景SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如个人数码助理(PDA)、数码相机和多媒体播放器等。
基于51单片机的SD卡读写系统
研制开发单片机的SD卡读写系统赵华峰物理与电气工程学院,陕西卡在便携式储存领域有着广泛的应用。
其读写系统方案从数据输入、中央处理器、处理电路以及数据输出等模块进行对比分析论证。
通过分析SD卡的特点及对卡扇区的读写。
测试结果表明,基于51单片机的SD串口通信;SPI;数据输入;中央处理器;处理电路SD Card Reading and Writing System Based on 51 Singlechip MicrocomputerZHAO HuafengSchool of Physics and Electrical Engineering,Weinan Normal Universityportable storage at present.Thecentral processing unit,processing circuitthe timing requirements of SD card reading and writing operation were taken into account.At last the function of reading and writing SD card sector in SPI mode by SCM was realized.The test results showP2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN 29ALE 30EA 31P0.732P0.633P0.534P0.435P0.336P0.237P0.138P0.039VCC 40C S S I S C L S CSD 2020年8月25日第37卷第16期· 17 ·Telecom Power TechnologyAug. 25,2020,Vol. 37 No. 16 赵华峰:基于51单片机的 SD 卡读写系统开始各模块初始化等待串口发送和接收数据将接收的数据存入缓存区缓存区数据写入SD卡指定扇区达到一个扇区NY图2 主程序流程图只有在进行正常的初始化后才能对SD 卡进行读写操作。
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 擦除所选块v.。
利用51单片机读写sd卡
利用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卡的可能。
SD卡读写C51
uchar SD_Init(void);
uchar SD_Write_Sector(unsigned long addr,uchar *buffer);
uchar SD_Read_Sector(unsigned long addr,uchar *buffer);
void Delays(uint t)
{
while(t--)
{}
}
/*长延时*/
void Delay_ms(uchar N)
{
while(N--)
{
Delays(60000);
}
}
/*LCD12232写函数*/
void Send_DATA(uchar Data,uchar A)
{
uchar i,Dat;
if(is_init) delay(DELAY_TIME);
SD_SI=_dat3;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SI=_dat2;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat7=SD_SO;
SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat6=SD_SO;
SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
SD_SCL=0;
51单片机读写SD卡
Maplead MCU Development Board21. SD 卡的 SPI 方式读写SD 卡及其总线结构SD 卡是日常生活中常见的一种电可擦除移动存储设备,因其存储量大、价 格低廉而被广泛应用于数码相机、手机等数码产品中。
SD 卡支持两种总线方式:SD 方式与 SPI 方式。
其中 SD 方式采用 6 线制, 使用 CLK、CMD、DAT0、DAT1、DAT2、DAT3 进行数据通信,其特点是数据 位数宽(4 位) 、速度快。
SPI 方式采用 4 线制,使用 CS、CLK、DataIn、DataOut 这 4 个端口进行数据通信,其特点是速度要比 SD 方式慢,但总线简单、不需要 进行 CRC 校验,因而比较适合单片机采用这种方式对 SD 卡进行读写操作。
图 21-1 SD 卡及其接口 表 21-1 SD 卡接口定义端口 1. DAT3/CS 2. CMD/DataIn 3. VSS1 4. VDD 5. CLK/SCK 6. VSS2 7. DAT0/DataOut 8.DAT1 9.DAT2 DAT3 口。
命令/回应。
电源地。
电源。
同步时钟。
电源地。
DAT0 口。
DAT1 口。
DAT2 口。
说明 SD 模式 SPI 模式 片选,低电平有效。
数据输入端。
电源地。
电源。
同步时钟。
电源地。
数据输出端。
NC。
NC。
SD 卡命令格式SD 卡的命令字由 6 个字节组成,其组成结构见图 21-2。
146Maplead MCU Development Board命令字的第 1 个字节为命令号(CMD0、CMD1 等) ,命令号的最高位始终 为 0,次高位(位 7)为 1,表示命令是由主机向 SD 卡发送的命令。
命令字的第 2、3、4、5 字节为命令参数表,传送随命令附带的参数,如地 址信息等。
命令字的最后一个字节为 CRC 校验字节,其中该字节的高 7 位为 CRC 码, 最后一位为结束位,始终为 1。
51单片机实现对SD卡的读写
51单片机实现对SD卡的读写51单片机实现对SD卡的读写SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。
在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。
SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。
既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。
这就要求对SD卡的硬件与读写时序进行研究。
对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
(1)SD卡的引脚定义:SD卡引脚功能详述:引脚编号SD模式 SPI模式名称类型描述名称类型描述1 CS/DAT3 IO或PP 卡检测/数据线3 #CS I 片选2 CMD PP 命令/回应DI I 数据输入3 VSS1S 电源地VSS S 电源地4 VDDS 电源VDD S 电源5 CLK I 时钟SCLK I 时钟6 VSS2S 电源地VSS2 S 电源地7 DAT0 IO或PP 数据线0 DO O或PP 数据输出8 DAT1 IO或PP 数据线1 RSV9 DAT2 IO或PP 数据线2 RSV注:S:电源供给 I:输入 O:采用推拉驱动的输出PP:采用推拉驱动的输入输出SD卡SPI模式下与单片机的连接图:SD卡支持两种总线方式:SD方式与SPI方式。
其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。
而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut 进行数据通信。
SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用 SPI模式。
采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。
51单片机SD卡SPI模式操作
脚
s卡 的命 令格式 固定 为6 字节4 个位 ,其格式如 d 个 8
图3 所示 。
l】 , ! 矗=为 I说 明 帆 持 s 的 命 々 j d 、 …
s d模式 韩 ≯
( m^ A m T3
S i投式 p 类 型
10 P /
;
描述
书柠 翊 暂 掘 线 3
一
盛卷
器
—
]
J f
一
i
k
三、 1 5 单片机与s 卡在s i d p模式下的连接
由于5 单片机 内部没有集成sj 块 ,使用5 单片 1 p 模 1
机 与s卡通讯 要用5 单片机 的1 d 1 0口模 拟si p时序 ,原 则 上 5 单片 机 的P 、 1P 、3 1 0 P 、2 P 口的任 意位都 可 以与s 卡 d S 卡的内部结 构如图2 示 ,主要有 四部分组成 , D 所
名字
C S
类 型
批 述
片选
凿
互面五 二 蓟
— —— —— —— — — —— —— —— 一 心氍 艘 ; s个 位 . M 6 — — — 04 p
j —— — — —— —— — —— —— — — —- 一 -
命 令/ 反漩
电源地
~ ) S } 源
的, 两种模式下具有相 同的命令 。
连, 其接 口端定义如表1 所示 。s卡有两种操作模式 , d 一 种是s模式 , d 另一种是si p 模式 , 同模式下端 口的定 义 不 不同。s 模式有一个时钟线 、 D 一个命令饭 馈线 、 四根输 入/ 出信号线 、 输 两个 电源地和一个 电源 , 所有九根线都
51单片机SD卡SPI模式操作_1568
【51单片机SD卡SPI模式操作】摘要:sd卡有两种接口模式,一种是sd模式,另一种是spi模式。
在spi模式下,有六根接口线与主机相连,5V电平的51单片机通过电平转换可与3.3V电平的sd卡相连接。
51单片机没有专门的spi总线,可以用51单片机的IO口来模拟spi总结时序。
主机与sd卡的数据交换主要通过命令来实现,通过发送cmd0命令对sd卡进行复位,发送命令cmd1实现sd卡的spi模式初始化。
cmd17、cmd18命令是sd卡的读写扇区命令,对sd卡的操作是严格按照时序进行的。
关键词:sd卡;spi接口;时序sd卡以其大容量、低成本、携带方便、存储数据简单和安全可靠性高被大量应用于数码电子设备中,比如数码相机、数码摄像机、mp3、pda、电子学习机、电子图书等。
对sd卡的操作有复位、初始化、读写等,下面以本人掌握的材料对sd卡的操作进行分析。
一、sd卡的结构sd卡的外形与接口如图1,它有9个接点与主机相连,其接口端定义如表1所示。
sd卡有两种操作模式,一种是sd模式,另一种是spi模式,不同模式下端口的定义不同。
SD模式有一个时钟线、一个命令/反馈线、四根输入/输出信号线、两个电源地和一个电源,所有九根线都有定义,数据传输速率较快。
SPI模式只用到CS片选、数据输入、数据输出、时钟、电源地及电源六根线。
SPI模式较SD模式速度较慢,但很多单片机都有专用的SPI总线,可与sd卡直接相连,使用方便。
SD卡的内部结构如图2所示,主要有四部分组成,一是接口电路,共有九个接口电路,定义如表1所示。
二是接口控制电路,所有操作都由该控制电路具体去执行。
三是内部寄存器组OCR、CID、RCA等。
四是存储数据的存储单元。
接口电路通过控制电路与内部寄存器组成存储单元交换数据,其主要操作有写命令、读数据、写数据、读状态等。
二、sd卡的命令格式sd卡的命令格式固定为6个字节48个位,其格式如图3所示。
开始位固定为0,第二位固定为1,表示主机给sd卡的命令,然后是6位命令索引号,索引号的大小与索引号数字相同,比如cmd0的索引号为000000,索引号41为101001。
sd卡在单片机上的应用
SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。
在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。
SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。
既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。
这就要求对SD卡的硬件与读写时序进行研究。
对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
<1) SD卡的引脚定义SD卡引脚功能详述:引脚编号SD模式SPI模式名称类型描述名称类型描述1CD/DAT3IO或PP卡检测/数据线3#CS I片选2CMD PP命令/回应DI I数据输入3VSS1S电源地VSS S电源地4VDD S电源VDD S电源5CLK I时钟SCLK I时钟6VSS2S电源地VSS2S电源地7DAT0IO或PP数据线0DO O或PP数据输出8DAT1IO或PP数据线1RSV9DAT2IO或PP数据线2RSV注:S:电源供给 I:输入 O:采用推拉驱动的输出PP:采用推拉驱动的输入输出SD卡SPI模式下与单片机的连接图:SD卡支持两种总线方式:SD方式与SPI方式。
其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。
而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。
SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。
采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。
这里只对其SPI方式进行介绍。
b5E2RGbCAP<2)SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。