搜索
bottom↓
回复: 49

原来 SDHC 只用3个命令就可以完成初始化~~~~~~~~

[复制链接]

出0入0汤圆

发表于 2009-11-9 16:45:26 | 显示全部楼层 |阅读模式
我发现 SDHC 只用3个命令就可以完成初始化~~~~~~~~

(1)CMD0---->00 --->(2)CMD8--->01 --->(3)CMD1 --->00
                        |  sdhc=1  
                        |
                         ---->05
                           sdhc=0

SDHC只是区别是高速卡还是低速卡,高速卡的时候,CMD16等读写扇区命令是直接输入扇区号码,低速卡时候输入的是扇区号*512

好简单吧~~~~~~~

代码就不用贴了,目前测试SD,MMC卡基本都过了,SDHC卡仅测试了APACER 16G 和KINGSTONE 8G 以及SANDISK的4G ~~~~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-11-9 19:16:58 | 显示全部楼层
哈哈,我先顶下。

1、楼主是SPI的接口模式吗?
2、初始化后就能读写了吧?

打扰楼主了,能解答下吗?

出0入0汤圆

发表于 2009-11-9 21:10:32 | 显示全部楼层
学习.

出0入0汤圆

发表于 2009-11-9 22:05:40 | 显示全部楼层
请问SDHC还支持SPI模式么,还是只支持SDIO模式

另外请问您侧过写512个字节的时间么,我用一个2G的micor SD卡写512个字节居然用了将近8ms(SPI模式,4Mbit/s)

主要消耗都在写SD卡的时间上面了(改变SPI速度和内核速度都没有什么太大的影响)

感谢

出0入0汤圆

 楼主| 发表于 2009-11-9 23:41:06 | 显示全部楼层
我只做了SPI模式的,初始化直接用高速 20M,我开始时候也是用低速的,后来发现竟然高速下也可以,次数大概是1000次
(实际计算过大概400次@16MHZ,600次@20MHZ就可以完成CMD0)

速度嘛,没有用到DMA,读写1024个扇区大概18秒这样~~~ 而且用了很多FOR语句,我用FASTAVR,如果是C的话,估计还要快~~~~~

出0入0汤圆

 楼主| 发表于 2009-11-9 23:41:49 | 显示全部楼层
完成CMD1之后,按照别人的代码继续执行即可,可以关CRC,可以读写扇区了~~~

出0入0汤圆

发表于 2009-11-10 00:03:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-10 00:09:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-10 10:24:55 | 显示全部楼层
“读写1024个扇区大概18秒这样”

大概一个扇区18毫秒,比我的还慢呀。

个人感觉和数据传输模式没什么关系,因为主要的时间耽搁在了SD写盘上面。

你说的20M和16M指的是什么?MCU频率还是SPI 的速率。

aaa1982

出0入0汤圆

 楼主| 发表于 2009-11-10 11:09:40 | 显示全部楼层
是的,SPI的速率,不过我也说了,我不是用DMA传输的,具体情况优化代码后才知道,

我现在是用FOR和WHILE来读取数据的,而且还是BASIC语言,如果是C的话,速度还要快~~~~~

我说的只是简化初始化程序而已,适合资源紧张的情况~~~~~

出0入0汤圆

发表于 2009-11-10 11:27:04 | 显示全部楼层
aaa1982

你有没有测试过你读SD的速度,读512字节时间是多少?
我现在读512字节,6ms(SPI模式,4Mbit/s)

出0入0汤圆

发表于 2009-11-10 11:51:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-10 12:09:52 | 显示全部楼层
HZZCL

我和你读数据的速度差不多,也是6ms左右。(4Mbit/s)
你写数据多少时间,

而且我发现了一个比较搞笑的现象。

fat16文件系统下面先写文件信息,再写数据,都是一个扇区的操作,

居然写文件信息的时候waitbusy的时间比写文件的waitbusy时间长很多,用同一个变量作为标准,一个是32,一个是92.

没想清楚这是为什么?难道和写扇区的顺序相关,先写的waitbusy时间长???

欢迎各位踊跃发言,谢谢

出0入0汤圆

发表于 2009-11-10 13:03:33 | 显示全部楼层
我现在没有测试写数据,现在就发现SPI利用率太低了。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3693785&bbs_page_no=1&bbs_id=1000

出0入0汤圆

发表于 2009-11-10 14:32:06 | 显示全部楼层
看了一下,感觉你给的图片和spi没太大关系

一般spi时钟都是系统时钟的分频,具体几分频要看具体的器件。如果字节中间不需要延时,4Mbit/s完全可以到500kbyte/s。

我们来算一下,我往SD卡里面通过spi写数据的时候就基本上一个扇区的数据中间没有延时。这样也就需要1ms多一点点。

其余的时间除了等待data response 就是等待wait busy了。

总共耗去了10ms左右,而且还在不同的时候有不同的等待时间,这一点没想明白。

出0入0汤圆

发表于 2009-11-10 14:45:49 | 显示全部楼层
aaa1982
你可以用示波器测下,SPI的CLK是不是有停止的时候。

出0入0汤圆

 楼主| 发表于 2009-11-10 17:59:16 | 显示全部楼层
如果需要高速读写的,肯定要DMA~~~

读的话,我是先发CMD17,然后一直发0XFF,直到收到0XFE(大概循环3-12次之内,看SD卡的牌子),然后开始读取0-511个字节。

出0入0汤圆

发表于 2009-11-10 21:07:15 | 显示全部楼层
HZZCL :

看了一下,确实有停止的时候,现在还没有弄清楚是不是SPI控制器本身的限制还是程序哪里的问题。我用的luminarylm3s5749,你用的哪家的?

看了看datasheet好像SSI章节没有提到相关的时间常数,你看到哪里有对那段字节之间的间隔的定义了么?


90999
DMA只是让CPU在传输数据的时候少负担,本质上提高不了什么速度。对SD更是如此,ns级别的寄存器赋值和ms级别的SD卡读写,就算把给SPI寄存器赋值的时间都省掉,对于SD的读写时间来说也没什么太大的意义。

出0入0汤圆

发表于 2009-11-10 21:36:43 | 显示全部楼层
我现在也就困在这个地方,估计是SPI控制器的问题。
本来是想用SPI跑到1M byte/s,现在看来用SPI模式是不行了,考虑下SD模式。

出0入0汤圆

发表于 2009-11-10 22:38:22 | 显示全部楼层
官方文档有初始化流程,建议照这个初始化

出0入0汤圆

发表于 2009-11-11 16:22:17 | 显示全部楼层
初始化已完成,缺的就是速度不够快。

出0入0汤圆

 楼主| 发表于 2009-11-12 08:23:14 | 显示全部楼层
实际测试了下,读取也就320kb/s上下~~~~~

出0入0汤圆

 楼主| 发表于 2009-11-12 08:23:37 | 显示全部楼层
WhatsThat

麻烦,懂么~~~~~~

出0入0汤圆

发表于 2009-11-12 20:07:25 | 显示全部楼层
如果读取也就320kb/s上下,那速度不快.我的现在读取是420k byte/s,SPI模式.

出0入0汤圆

发表于 2009-11-14 14:18:09 | 显示全部楼层
HZZCL

lm3s在spi的时候每个字节要隔两个spi时钟,这么算最多在4Mbit/s的时候可以做到400k,50M的时钟速度,基本上指令开销就可以忽略了。

你用的时哪个片子上面的spi控制器,420k是多大spi时钟下面的。


提高mcu速度以后经常发现连续之行命令不好使了,还得手动延长命令之间的间隔,看了一下sd spec,没找到命令之间的间隔底线的数据,

你是怎么做的?

aaa1982

出0入0汤圆

发表于 2009-11-14 19:06:31 | 显示全部楼层
我用的MCU为ATMEGA168-20AU,SPI的clk为10M bit/s,平均读取是420k byte/s.

出0入0汤圆

发表于 2009-11-14 20:06:56 | 显示全部楼层
SPI应该不会间隔那个么长,你怎么10M才420k


luminary的spi控制器就是间隔2个spi周期


(原文件名:示波器图片1.jpg)

出0入0汤圆

发表于 2009-11-19 16:40:21 | 显示全部楼层
看看我的波形
1为SPI数据口,2为SPI时钟

(原文件名:新建文件6.JPG)

出0入0汤圆

发表于 2009-11-20 23:35:47 | 显示全部楼层
我用的FPGA还是4线的SD模式读,也才10Mbit/s不到..............25MHz的时钟。今天太晚了,明天我发图。

出0入0汤圆

发表于 2010-2-22 17:04:23 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-3-17 14:39:26 | 显示全部楼层
发现一个BUG, 有些SD卡误识别为SDHC,需要添加CMD9读16个SD,然后再判断

批量读请用CMD18

出0入0汤圆

发表于 2010-3-22 10:08:30 | 显示全部楼层
请问楼主你读SD卡的速度达到420K BYTE/S,是带文件系统么?我用FATFS读1M的文件需要10s,速度提高不上了。SPI时钟有14M。

出0入0汤圆

 楼主| 发表于 2010-3-28 18:07:42 | 显示全部楼层
不带系统跑420@16mhz, 带FATFS的,跑10MB大概29-30秒,约300KB/S@15MHZ

出0入0汤圆

 楼主| 发表于 2010-3-28 18:10:01 | 显示全部楼层
如果上16MHZ就出现错误了.....

出0入20汤圆

发表于 2010-3-28 18:43:25 | 显示全部楼层
SPI模式不可能达到很高的速度.CLASS 6的卡,如果使用SD模式的话,速度会快很多.

出0入50汤圆

发表于 2010-5-21 19:51:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-20 09:48:39 | 显示全部楼层
回复【楼主位】90999 张耀扬
我发现 sdhc 只用3个命令就可以完成初始化~~~~~~~~
(1)cmd0---->00 --->(2)cmd8--->01 --->(3)cmd1 --->00
                        |  sdhc=1   
                        |
                         ---->05
                           sdhc=0
sdhc只是区别是高速卡还是低速卡,高速卡的时候,cmd16等读写扇区命令是直接输入扇区号码,低速卡时候输入的是扇区号*512
好简单吧~~~~~~~
代码就不用贴了,目前测试sd,mmc卡基本都过了,sdhc卡仅测试了apacer 16g 和kingstone 8g 以及sandisk的4g ~~~~~
-----------------------------------------------------------------------

小弟正在做SDHC卡,新手,能不能发个程序,我用的是SANDISK 4G的卡

出0入0汤圆

发表于 2010-12-20 10:24:00 | 显示全部楼层
mark

出50入0汤圆

发表于 2010-12-20 11:20:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-22 16:36:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-6 12:06:45 | 显示全部楼层
SD卡速度 记号

出0入0汤圆

发表于 2011-6-10 17:23:07 | 显示全部楼层
回复【34楼】wenming  老王
spi模式不可能达到很高的速度.class 6的卡,如果使用sd模式的话,速度会快很多.
-----------------------------------------------------------------------

对,官方文档说了,SPI模式的话无视Class等级,只能当class0来用 OGM

出0入0汤圆

发表于 2011-7-22 11:32:47 | 显示全部楼层
期待源代码,换了批卡是高速的以前的程序需要重写

出0入0汤圆

发表于 2011-7-22 14:04:29 | 显示全部楼层
问一下,一个扇区读写6ms,这个6ms是怎样测量的,要用什么工具?

出0入0汤圆

 楼主| 发表于 2011-7-22 14:21:39 | 显示全部楼层
回复【43楼】xiachucheng  
问一下,一个扇区读写6ms,这个6ms是怎样测量的,要用什么工具?

-----------------------------------------------------------------------

IO口输出啊,一个数字示波器


写过SD卡驱动的,就知道CMD0,CMD1,CMD8,CMD9,CMD17,CMD28.........

所以不要问代码,随便找个代码来改改就可以了。

出0入0汤圆

发表于 2011-8-1 16:21:00 | 显示全部楼层
我也在做SDHC 模式,CM0  但是我时钟频率 不敢太高,如果太高,就算在初始化中1000次写CM0,也返回的是255的值,在弱弱问下SD 卡的CM0返回的是01 , 而SDHC的CM0返回的是00。。。。

出0入0汤圆

发表于 2011-8-1 23:01:37 | 显示全部楼层
我也在做SDHC 模式,CM0  但是我时钟频率 不敢太高,如果太高,就算在初始化中1000次写CM0,也返回的是255的值,在弱弱问下为什么SD 卡的CM0返回的是01 , 而SDHC的CM0返回的是00。。。。 谢谢了

出0入0汤圆

发表于 2011-8-4 13:58:50 | 显示全部楼层
反正初始化成功也是3个,和你不一样就是了

出0入0汤圆

发表于 2012-5-29 19:44:30 | 显示全部楼层
学习,MARK

出0入0汤圆

发表于 2012-9-13 14:54:32 | 显示全部楼层
对于SDIO也可以这样操作么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表