用51单片机读写SD卡

合集下载

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卡

用51单片机读写SD卡
//======================================== //发命令到 SD 卡 unsigned char SdCommand (unsigned char command, unsigned long argument, unsigned char CRC) { unsigned char temp,time=0; SD_CS=1; SD_spi_write(0xff); //提 高 兼 容 性 ,如 果 没 有 这 里 ,有 些 SD 卡 可能不支持 SD_CS=0; SD_spi_write(command|0x40); SD_spi_write(((unsigned char *)&argument)[0]); SD_spi_write(((unsigned char *)&argument)[1]); SD_spi_write(((unsigned char *)&argument)[2]); SD_spi_write(((unsigned char *)&argument)[3]); SD_spi_write(CRC); do {
电源地 电源 时钟 电源地 数据线 0 数据线 1 数据线 2
电源地 电源 时钟 (SCK) 电源地 主入从出 (MISO) 保留 保留
SD 模 式 多 用 于 对 SD 卡 读 写 速 度 要 求 较 高 的 场 合 , SPI 模 式 则 是 以 牺 牲 读 写 速 度 换 取 更 好 的 硬 件 接 口 兼 容 性 。 由 于 SPI 协议是目前广泛流行的通信协议, 大多数高性能单片机都配 备 了 SPI 硬 件 接 口 , 硬 件 连 接 相 对 简 单 , 因 此 , 在 对 SD 卡 读 写 速 度 要 求 不 高 的 情 况 下 , 采 用 SPI 模 式 无 疑 是 一 个 不 错 的 选择。

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

51单片机spi驱动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汇编语言

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卡程序

单片机读取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){

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卡程序

if(reading==0) MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; else MMC_PORT&=~MMC_CS_PIN; //MMC_CS_PIN=0; return(tmp); } //**************************************************************************** //SD卡初始化(SPI-MODE) //****************************************************************************
/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卡



实用第一 智慧密集
… . … … … … … … ~ …

非 法命 令
n<< 1 :



擦 除 复 位
空 闲 状 态

/= , 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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档