90999 发表于 2009-11-9 16:45:26

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

我发现 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 ~~~~~

zbjzxc 发表于 2009-11-9 19:16:58

哈哈,我先顶下。

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

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

HZZCL 发表于 2009-11-9 21:10:32

学习.

aaa1982 发表于 2009-11-9 22:05:40

请问SDHC还支持SPI模式么,还是只支持SDIO模式

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

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

感谢

90999 发表于 2009-11-9 23:41:06

我只做了SPI模式的,初始化直接用高速 20M,我开始时候也是用低速的,后来发现竟然高速下也可以,次数大概是1000次
(实际计算过大概400次@16MHZ,600次@20MHZ就可以完成CMD0)

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

90999 发表于 2009-11-9 23:41:49

完成CMD1之后,按照别人的代码继续执行即可,可以关CRC,可以读写扇区了~~~

yaya001 发表于 2009-11-10 00:03:15

mark

keaiduo 发表于 2009-11-10 00:09:35

mark

aaa1982 发表于 2009-11-10 10:24:55

“读写1024个扇区大概18秒这样”

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

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

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

aaa1982

90999 发表于 2009-11-10 11:09:40

是的,SPI的速率,不过我也说了,我不是用DMA传输的,具体情况优化代码后才知道,

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

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

HZZCL 发表于 2009-11-10 11:27:04

aaa1982

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

zwhold 发表于 2009-11-10 11:51:55

mark

aaa1982 发表于 2009-11-10 12:09:52

HZZCL

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

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

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

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

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

欢迎各位踊跃发言,谢谢

HZZCL 发表于 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

aaa1982 发表于 2009-11-10 14:32:06

看了一下,感觉你给的图片和spi没太大关系

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

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

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

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

HZZCL 发表于 2009-11-10 14:45:49

aaa1982
你可以用示波器测下,SPI的CLK是不是有停止的时候。

90999 发表于 2009-11-10 17:59:16

如果需要高速读写的,肯定要DMA~~~

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

aaa1982 发表于 2009-11-10 21:07:15

HZZCL :

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

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


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

HZZCL 发表于 2009-11-10 21:36:43

我现在也就困在这个地方,估计是SPI控制器的问题。
本来是想用SPI跑到1M byte/s,现在看来用SPI模式是不行了,考虑下SD模式。

WhatsThat 发表于 2009-11-10 22:38:22

官方文档有初始化流程,建议照这个初始化

HZZCL 发表于 2009-11-11 16:22:17

初始化已完成,缺的就是速度不够快。

90999 发表于 2009-11-12 08:23:14

实际测试了下,读取也就320kb/s上下~~~~~

90999 发表于 2009-11-12 08:23:37

WhatsThat

麻烦,懂么~~~~~~

HZZCL 发表于 2009-11-12 20:07:25

如果读取也就320kb/s上下,那速度不快.我的现在读取是420k byte/s,SPI模式.

aaa1982 发表于 2009-11-14 14:18:09

HZZCL

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

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


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

你是怎么做的?

aaa1982

HZZCL 发表于 2009-11-14 19:06:31

我用的MCU为ATMEGA168-20AU,SPI的clk为10M bit/s,平均读取是420k byte/s.

aaa1982 发表于 2009-11-14 20:06:56

SPI应该不会间隔那个么长,你怎么10M才420k


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

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_503183.jpg
(原文件名:示波器图片1.jpg)

HZZCL 发表于 2009-11-19 16:40:21

看看我的波形
1为SPI数据口,2为SPI时钟
http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_505022.JPG
(原文件名:新建文件6.JPG)

PPLL028 发表于 2009-11-20 23:35:47

我用的FPGA还是4线的SD模式读,也才10Mbit/s不到..............25MHz的时钟。今天太晚了,明天我发图。

jiangjx 发表于 2010-2-22 17:04:23

mark

90999 发表于 2010-3-17 14:39:26

发现一个BUG, 有些SD卡误识别为SDHC,需要添加CMD9读16个SD,然后再判断

批量读请用CMD18

yulutong 发表于 2010-3-22 10:08:30

请问楼主你读SD卡的速度达到420K BYTE/S,是带文件系统么?我用FATFS读1M的文件需要10s,速度提高不上了。SPI时钟有14M。

90999 发表于 2010-3-28 18:07:42

不带系统跑420@16mhz, 带FATFS的,跑10MB大概29-30秒,约300KB/S@15MHZ

90999 发表于 2010-3-28 18:10:01

如果上16MHZ就出现错误了.....

wenming 发表于 2010-3-28 18:43:25

SPI模式不可能达到很高的速度.CLASS 6的卡,如果使用SD模式的话,速度会快很多.

span42 发表于 2010-5-21 19:51:27

mark

c378865635 发表于 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的卡

love_zjb 发表于 2010-12-20 10:24:00

mark

yuzr 发表于 2010-12-20 11:20:05

mark

passjordan 发表于 2010-12-22 16:36:27

mark

bjgongli 发表于 2011-1-6 12:06:45

SD卡速度 记号

dianzidog 发表于 2011-6-10 17:23:07

回复【34楼】wenming老王
spi模式不可能达到很高的速度.class 6的卡,如果使用sd模式的话,速度会快很多.
-----------------------------------------------------------------------

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

tiedanbb 发表于 2011-7-22 11:32:47

期待源代码,换了批卡是高速的以前的程序需要重写

xiachucheng 发表于 2011-7-22 14:04:29

问一下,一个扇区读写6ms,这个6ms是怎样测量的,要用什么工具?

90999 发表于 2011-7-22 14:21:39

回复【43楼】xiachucheng
问一下,一个扇区读写6ms,这个6ms是怎样测量的,要用什么工具?

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

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


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

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

suzixiang3 发表于 2011-8-1 16:21:00

我也在做SDHC 模式,CM0但是我时钟频率 不敢太高,如果太高,就算在初始化中1000次写CM0,也返回的是255的值,在弱弱问下SD 卡的CM0返回的是01 , 而SDHC的CM0返回的是00。。。。

./emotion/em046.gif

suzixiang3 发表于 2011-8-1 23:01:37

我也在做SDHC 模式,CM0但是我时钟频率 不敢太高,如果太高,就算在初始化中1000次写CM0,也返回的是255的值,在弱弱问下为什么SD 卡的CM0返回的是01 , 而SDHC的CM0返回的是00。。。。 谢谢了

suzixiang3 发表于 2011-8-4 13:58:50

反正初始化成功也是3个,和你不一样就是了

yfgww 发表于 2012-5-29 19:44:30

学习,MARK

number007cool 发表于 2012-9-13 14:54:32

对于SDIO也可以这样操作么?
页: [1]
查看完整版本: 原来 SDHC 只用3个命令就可以完成初始化~~~~~~~~