AVRSD卡基础原理及读写经典c程序

上传人:飞*** 文档编号:39676678 上传时间:2018-05-18 格式:PDF 页数:17 大小:964.07KB
返回 下载 相关 举报
AVRSD卡基础原理及读写经典c程序_第1页
第1页 / 共17页
AVRSD卡基础原理及读写经典c程序_第2页
第2页 / 共17页
AVRSD卡基础原理及读写经典c程序_第3页
第3页 / 共17页
AVRSD卡基础原理及读写经典c程序_第4页
第4页 / 共17页
AVRSD卡基础原理及读写经典c程序_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《AVRSD卡基础原理及读写经典c程序》由会员分享,可在线阅读,更多相关《AVRSD卡基础原理及读写经典c程序(17页珍藏版)》请在金锄头文库上搜索。

1、1、简介:SD卡( Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD 卡允许在两种模式下工作,即SD 模式和 SPI 模式,本系统采用SPI 模式。本小节仅简要介绍在SPI 模式下, STM32 处理器如何读写 SD 卡,如果读者如希望详细了解SD 卡,可以参考相关资料。SD 卡内部结构及引脚如下图所示2、SD 卡管脚图:3、SPI 模式下 SD 各管脚名称为:注:一般 SD 有两种模式: SD 模式和 SPI 模式,管脚定义如下:(A)、 SD MODE 1、CD/DATA3 2 、CMD 3、VSS1

2、 4、VDD 5、CLK 6、VSS2 7、DATA0 8、DATA1 9 、DATA2 (B)、 SPI MODE 1、CS 2、DI 3 、VSS 4、VDD 5 、SCLK 6、VSS2 7、DO 8、RSV 9、RSV SD 卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在025MHz 之间变化, SD 卡的总线管理器可以不受任何限制的自由产生025MHz 的频率;CMD :双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;DAT0 3:数据线,数据可以从卡传

3、向主机也可以从主机传向卡。SD 卡以命令形式来控制SD卡的读写等操作。可根据命令对多块或单块进行读写操作。在 SPI 模式下其命令由6 个字节构成,其中高位在前。SD 卡命令的格式如表1 所示,其中相关参数可以查阅SD 卡规范。4、MicroSD 卡管脚图:5、MicroSD 卡管脚名称:SD 卡与 MicroSD 卡仅仅是封装上的不同,MicroSD 卡更小,大小上和一个SIM卡差不多,但是协议与SD卡相同。一般我们用单片机操作SD 卡时,都不需要对FAT 分区表信息做处理,原因如下:1 )、操作 FAT 分区表要增加程序代码量、增加SRAM的消耗,对于便携应用来说代码大小和占用SRAM的多

4、少至关重要。2 )、即使我们对FAT 分区表不做任何了解,实际上我们一样可以向SD 卡上写入数据,这就表明使用FAT对我们做数据存储应用来说如同鸡肋。3 )、耗费大量经历和时间去了解FAT 分区表对于我们做嵌入式软件开发的人来说有些得不偿失。4 )、SD 卡支持两种操作模式,SD 模式和 SPI 模式, SPI 模式做 SD 数据操作时根本不需要知道FAT,这时候 SD 卡对于我们来说实际上就是个大的、快速的、方便的、容量可变的外部存储器。基于以上原因,一般情况下对SD卡的操作只需要了解SPI 通讯就可以了,而现在大部分单片机都有SPI 接口,那么操作SD 卡易如反掌。以下是做 SD 卡试验时

5、使用的电路图:SD_CS/ 连接到单片机的片选SD管脚,只有单片机设置SD_CS/为低电平时才可以操作 SD 卡。MOSI 连接单片机SPI 总线的 MOSI 管脚( SPI 数据输入),单片机从这个管脚读取 SD 卡内的数据。MISO 连接单片机SPI 总线的 MISO 管脚( SPI 数据输出)、单片机通过这个管脚向 SD 卡内写入数据。SCK 连接单片机SPI 总线的 SCK(SPI 时钟)SD 管脚实际上在SD 卡内部连接到了GND,当 SD插座上没插入SD 卡时,单片机从这个管脚能读到高电平(前提是使用单片机内部上拉输入,或者外部增加一个上拉电阻),一旦插入SD 卡,这个管脚就变成低

6、电平,这个功能用来检测是否插入SD 卡。RSV1 和 RSV2 是保留功能管脚,不需要操作。MicroSD 卡的连接和SD卡大同小异,只是MicroSD 卡比 SD卡少一个 GND 管脚,所以不能使用上面做的这种插入卡的检测,实际上现在很多SD 卡/MicroSD 卡插座都有插入检测管脚,当然,一分钱一分货,价格上当然也要贵一些顺便提一下,普通SD卡插座最多5 块钱。SPI 命令格式以下是一个简单的测试SD 卡读写的程序,程序是基于Atmega128 单片机编写的,对于 Atmega 的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。sd.h /* /SPI 各线所占用的端口#de

7、fine SD_SS PB6 #define SD_SCK PB1 #define SD_MOSI PB2 #define SD_MISO PB3 /* #define SD_DDR DDRB #define SD_PORT PORTB #define SD_PIN PINB #define SD_SS_H SD_PORT |= (124); SPI_TransferByte(address16); SPI_TransferByte(address8); SPI_TransferByte(address); SPI_TransferByte(0xFF); SPI_TransferByte(0x

8、FF); do tmp = SPI_TransferByte(0xFF); /发送 8 个时钟接受最后一个字节retry+; while(tmp=0xff) return(tmp); /* * / 写一个扇区 (512Byte) to MMC/SD-Card / 如果写完成返回TRUE unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer) /* * unsigned char temp; unsigned inti; SPI_TransferByte(0xFF); /延迟 8 个时钟SD_Enable()

9、; /开片选temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr9); /发送写扇区命令if(temp != 0x00) SD_Disable(); return(temp); SPI_TransferByte(0xFF); SPI_TransferByte(0xFF); SPI_TransferByte(0xFE); for (i=0;i512;i+) SPI_TransferByte(*Buffer+); /发送 512 字节数据 /CRC-Byte SPI_TransferByte(0xFF); /Dummy CRC SPI_TransferByte

10、(0xFF); /CRC Code temp = SPI_TransferByte(0xFF); /读 SD卡运行响应if(temp return(WRITE_BLOCK_ERROR); /返回错误 while (SPI_TransferByte(0xFF) != 0xFF); SD_Disable(); return(TRUE); /返回成功 /* * / 读 512 字节 from MMC/SD-Card / 如果成功返回TRUE unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer) /* * unsi

11、gned char temp; unsigned inti; unsigned char data; SPI_TransferByte(0xff); MMC_Enable(); temp = Write_Command_SD(SD_READ_BLOCK,addr9);/发送读扇区命令if(temp != 0x00) SD_Disable(); return(READ_BLOCK_ERROR); /返回错误号 while(SPI_TransferByte(0xff) != 0xfe); for(i=0;i512;i+) data = SPI_TransferByte(0xff); /存数据*Bu

12、ffer+=data; SPI_TransferByte(0xff); /读 CRC码SPI_TransferByte(0xff); /读 CRC码SD_Disable(); return(TRUE); /返回成功 /* * / 查找数据开始标志(预设DATASTART)根据实际需要删改/* * unsigned long SD_find(void) unsigned long tmp=“400“; unsigned char data512; do SD_read_sector(tmp,data); /从 0 扇区开始查找tmp+; /查找 DATASTART while(!(data0=D) return tmp; /返回开始标志的下一个扇区 /* * / 发送一个字节/* * unsigned char SPI_TransferByte(unsigned char byte) SPDR = byte; while (!(SP

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

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