对SD卡的读写程序

上传人:橙** 文档编号:333365622 上传时间:2022-09-01 格式:PDF 页数:18 大小:175.65KB
返回 下载 相关 举报
对SD卡的读写程序_第1页
第1页 / 共18页
对SD卡的读写程序_第2页
第2页 / 共18页
对SD卡的读写程序_第3页
第3页 / 共18页
对SD卡的读写程序_第4页
第4页 / 共18页
对SD卡的读写程序_第5页
第5页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《对SD卡的读写程序》由会员分享,可在线阅读,更多相关《对SD卡的读写程序(18页珍藏版)》请在金锄头文库上搜索。

1、SD 卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD 卡由日本松下、东芝及美国SanDisk 公司于 1999 年 8 月共同开发研制。大小犹如一张邮票的SD 记忆卡,重量只有2 克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。贴程序:/*-1.本程序主要为了实现以下功能:1)通过对 SPI 方式对 SD卡进行读与写 2)简单的 FAT操作 3)对写入的数据进行打印 2.编写日期:09.10.13 3.版

2、本号:V1.0 4.作者:andyluo -*/#include /添加头文件#define uchar unsigned char/宏定义数据类型#define uint unsigned int /*-与指示灯有关的IO -*/sbit power=P04;/*-与 SD卡通信有关的IO -*/sbit SCL=P15;/时钟信号sbit CS=P16;/片选信号sbit SI=P17;/数据输入sbit SO=P33;/数据输出/错误码定义#define INIT_CMD0_ERROR 0X01#define INIT_CMD1_ERROR 0X02#define WRITE_BLOCK

3、_ERROR 0X03#define READ_BLOCK_ERROR 0X04 /*-与通信和定时器相关的变量-*/uchar cn=0;/*-变量定义-*/名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 18 页 -uchar is_init;/用于控制 SPI 的速度,通过为 1 与 0 进行选择uchar xdata pbuf512;/定义 512 个数据缓冲区/*-函数名称:delay()函数作用:用于某些程序中的延时函数特点:无返回值,带入口参数-*/void delay(uint k)uint m,n;for(m=0;m5;m+)for(n=0;nk;n+);/*-

4、SPI 写一个字节-*/void spi_write(uchar x)/SPI写一个字节,其中 is_init为 1 uchar i;for(i=0;i8;i+)SI=(xi)&0 x80);SCL=0;if(is_init)delay(8);SCL=1;if(is_init)delay(8);/*-SPI 读一个字节-*/uchar spi_read()uchar temp=0,i;SO=1;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 18 页 -for(i=0;ii);/temp=(temp1)+(uchar)SO;SCL=1;if(is_init)/放慢速度 delay

5、(8);return(temp);/*-向 SD卡写命令-*/uchar write_cmd(uchar*pcmd)/pcmd为命令字 uchar temp,i,time=0;CS=1;spi_write(0XFF);CS=0;for(i=0;i6;i+)/发送 6 个字节的命令字节序列 spi_write(*pcmd+);spi_read();do temp=spi_read();/一直读,直到读到的不是0XFF或者超时time+;while(temp=0 xff)&(time100);return temp;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 18 页 -/*-S

6、D卡复位,进入 SPI 模式,使用 CMD0 命令-*/uchar SD_Reset()/SD卡复位 uchar time,temp,i;uchar pcmd=0 x40,0 x00,0 x00,0 x00,0 x00,0 x95;/0号命令对应的6 个字节is_init=1;/set is_init flag CS=1;for(i=0;i0 x0f;i+)/初始化时,首先要发送至少74 个时钟信号,这是必须的 spi_write(0 xff);/实质发了 120 个时钟(15*8)CS=0;time=0;do temp=write_cmd(pcmd);time+;if(time=200)re

7、turn(INIT_CMD0_ERROR);/cmd0写入失败 while(temp!=0 x01);CS=1;spi_write(0 xff);/按照 SD的操作时序在这里需要补8 个时钟return 0;/返回 0,说明 SD卡复位操作成功 /*-SD卡初始化,使用 CMD1 号命令-*/uchar SD_Init()/SD卡初始化,使用 CMD1 号命令 uchar time,temp;uchar pcmd=0 x41,0 x00,0 x00,0 x00,0 x00,0 xff;CS=0;time=0;do temp=write_cmd(pcmd);名师资料总结-精品资料欢迎下载-名师精

8、心整理-第 4 页,共 18 页 -time+;if(time=100)return(INIT_CMD1_ERROR);while(temp!=0 x00);is_init=0;/初始化完成,将 is_init设置为 0,以提高后面数据的传输速度CS=1;spi_write(0 xff);return 0;/说明初始化成功 /*-向 SD卡扇区中写数据,每一个扇区中有512 个字节-*/uchar SD_write_sector(unsigned long addr,uchar*Buffer)uchar temp,time;uint i;uchar pcmd=0 x58,0 x00,0 x00

9、,0 x00,0 x00,0 xff;/向 SD卡中写入 24号命令addr=addr24);/将字节地址写入到24 号命令的时序中pcmd2=(addr&0 x00ff0000)16);pcmd3=(addr&0 x0000ff00)8);/SD卡最大容量4G /pcmd4=(addr&0 x000000FF);/此行为增加项CS=0;time=0;do temp=write_cmd(pcmd);time+;if(time=100)return(temp);/命令写入失败 while(temp!=0);for(i=0;i100;i+)/这里要插入若干个时钟信号 spi_read();spi_

10、write(0 xfe);/写入开始字节0XFE,后面就要写入512 个字节名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 18 页 -for(i=0;i512;i+)/将缓冲区中要写入的512 个字节写入到SD卡中 spi_write(*Buffer+);spi_write(0 xff);spi_write(0 xff);/两个字节 CRC 校验码temp=spi_read();/读取返回值if(temp&0 x1f)!=0 x05)/如果返回值为xxx00101,说明数据已经被接收 CS=1;return(WRITE_BLOCK_ERROR);/写块数据失败 while(sp

11、i_read()!=0 xff);/等待 SD卡不忙(数据被接收以后,SD 卡要将这些数据写入自身的 FLASH /中,需要一定时间,忙时为 0 x00,不忙是为 0 xff,)CS=1;spi_write(0 xff);/补 8 个时钟return 0;/*-读 SD卡的一个扇区-*/uchar SD_read_sector(unsigned long addr,uchar*Buffer)uint i;uchar time,temp;uchar pcmd=0 x51,0 x00,0 x00,0 x00,0 x00,0 xff;/CMD17号命令addr=addr24);pcmd2=(addr

12、&0 x00ff0000)16);pcmd3=(addr&0 x0000ff00)8);CS=0;time=0;do temp=write_cmd(pcmd);time+;if(time=100)return(READ_BLOCK_ERROR);/读块失败 while(temp!=0);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 18 页 -while(spi_read()!=0 xfe);/一直读,当读到 0 xfe 时,说明后面是512 个数据字节for(i=0;i512;i+)Bufferi=spi_read();spi_read();spi_read();CS=1;s

13、pi_write(0 xff);/补 8 个时钟return 0;/*-串口初始化-*/void serial_init(void)/TMOD=0 x21;/使用定时器1 工作在方式2,做波率发生器,定时器 0 方式 1 TH0=0X3c;/设置定时初值,定时 20ms,1s 采用 20*50 算法TL0=0Xb0;ET0=1;/开定时器 0 中断标志TR0=1;/启动定时器0 TH1=0 xfd;/32M,9600 TL1=0 xfd;TR1=1;/启动定时器1 SCON=0X40;/串口工作在方式1,不允许接收REN=1;/允许串口接收ES=1;/允许串口中断EA=1;/开总中断 /*-函

14、数名称:main()函数作用:主函数-*/void main()int i=0;SD_Reset();SD_Init();serial_init();for(i=0;i512;i+)pbufi=i;/向缓冲区中写入数据名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 18 页 -SD_write_sector(80,pbuf);/将缓冲区中512 个字节的数据写入80 扇区for(i=0;i512;i+)pbufi=0;/清空数据缓冲区 SD_read_sector(80,pbuf);/从 SD卡的第 80 个扇区中读取512 个字节的数据for(i=0;i512;i+)P2=pb

15、ufi;/将缓冲区中的数据输出在P2口,delay(1000);/P2=0X00;while(1);void timer0_int(void)interrupt 1 /中断程序,注意中断类型号 TH0=0X3c;/重新赋初值,并且必须要这样做,不然的话定时时间会不准确的TL0=0Xb0;cn+;/每当进入中断程序,count+,当有关参数设置正确后,程序会自动进入中断程序if(cn=20)cn=0;power=!power;/本机运行指示灯闪烁 2009-10-17,09:26:21 资料邮件回复引用回复编辑删除【1 楼】andyluo324 积分:123派别:程序还不够完善,等会改好后上完整

16、版.名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 18 页 -等级:-来自:2009-10-17,09:38:15 资料邮件回复引用回复编辑删除【2 楼】andyluo324 积分:123派别:等级:-来自:每进入一个函数都有相关的打印信息,这样可以有利于查程序那里有问题./*-1.本程序主要为了实现以下功能:1)通过对 SPI 方式对 SD卡进行读与写 2)简单的 FAT操作 3)对写入的数据进行打印 2.编写日期:09.10.13 3.版本号:V1.0 4.作者:andyluo -*/#include /添加头文件#include#include#include#include#define uchar unsigned char/宏定义数据类型#define uint unsigned int /*-与指示灯有关的IO -*/sbit power=P04;/*-与 SD卡通信有关的IO -*/sbit SCL=P15;/时钟信号sbit CS=P16;/片选信号sbit SI=P17;/数据输入sbit SO=P33;/数据输出/错误码定义#define INIT

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号