10510|8

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SPI模式下对SD卡的操作 [复制链接]

参考文献: SD Specifications Part 1 Physical Layer Simplified Specification Version 3.01

STM32的SPI设备简介:
STM32F107VC有3个SPI设备,SPI控制器在输出数据的同时采样输入数据,使用相同时钟线。

Master设备写操作的同时,读入寄存器同时采样填充,每次也需要清空寄存器。
Master设备的读操作,实际上是通过写数据输出时钟序列,采样MISO的信号。

SD卡简介:
SD卡的技术规范经过几次升级,与最初版本已有很大不同,本文基于Ver 3.01讨论
从容量上分
 容量命名 简称 
 0G<容量<2GStandard Capacity SD Memory Card  SDSC或SD
 2G<容量<32GHigh Capacity SD Memory Card SDHC
 32G<容量<2TExtended Capacity SD Memory Card SDXC


SD卡支持SPI的Mode0和Mode3
SD卡支持50MHz总线,STM32的APB2总线最高72MHz,SPI分频½为36Mhz,理论上所有SD卡都可以正常操作,实际上一些低版本的卡缺乏稳定性

插入信号CD:
CD线是可选的信号线,没有卡时为高电位,有卡插入时CD为低电位

CD Waiting

while ((*gpiob_idr)&0x4000) {}

电位稳定延迟:
CS线为高的状态下输出若干时钟,延迟利于电位稳定

Init Stable

sd_cs(1);
//sending dummy data few times
for (ii=0; ii<0xF; ii++) {
sd_bytedata(0xFF);
}

SD卡的准备状态,初始化操作:
SD卡从上电到可读写状态需要一定序列命令的操作,这个过程包括选择SPI模式和判断卡的版本以及供电操作
SD规范中的流程图


查看本帖全部内容,请登录或者注册

run_simple_sd.zip

14.35 KB, 下载次数: 133

售价: 1 分芯积分  [记录]

Part_1_Physical_Layer_Simplified_Specification_Ver_3.01_Final_100518.pdf

1.13 MB, 下载次数: 264

此帖出自stm32/stm8论坛

最新回复

不错  详情 回复 发表于 2016-9-9 21:45
点赞 关注
个人签名http://sites.google.com/site/btvnlue/stm32
 

回复
举报

20

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

补完

CMD0
SD卡上电后使用CMD0进入SPI模式,CMD0的返回值是1字节的R1,R1应该为空闲0x01

CMD0

sd_cs(0);
sd_command(cmd, cc);
res=sd_response();
sd_cs(1);

while ((rtn!=0x01)

CMD8
版本2.0以上的SD卡支持CMD8命令,包括大部分SDHC的卡和所有SDXC卡,早期的SDHC卡有可能仍属于V1.0卡
命令返回值R7,第一字节为R1,Ver1.0的卡对R1的“非法命令”位2置位,Ver2.0以上卡应返回0x01

CMD8

rtn = sd_cmd8_version_check(&sdif);
if ((rtn&0x04)==0x04) {
rtn=sd_v1_process(&sdif);
} else {
rtn=sd_v2_process(&sdif);
}

ACMD41和CMD1
ACMD41是为卡供电命令,供电前卡的状态为空闲(idle),R1的返回值为0x01,供电后为动作状态(ready)
一些早期的卡认为ACMD41是非法命令,只能用MMC的CMD1命令供电

ACMD41 Ready

if (rtn == 0x01) {
while (rtn==0x01) {
rtn = sd_send_cond_acmd41_v1();
}
}

if ((rtn&0x04)==0x04) { // invalid command
rtn = 0x01;
while (rtn==0x01) {
rtn = sd_cmd1_mmc_ready();
}
}

CMD58
CMD58读取卡的状态,一个重要的标志位CCS,会影响到读写操作中地址数据的设定
CCS为1时为高版本卡,数据地址为页单位,512字节为一页
CCS为0时,地址为以字节为单位实际地址
CCS置位与否也取决于ACMD41中对HCS:30bit的置位请求

CMD58 CCS

rtn = sd_read_ocr_cmd58(sd_inf->rx.r3);
sd_inf->ccs = (sd_inf->rx.r3[0]>>6)&0x01;


CMD9
取得卡容量等信息,CSO寄存器,CSO是16个字节的结构体,加上2字节的CRC,应读取18字节的内容

Read CSO

sd_cs(0);
sd_command(cmd, cc);
rtn = sd_response();
if (rtn == 0x00) {
if(sd_data_token()==0xFE) {
sd_data(cso, 20);
} else {
rtn = 0xFF;
}
}
sd_cs(1);

卡的信息也有版本区别,需要分别处理

CSO Version

sd_inf->csd_version = (cso[0]>>6)&0x3;
if (sd_inf->csd_version==0x0) {
sd_inf->block = cso[5]&0xF;
sd_inf->unit = cso[6]&0x3;
sd_inf->unit <<= 8;
sd_inf->unit |= cso[7];
sd_inf->unit <<= 2;
sd_inf->unit |= (cso[8]&0xC0)>>6;
sd_inf->multi = (cso[9]&0x3);
sd_inf->multi <<= 1;
sd_inf->multi |= (cso[10]&0x80)>>7;
sd_inf->page = sd_inf->unit + 1;
sd_inf->page <<= (sd_inf->multi + 2);
sd_inf->size = sd_inf->page << sd_inf->block;
} else {
sd_inf->block = cso[5]&0xF;
sd_inf->unit = cso[7]&0x3F;
sd_inf->unit <<= 8;
sd_inf->unit |= cso[8];
sd_inf->unit <<= 8;
sd_inf->unit |= cso[9];
sd_inf->page = sd_inf->unit * 1024;
sd_inf->size = sd_inf->page << sd_inf->block;
}

CMD24 CMD17
CMD24写数据
CMD17读数据
SD的读写都要以页单位进行,无论是否是新版本。
老版本的地址设定也要从页的起始处,一般为512的倍数
数据块紧接在命令块的后面。
数据块长度515个字节,起始标志字节为0xFE,实际数据512字节,2字节CRC
CRC使用CRC-16算法,不计算时可以设置为0xFF
写操作之后要等待非忙信号,忙信号使MISO为低电位,接收数据一直为0


此帖出自stm32/stm8论坛
 
个人签名http://sites.google.com/site/btvnlue/stm32
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

补完

CMD17 Read Block

sd_cs(0);
sd_command(cmd, cc);
rtn = sd_response();
if (rtn==0x00) {
rtn = sd_data_token();
if(rtn==0xFE) {
for (cc=0; cc<512; cc++) {
data[cc] = 0xAA;
data[cc] = sd_bytedata(0xFF);
}
sd_bytedata(0xFF);
sd_bytedata(0xFF);
}
rtn=0;
}
sd_cs(1);

CMD24 Write Block

sd_cs(0);
sd_command(cmd, cc);
rtn = sd_response();
if (rtn==0x00) {
sd_bytedata(0xFF);
sd_bytedata(0xFE);
for (cc=0; cc<512; cc++) {
sd_bytedata(data[cc]);
}
sd_bytedata(0xFF);
sd_bytedata(0xFF);
rtn = sd_response();
cc = 0;
while (rtn == 0x00) { //R1b busy
rtn = sd_bytedata(0xFF);
cc++;
}

}
sd_cs(1);

此帖出自stm32/stm8论坛
 
个人签名http://sites.google.com/site/btvnlue/stm32
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 

STM32

能给一份你的完整程序吗?最近也在用STM32的SPI模式下操作SD卡  还是一头雾水 不知从哪下手 能参考一下你的程序吗? 谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

5
 

STM32

 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 qlm1006 的帖子

请到 http://sites.google.com/site/btvnlue/stm32 搜索所需源码
此帖出自stm32/stm8论坛
 
个人签名http://sites.google.com/site/btvnlue/stm32
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

7
 
楼主你好,你做的spi模式下对sd卡的写入速度是多少?能否达到1mb/s?
此帖出自stm32/stm8论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(中级)

8
 
给的源码下载地址已经过期了
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
不错
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表