SD卡原理及读写程序

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

SD_TEST.C //****************************************************************************************/ //ICC-AVR application builder : 03-5-20 8:39:11 // Target : M128 // Crystal: 3.6864Mhz
SD 卡内部图.JPG
2、SD 卡管脚图:
SD 卡图.JPG
3、SPI 模式下 SD 各管脚名称为: sd 卡:
SPI 模式下 SD 各管脚名称 为.JPG
注: 一般 SD 有两种模式:SD 模式和 SPI 模式,管脚定义如下: (A)、SD MODE 1、CD/DATA3 8、DATA1 9、DATA2 (B) 、 SPI MODE 1、 CS RSV 9、RSV 2、 DI 3、 VSS 4、 VDD 5、 SCLK 6、 VSS2 7、 DO 8、 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA0
Byte 1 Byte2-5 Byte 6
7
6
5
0
31
0
7
0
0
1
Command
Command Argument
CRC
1
以下是一个简单的测试 SD 卡读 写的程序, 程序是基于 Atmega128 单片机编写的, 对于 Atmega 的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。 sd.h //****************************************************************** //SPI 各线所占用的端口 #define SD_SS #define SD_SCK #define SD_MOSI #define SD_MISO PB6 PB1 PB2 PB3
1、 简介: SD 卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面 的需求而设计的一种新型存储器件,SD 卡允许在两种模式下工作,即 SD 模式和 SPI 模式,本 系统采用 SPI 模式。本小节仅简要介绍在 SPI 模式下,STM32 处理器如何读写 SD 卡,如果读 者如希望详细了解 SD 卡,可以参考相关资料。 SD 卡内部结构及引脚如下图所示:
以下是做 SD 卡试验时使用的电路图:
SΒιβλιοθήκη Baidu 卡试验时使用的电路 图.JPG
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 卡,这个管脚就变成低电平,这个功能用来检测是否 插入 SD 卡。 RSV1 和 RSV2 是保留功能管脚,不需要操作。 MicroSD 卡的连接和 SD 卡大同小异,只是 MicroSD 卡比 SD 卡少 一个 GND 管脚,所以不能 使用上面做的这种插入卡的检测,实际上现在很多 SD 卡/MicroSD 卡插座都有插入检测管脚, 当然,一分钱一分货,价格上当然 也要贵一些 顺便提一下,普通 SD 卡插座最多 5 块钱。 SPI 命令格式
#include #include #include 'sd.h' void uart0_init(void); void putchar(unsigned char content); void putstr(unsigned char *s); void SD_Port_Init(void); unsigned char SD_Init(void); unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer); unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer); unsigned char SPI_TransferByte(unsigned char byte); unsigned char Write_Command_SD(unsigned char cmd,unsigned long address); unsigned long SD_find(void); //************************************************************************** // 串口调试程序 //************************************************************************** void uart0_init(void) { UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; // 00000110 UART0 设置为异步模式、无奇偶校验、1 位停止位、8 位数据位 UBRR0L = 0x17; //set baud rate lo UBRR0H = 0x00; //set baud rate hi 设置 UART0 口通信速率 9600 UCSR0B = 0x18; } void putchar(unsigned char content) {
4、MicroSD 卡管脚图:
MicroSD 卡管脚图.JPG
5、MicroSD 卡管脚名称:
MicroSD 卡管脚名 称.JPG
SD 卡与 MicroSD 卡仅仅是封装上的不同,MicroSD 卡更小,大小上和一个 SIM 卡差不多,但 是协议与 SD 卡相同。 一般我们用单片机操作 SD 卡时,都不需要对 FAT 分区表信息做处理,原因如下:
SD_PORT |= (1< SD_PORT &= ~(1< SD_PORT |= (1< SD_PORT &= ~(1< SD_PORT |= (1< SD_PORT &= ~(1<
#define SD_MISO_IN
(SD_PIN&(1<
//------------------------------------------------------------// 错误号 //------------------------------------------------------------#define INIT_CMD0_ERROR #define INIT_CMD1_ERROR #define WRITE_BLOCK_ERROR #define READ_BLOCK_ERROR #define TRUE 0x01 0xFF 0xFE 0xFD 0xFC
1) 、 操作 FAT 分区表要增加程序代码量、 增加 SRAM 的消耗, 对于便携应用来说代码大小和 占 用 SRAM 的多少至关重要。 2)、即使我们对 FAT 分区表不做任何了解,实际上我们一样可以向 SD 卡上写入数据,这就表 明使用 FAT 对我们做数 据存储应用来说如同鸡肋。 3) 、 耗费大量经历和时间去了解 FAT 分区表对于我们做嵌入式软件开发的人来说有些得不偿失。 4)、SD 卡支持 两种操作模式,SD 模式和 SPI 模式,SPI 模式做 SD 数据操作时根本不需要 知道 FAT,这时候 SD 卡对于我们来说实际上就是个大的、快速的、方便的、容 量可变的外部 存储器。 基于以上原因, 一般情况下对 SD 卡的操作只需要了解 SPI 通讯就可以了, 而现在大部分单片机 都有 SPI 接口,那么操作 SD 卡 易如反掌。
while(!(UCSR0A & (1 << UDRE0))); /* UDR0 = content; /* 发送数据 */
判断上次发送有没有完成
*/
} void putstr(unsigned char *s) {
while(*s) { putchar(*s); s++; }
}
//**************************************************************************** // 端口初始化 void SD_Port_Init(void) //**************************************************************************** { SD_PORT SD_DDR SD_DDR } |= (1<< |= (1<<< &= ~(1<
//**************************************************************************** // 初始化 MMC/SD 卡为 SPI 模式 unsigned char SD_Init(void) //**************************************************************************** { unsigned char retry,temp; unsigned char i;
//******************************************************************
#define SD_DDR #define SD_PORT #define SD_PIN
DDRB PORTB PINB
#define SD_SS_H #define SDSS_L #define SD_SCK_H #define SD_SCK_L #define SD_MOSI_H #define SD_MOSI_L
//------------------------------------------------------------// MMC/SD 命令(命令号从 40 开始,只列出基本命令,并没有都使用) //------------------------------------------------------------#define SD_RESET #define SD_INIT #define SD_READ_CSD #define SD_READ_CID 0x40 + 0 0x40 + 1 0x40 + 9 0x40 + 10 0x40 + 12
#define SD_STOP_TRANSMISSION #define SD_SEND_STATUS #define SD_SET_BLOCKLEN #define SD_READ_BLOCK #define SD_READ_MULTI_BLOCK #define SD_WRITE_BLOCK #define SD_WRITE_MULTI_BLOCK
0x40 + 13 0x40 + 16 0x40 + 17 0x40 + 18 0x40 + 24 0x40 + 25
//片选关(MMC/SD-Card Invalid) #define SD_Disable() SD_SS_H
//片选开 (MMC/SD-Card Active) #define SD_Enable() SD_SS_L
SD 卡主要引脚和功能为: CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在 0~25MHz 之间变化,SD 卡 的总线管理器可以不受任何限制的自由产生 0~25MHz 的频率; CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址, 也可以是到所有卡;回复是对之前命令的回答,回复可以来自单 卡或所有卡; DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。 SD 卡以命令形式来控制 SD 卡的读写等操作。可根据命令对多块或单块进行读写操作。在 SPI 模式下其命令由 6 个字节构成,其中高位在前。SD 卡命令 的格式如表 1 所示,其中相关参数 可以查阅 SD 卡规范。
相关文档
最新文档