




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、 简介:sd卡(secure digital memory card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,sd卡允许在两种模式下工作,即sd模式和spi模式,本 系统采用spi模式。本小节仅简要介绍在spi模式下,stm32处理器如何读写sd卡,如果读者如希望详细了解sd卡,可以参考相关资料。sd 卡内部结构及引脚如下图所示:sd卡内部图.jpg2、sd卡管脚图:sd卡图.jpg3、spi模式下sd各管脚名称为:sd 卡:spi模式下sd各管脚名称 为.jpg注: 一般sd有两种模式:sd模式和spi模式,管脚定义如下:(a)、sd mode 1
2、、cd/data3 2、cmd 3、vss1 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、rsvsd 卡主要引脚和功能为:clk:时钟信号,每个时钟周期传输一个命令或数据位,频率可在025mhz之间变化,sd卡的总线管理器可以不受任何限制的自由产生025mhz 的频率;cmd:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单 卡或所有卡;dat03
3、:数据线,数据可以从卡传向主机也可以从主机传向卡。sd卡以命令形式来控制sd卡的读写等操作。可根据命令对多块或单块进行读写操作。在spi模式下其命令由6个字节构成,其中高位在前。sd卡命令 的格式如表1所示,其中相关参数可以查阅sd卡规范。4、microsd卡管脚图:microsd卡管脚图.jpg5、microsd卡管脚名称:microsd卡管脚名 称.jpgsd 卡与microsd卡仅仅是封装上的不同,microsd卡更小,大小上和一个sim卡差不多,但是协议与sd卡相同。一般我们用单片机操作sd 卡时,都不需要对fat分区表信息做处理,原因如下:1)、操作fat分区表要增加程序代码量、增加
4、sram的消耗,对于便携应用来说代码大小和 占用sram的多少至关重要。2)、即使我们对fat分区表不做任何了解,实际上我们一样可以向sd卡上写入数据,这就表明使用fat对我们做数 据存储应用来说如同鸡肋。3)、耗费大量经历和时间去了解fat分区表对于我们做嵌入式软件开发的人来说有些得不偿失。4)、sd卡支持 两种操作模式,sd模式和spi模式,spi模式做sd数据操作时根本不需要知道fat,这时候sd卡对于我们来说实际上就是个大的、快速的、方便的、容 量可变的外部存储器。基于以上原因,一般情况下对sd卡的操作只需要了解spi通讯就可以了,而现在大部分单片机都有spi接口,那么操作sd卡 易如
5、反掌。以下是做sd卡试验时使用的电路图:sd卡试验时使用的电路 图.jpgsd_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命令格式byte 1byte2-5byte 6765 031 07001commandcommand argumentcrc1以下是一个简单的测试sd卡读 写的程序,程序是基于atmega128单片机编写的,对于atmega的其他
7、单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。sd.h/*/spi 各线所占用的端口#define 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 |= (1#define sdss_l sd_port &= (1#define sd_sck_h sd_port |= (1#define sd_sck_l sd_port &= (1#
8、define sd_mosi_h sd_port |= (1#define sd_mosi_l sd_port &= (1#define sd_miso_in (sd_pin&(1/-/ 错误号/-#define init_cmd0_error 0xff#define init_cmd1_error 0xfe#define write_block_error 0xfd#define read_block_error 0xfc#define true 0x01/- / mmc/sd 命令(命令号从40开始,只列出基本命令,并没有都使用)/-#define sd_reset 0x40 + 0 #d
9、efine sd_init 0x40 + 1#define sd_read_csd 0x40 + 9#define sd_read_cid 0x40 + 10#define sd_stop_transmission 0x40 + 12#define sd_send_status 0x40 + 13#define sd_set_blocklen 0x40 + 16#define sd_read_block 0x40 + 17#define sd_read_multi_block 0x40 + 18#define sd_write_block 0x40 + 24#define sd_write_m
10、ulti_block 0x40 + 25/片选关(mmc/sd-card invalid)#define sd_disable() sd_ss_h/片选开 (mmc/sd-card active)#define sd_enable() sd_ss_lsd_test.c/*/icc-avr application builder : 03-5-20 8:39:11/ target : m128/ crystal: 3.6864mhz#include#include#include sd.hvoid uart0_init(void);void putchar(unsigned char conte
11、nt);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_
12、command_sd(unsigned char cmd,unsigned long address);unsigned long sd_find(void);/*/ 串口调试程序/*void uart0_init(void)ucsr0b = 0x00; /disable while setting baud rateucsr0a = 0x00;ucsr0c = 0x06; / 00000110 uart0设置为异步模式、无奇偶校验、1位停止位、8位数据位ubrr0l = 0x17; /set baud rate loubrr0h = 0x00; /set baud rate hi 设置uar
13、t0口通信速率9600ucsr0b = 0x18;void putchar(unsigned char content)while(!(ucsr0a & (1 udre0); /* 判断上次发送有没有完成 */udr0 = content; /* 发送数据 */void putstr(unsigned char *s)while(*s)putchar(*s);s+;/*/ 端口初始化void sd_port_init(void)/*sd_port |= (1sd_ddr |= (1sd_ddr &= (1/*/ 初始化 mmc/sd 卡为spi模式unsigned char sd_init(v
14、oid)/*unsigned char retry,temp;unsigned char i;spcr=0x53; /设定spi为128分频,慢速进行初始化spsr=0x00;for (i=0;i24);spi_transferbyte(address16);spi_transferbyte(address8);spi_transferbyte(address);spi_transferbyte(0xff);spi_transferbyte(0xff);dotmp = spi_transferbyte(0xff); /发送8个时钟接受最后一个字节 retry+;while(tmp=0xff)&
15、(retry8);return(tmp);/*/ 写一个扇区(512byte) to mmc/sd-card/如果写完成返回trueunsigned char sd_write_sector(unsigned long addr,unsigned char *buffer)/*unsigned char temp;unsigned int i;spi_transferbyte(0xff); /延迟8个时钟 sd_enable(); /开片选temp = write_command_mmc(mmc_write_block,addr9); /发送写扇区命令if(temp != 0x00)sd_di
16、sable();return(temp);spi_transferbyte(0xff);spi_transferbyte(0xff);spi_transferbyte(0xfe);for (i=0;i512;i+)spi_transferbyte(*buffer+); /发送512字节数据/crc-bytespi_transferbyte(0xff); /dummy crcspi_transferbyte(0xff); /crc codetemp = spi_transferbyte(0xff); /读sd卡运行响应if(temp & 0x1f)!=0x05) /如果最后4位为0101,为操作
17、成功。否则为操作失败。sd_disable();return(write_block_error); /返回错误while (spi_transferbyte(0xff) != 0xff);sd_disable();return(true); /返回成功 /*/ 读512字节 from mmc/sd-card/如果成功返回trueunsigned char sd_read_sector(unsigned long addr,unsigned char *buffer)/*unsigned char temp;unsigned int i;unsigned char data;spi_trans
18、ferbyte(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); /存数据 *buffer+=data;spi_transferbyte(0xff); /读crc码spi_transferbyte(0xff);
19、 /读crc码sd_disable();return(true); /返回成功/*/ 查找数据开始标志(预设datastart)根据实际需要删改/*unsigned long sd_find(void) unsigned long tmp=400;unsigned char data512;dosd_read_sector(tmp,data); /从0扇区开始查找tmp+; /查找datastart while(!(data0=d)&(data1=a)&(data2=t)&(data3=a)&(data4=s)&(data5=t)&(data6=a)&(data7=r)&(data8=t);r
20、eturn tmp; /返回开始标志的下一个扇区 /*/ 发送一个字节/*unsigned char spi_transferbyte(unsigned char byte)spdr = byte;while (!(spsr & 0x80); /检测线路是否空闲 return spdr;/*/ 主程序例子/*void main(void) unsigned long temp;unsigned char data512;unsigned char data2512=sssssssssssssssssssssssss;unsigned char comm1=rnhello worldrn;uns
21、igned char comm2=rnsd_init okrn;uart0_init();sd_port_init(); /端口初始化if(sd_init()= 0x01) /sd卡初始化,并读取返回值putstr(comm2);temp=sd_find(); /查找datastart数据开始标志,返回下一扇区地址sd_read_sector(1001,data); /读取temp地址的512字节数据,512字节数据存入data数组putstr(data); sd_write_sector(temp,data2); /将data2数组512字节数据写入temp扇区测试程序很简单,仅仅是做了一下
22、读写sd卡的测试。关于sd卡的几点注意事项。1、无论我们愿意不愿意,sd卡每次读写数据的最小单位是1个扇区,即512个字节。2、sd卡与单片机连接的 spi总线不能太长,要尽量短。这样的好处是速度可以更快,也不容易出错。3、虽然我们并不关心fat文件表,但是我们仍然要关心sd卡的存储结构,如果我们不想使用pc机来读取保存在sd卡上的数据那我们就不用关心sd存储结构了。但,作为一个大容量的可移动存储设备,不能用pc机来读取是个很大的遗憾,我解决这个遗憾的方法如下:3-1、因为我不了解fat复杂的结构,所以我做的程序没法去按照fat表的各项功能来进行创建文件、删除文件、创建目录等等操作。3-2、虽然我们的单片机不能创建文件,但是pc机是可以创建文件的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年快消品行业包装设计创新与环保理念融合报告
- 人品道德考试题及答案
- 透水混泥施工合同范本
- 物流仓储合同补充协议
- 泉州悦动购车合同范本
- 港口数字化转型升级-洞察及研究
- 自助棋牌加盟合同协议
- 理财公司管理合同范本
- 玉米基地制种合同范本
- 电脑包年维修合同范本
- 2025至2030中国原果浆行业项目调研及市场前景预测评估报告
- 商场装修合同
- 2025年版住宅房屋租赁合同范本下载
- 2-5跨学科实践制作隔音房间模型八年级物理学案人教版
- 房屋学位租赁合同协议书
- 2025年高速公路标杆企业组织效能报告
- 2025年秋新人教版数学三年级上册全册教案
- 政府装监控合同范本
- 重症凝血病标准化评估中国专家共识(2025版)
- 新交际英语(2024)二年级上册全册核心素养教案
- 劳动关系迁移协议书范本
评论
0/150
提交评论