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);

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读写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相连 * *

51平台通过SPI方式读写SD

51平台通过SPI方式读写SD

一、总则本文件介绍了在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,供参考:51单片机引脚SD/MMC引脚P1_0SPI_CS (PIN1)P1_1SPI_SI(PIN2)P1_2SPI_SCK(PIN5)P1_3SPI_SO(PIN7)PIN4接VDDPIN3/6接GND表1 SD/MMC与51单片机引脚连接表注意:SD/MMC引脚除VDD(PIN4)/VSS(PIN3/6)外,其它引脚连接上拉电阻(47k)至3.3v 电源。

四、SPI接口软件模拟由于W78E52B没有集成硬件SPI接口,所以固件需要通过软件来模拟实现SPI接口;a) SPI接口基本原理:SPI采用HOST/SLAVE结构,HOST与SLA VE以字节为传输单位,支持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-延时波形图1) 发送RESET命令CMD0,其波形图参考图1:2) 发送命令CMD1(SD卡使用命令ACMD41)激活SD/MMC卡, 固件需重复发送命令CMD1直到R1 idle state位为0。

51读写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 擦除所选块//实验目的:学习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卡

用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”。

单片机读写SD卡教程

单片机读写SD卡教程

单片机读写SD卡教程引言:SD卡(Secure Digital Card)是广泛应用于各类数字设备上的一种存储介质。

它小巧轻便,可靠性高,容量大,因此在各种嵌入式系统中都广泛使用。

本教程将介绍如何使用单片机读写SD卡,包括初始化SD卡、读写数据等基本操作。

一、硬件准备在开始之前,我们需要准备以下硬件设备:1.一个支持SPI协议的单片机开发板(例如STC89C51、STM32等);2.一个SD卡插槽,或者是一个带有SD卡插槽的扩展板;3.杜邦线、面包板等连接器。

二、软件准备除了硬件设备,我们还需要准备以下软件工具:1. Keil C51、IAR、Keil MDK等单片机编译工具;2. SD卡相关的库文件,例如FatFs;3.一个用于测试的程序(可以是一个简单的读写数据的程序)。

三、连接SD卡插槽将SD卡插入到对应的插槽中,并将插槽与单片机的硬件SPI接口连接。

根据不同的开发板,连接方式可能有所不同,一般SPI接口包括SCK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和CS(片选线)等。

四、编写读写SD卡的程序在开始编写程序之前,我们需要先了解SD卡的工作原理。

SD卡通过SPI总线与单片机进行通信,通过发送特定的命令和参数实现读写操作。

以下是一个简单的读写SD卡的流程:1.初始化SD卡a.发送CMD0命令,将SD卡设置为SPI模式;b.发送CMD8命令,验证SD卡是否支持高速SPI模式;c.发送ACMD41命令,等待SD卡初始化完成。

2.读写数据a.发送CMD17命令,指定要读取的扇区地址;b.等待SD卡回应,确认读取命令执行成功;c.读取数据;d.发送CMD18命令,继续读取下一个扇区;e.重复步骤c和d,直到读取完所有数据;f.发送CMD12命令,停止读取。

g.发送CMD24命令,指定要写入的扇区地址;h.等待SD卡回应,确认写入命令执行成功;i.写入数据;j.发送CMD25命令,继续写入下一个扇区;k.重复步骤i和j,直到写入完所有数据;l.发送CMD12命令,停止写入。

菜鸟用C8051F020 SPI读写SD卡FAT全攻略单片机

菜鸟用C8051F020 SPI读写SD卡FAT全攻略单片机

菜鸟用C8051F020 SPI读写SD卡FAT全攻略转自:/wandou16/249996/message.aspx#我从一个月前刚放暑假开始弄单片机读写SD卡,八月初完成FAT16,已经可以写入TXT文件,并可在windows上读出。

由于网上资料比较散,所以一开始走了不少弯路,现在写一篇总结,将我遇到的问题详细地列出来,希望能帮助和我一样的菜鸟们少走弯路。

文中说到的一些问题对高手而言只是常识性的,还请包涵。

第一步:搭电路我买了一小块蜂窝板和一个SD插槽,按照标准电路焊接上,由于用的是SPI模式,所以选电路图的时候要看好,SD卡上的引脚顺序不要看错,912345678,最后两根挨得很紧,焊接时不要连上了,相关引脚一定要按照要求接上47K的上拉电阻。

电路虽然简单,但一定要确保无误。

还有一点,SD卡座种类不一样,有位学长买的是弹簧式的,焊完以后刚开始初始化都能成功,放了几天突然不行了,检查各引脚都没问题,最后发现是卡座的问题,这样的硬件问题很难发现,还浪费时间,所以卡座还是直接买简单的好。

第二步:设置硬件SPI我用的是sililab的C8051F020,自带硬件SPI,如果不带可以用软件模拟,关于软件模拟SPI这块网上有很多现成的程序。

这一歩首先按照020手册写了一段程序,当然是将其设为主模式,这时候CONFIG (这个软件可以视窗化操作C8051F的大多数寄存器并自动生成代码)会分配4个引脚,CLK时钟位,MISO 和MOSI两个数据传输位,还有一个NSS位,这个脚用不上,不要将其当作CS片选位,CS位选一个普通IO既可。

所有从单片机上输出的引脚都设为推挽输出。

设置完成后最好弄个示波器看一下输出波形是否和你想象中的一样,这样就能确保你的SPI工作没问题了,这一步也是关键,SPI是底层通信的基础。

第三步:SD卡初始化这一步正式进入单片机调试SD部分,了解SD卡的时序后(后面我会上传这部分资料),网上众说纷纭,还有说要看完178页英文PDF,我都晕了,这个看完估计我都是专家了。

MCS51 MCU读写SD卡版(单片机论文)

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)、数码相机和多媒体播放器等。

007、STC12C5A60S2单片机之SD卡读写

007、STC12C5A60S2单片机之SD卡读写

007、STC12C5A60S2单片机之SD卡读写/*-----------------------------------------------------------芯片 :STC12C5A60S2晶振 :11.0592MHZ开发平台:KEIL功能 :向SD卡读写一个扇区,如果成功则激活P0口流水灯,如果失败则无流水灯。

并且随程序运行向串口发送运行状态。

波特率 :9600BPS日期 :11.5.19其他 :本程序软件模拟SPI,随后我会改为硬件SPI注意 :下载完程序后请复位系统后运行~(切记~~) -------------------------------------------------------------*/#include "STC12C5A60S2.h" #include "uart.h"#include "sd.h"#define uchar unsigned char #define uint unsigned intuchar xdata tab[512]; //定义外部ROM,512个字节,数据缓冲区(一个扇区必须写512字节 )void delay5ms(){uchar a,b;for(b=19;b>0;b--)for(a=130;a>0;a--); }void delay500ms(){uchar a,b,c;for(c=23;c>0;c--)for(b=152;b>0;b--)for(a=70;a>0;a--); }void main(){int i;uchar flag=0;init(); //初始化串口txd_s("串口初始化\n");SD_Reset(); //复位SD卡txd_s("SD卡复位完\n");SD_Init(); //初始化SD卡txd_s("SD卡初始化完\n");for(i=0;i<512;i++)tab[i]=i; //向数据缓冲区中写入0~255 0~255,共512个字节txd_s("缓冲区写完\n");SD_Write_Sector(20,tab); //将数据缓冲区中的512个字节的数据写入SD 卡的第20扇区中delay5ms();txd_s("扇区写完\n");for(i=0;i<512;i++) //清空数据缓冲区tab[i]=0;txd_s("清缓冲区\n");SD_Read_Sector(20,tab); //从SD卡的第20扇区中读取512个字节的数据到数据缓冲区txd_s("读扇区完\n");for(i=0;i<512;i++)if(((uchar)i)!=tab[i]) //对读出的数据进行匹配,如果不吻合则flag=1,否则flag=0{flag=1;break;}delay5ms();txd_s("匹配完毕\n");if(flag==0) {delay5ms();txd_s("匹配对 \n");P0=0xfe;while(1) {P0=P0>>1|P0<<7;delay500ms(); }}else {delay5ms();txd_s("匹配错 \n"); } while(1);}。

51单片机程序(存储器)

51单片机程序(存储器)
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};
void LCD_WriteCommandE1(unsigned char com)
{
while(CRADD1 & 0x80);
CWADD1 = com;
LCD_WriteCommandE2(i+0xb8);
LCD_WriteCommandE1(0x00);
LCD_WriteCommandE2(0x00);
for(j=0;j<0x50;j++)
{
LCD_WriteDataE1(0x00);
LCD_WriteDataE2(0x00);
}
}
}
void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p)
SDA_IIC = 0;
SCL_IIC = 0;
}
void stop_IIC(void)
{
SCL_IIC = 0;
SDA_IIC = 0;
SCL_IIC = 1;
LCD_WriteDataE1(number_X[k++]);
}
else
{
a = L-61;
LCD_WriteCommandE2(a);
LCD_WriteDataE2(number_X[k++]);
}
L++;
}
}
}
void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat)

SD卡读写C51

SD卡读写C51
uchar SD_Reser(void);
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卡

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卡的读写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卡程序

51单片机读写SD卡程序

51单片机读写SD卡程序!!! 发表于 2007-11-12 16:02:25
l目的同行? 现在需要帮助一下咯! o(∩_∩)o...
我是GG 高级会员 加为好友 发短消息 最后登陆时间:2009-05-21 15:30:00 状态:离线
RE: 51单片机读写SD卡程序!!!
RE: 51单片机读写SD卡程序!!!
SnIIper
MMC_PORT|=MMC_CS_PIN; //MMC_CS_PIN=1; //set MMC_Chip_Select to high return(0); //All commands have been taken. } //**************************************************************************** //从SD卡读一个扇区 Return 0 if no Error. //**************************************************************************** uchar SD_Read_Block(unsigned long address) { uchar temp=0;uint i=0; reading=1; temp=SD_Write_Command(17,address); //读出RESPONSE while (Read_Byte_SPI()!= 0xfe) {;} //直到读取到了数据的开始头0XFE,才继续 for(i=0; i<512; i++) { BUFFER[i]=Read_Byte_SPI(); } Read_Byte_SPI();//CRC - Byte Read_Byte_SPI();//CRC - Byte reading=0; MMC_PORT|=MMC_CS_PIN; //关闭SD卡 return(temp); 发}表于 2007-11-15 09:45:12

51单片机sd卡代码

51单片机sd卡代码

/*-----------------------------------------------------------------------------------------------*/#include <reg52.h>#include <intrins.h>#include <stdio.h>#include<9325TP.h>//============================================================= //定义SD卡需要的4根信号线sbit SD_CLK = P1^1;sbit SD_DI = P1^2;sbit SD_DO = P1^0;sbit SD_CS = P1^3;//=========================================================== //定义按键端口sbit KEY = P3^2;//=========================================================== //定义512字节缓冲区,注意需要使用xdata关键字unsigned char xdata DA TA[75]={0};unsigned char xdata DA TA1[75]={0};//=========================================================== //写一字节到SD卡,模拟SPI总线方式void SdWrite(unsigned char n){unsigned char i;for(i=8;i;i--){SD_CLK=0;SD_DI=(n&0x80);n<<=1;SD_CLK=1;}SD_DI=1;}//=========================================================== //从SD卡读一字节,模拟SPI总线方式unsigned char SdRead(){unsigned char n,i;for(i=8;i;i--){SD_CLK=0;SD_CLK=1;n<<=1;if(SD_DO) n|=1;}return n;}//============================================================//检测SD卡的响应unsigned char SdResponse(){unsigned char i=0,response;while(i<=8){response = SdRead();if(response==0x00)break;if(response==0x01)break;i++;}return response;}//================================================================ //发命令到SD卡void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC) {SdWrite(command|0x40);SdWrite(((unsigned char *)&argument)[0]);SdWrite(((unsigned char *)&argument)[1]);SdWrite(((unsigned char *)&argument)[2]);SdWrite(((unsigned char *)&argument)[3]);SdWrite(CRC);}//================================================================ //初始化SD卡unsigned char SdInit(void){int delay=0, trials=0;unsigned char i;unsigned char response=0x01;SD_CS=1;for(i=0;i<=9;i++)SdWrite(0xff);SD_CS=0;//Send Command 0 to put MMC in SPI modeSdCommand(0x00,0,0x95);response=SdResponse();if(response!=0x01){return 0;}while(response==0x01){SD_CS=1;SdWrite(0xff);SD_CS=0;SdCommand(0x01,0x00ffc000,0xff);response=SdResponse();}SD_CS=1;SdWrite(0xff);return 1;}//================================================================ //往SD卡指定地址写数据,一次最多512字节unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len){unsigned int count;unsigned char dataResp;//Block size is 512 bytes exactly//First Lower SSSD_CS=0;//Then send write commandSdCommand(0x18,address,0xff);if(SdResponse()==00)SdWrite(0xff);SdWrite(0xff);SdWrite(0xff);//command was a success - now send data//start with DA TA TOKEN = 0xFESdWrite(0xfe);//now send datafor(count=0;count<len;count++) SdWrite(*Block++);for(;count<512;count++) SdWrite(0);//data block sent - now send checksumSdWrite(0xff); //两字节CRC校验, 为0XFFFF 表示不考虑CRCSdWrite(0xff);//Now read in the DA TA RESPONSE tokendataResp=SdRead();//Following the DA TA RESPONSE token//are a number of BUSY bytes//a zero byte indicates the MMC is busywhile(SdRead()==0);dataResp=dataResp&0x0f; //mask the high byte of the DA TA RESPONSE tokenSD_CS=1;SdWrite(0xff);if(dataResp==0x0b){//printf("DA TA WAS NOT ACCEPTED BY CARD -- CRC ERROR\n");return 0;}if(dataResp==0x05)return 1;//printf("Invalid data Response token.\n");return 0;}//printf("Command 0x18 (Write) was not received by the MMC.\n");return 0;}//===================================================================== ==//从SD卡指定地址读取数据,一次最多512字节unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len)unsigned int count;//Block size is 512 bytes exactly//First Lower SS//printf("MMC_read_block\n");SD_CS=0;//Then send write commandSdCommand(0x11,address,0xff);if(SdResponse()==00){//command was a success - now send data//start with DA TA TOKEN = 0xFEwhile(SdRead()!=0xfe);for(count=0;count<len;count++) *Block++=SdRead();for(;count<512;count++) SdRead();//data block sent - now send checksumSdRead();SdRead();//Now read in the DA TA RESPONSE tokenSD_CS=1;SdRead();return 1;}//printf("Command 0x11 (Read) was not received by the MMC.\n");return 0;}/********************************************************************* 名称: Com_Init()* 功能: 初始化串口程序,晶振11.0592, 波特率9600* 输入: 无* 输出: 无***********************************************************************/ void Com_Init(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}//============================================================//主程序main(){unsigned long AddTemp=262144;//SD卡地址第一个数据物理地址初始值,可以用winhex 查看,这里是512扇区,512x512=262144,根据实际SD卡内容更改unsigned char i;unsigned char *p;CS=1;delayms(5);RES=0;delayms(5);RES=1;delayms(5);SdInit(); //SD卡初始化Com_Init();for(i=0;i<75;i++){DA TA1[i]=i;}SdWriteBlock(DA TA1, AddTemp, 75);SdReadBlock(DA TA, AddTemp, 75);p= DA TA;while(1)for(i=0;i<75;i++){SBUF = *p+48;while(!TI) //如果发送完毕,硬件会置位TI{_nop_();}p++;TI = 0; //TI清零delayms(500);}}。

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