OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17791|回复: 35

SD卡初始化问题

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2012-3-9 21:33:54 | 显示全部楼层 |阅读模式
同一张SD卡,我用51驱动时,CMD0+CMD1就能完成初始化,但用STM32驱动时,参照原子哥的程序,慢慢删语句,发现要CMD0+CMD8+CMD55+ACMD41+CMD58才能完成初始化,很奇怪为什么同一张卡会这样,我的是2G的SD卡,CMD8的返回值是0x01
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-10 00:25:38 | 显示全部楼层
回复【楼主位】以枫之名:
---------------------------------
不是吧.同一张卡?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-10 10:39:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我发誓是同一张卡- -因为我只有一张卡,CMD8返回值是0x01代表是SD2.0吗?SD2.0和SDHC什么区别?
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-10 10:42:04 | 显示全部楼层
unsigned char SdInit(void)
{
unsigned char i;
unsigned char response=0x01;
SD_CS=1;
for(i=0;i<=9;i++)
SdWrite(0xff);
SD_CS=0;
SdCommand(0x00,0,0x95);
response=SdResponse();
if(response!=0x01)
{
return 0;

while(response==0x01)
{
SD_CS=1;
SdWrite(0xff);
SD_CS=0;
SdCommand(0x01,0x00ffc000,0xff);
response=SdResponse();

SD_CS=1;
SdWrite(0xff);
return 1; 
}

这个是我用51的初始化函数,是没问题的
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-10 10:43:08 | 显示全部楼层
u8 SD_Init(void)
{  
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用来进行超时计数
    u8 buff[6];
    //设置硬件上与SD卡相关联的控制引脚输出
//避免NRF24L01/W25X16等的影响
RCC->APB2ENR|=1<<2;       //PORTA时钟使能 
GPIOA->CRL&=0XFFF000FF; 
GPIOA->CRL|=0X00033300;//PA2.3.4 推挽      
GPIOA->ODR|=0X7<<2;    //PA2.3.4上拉 
SPIx_Init();
  SPIx_SetSpeed(SPI_SPEED_256);//设置到低速模式  
SD_CS_H;
    if(SD_Idle_Sta()) return 1;//超时返回1 设置到idle 模式失败   
    //-----------------SD卡复位到idle结束-----------------  
    //获取卡片的SD版本信息
  SD_CS_L;
r1 = SD_SendCommand_NoDeassert(8, 0x1aa,0x87);      
    //如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化
   
     if(r1 == 0x01)
    {
        //V2.0的卡,CMD8命令后会传回4字节的数据,要跳过再结束本命令
        buff[0] = SPIx_ReadWriteByte(0xFF);  //should be 0x00
        buff[1] = SPIx_ReadWriteByte(0xFF);  //should be 0x00
        buff[2] = SPIx_ReadWriteByte(0xFF);  //should be 0x01
        buff[3] = SPIx_ReadWriteByte(0xFF);  //should be 0xAA     
        SD_CS_H;   
        SPIx_ReadWriteByte(0xFF);//the next 8 clocks  
        //判断该卡是否支持2.7V-3.6V的电压范围
        //if(buff[2]==0x01 && buff[3]==0xAA) //不判断,让其支持的卡更多
        {   
            retry = 0;
            //发卡初始化指令CMD55+ACMD41
     do
     {
     r1 = SD_SendCommand(CMD55, 0, 0);
     if(r1!=0x01)return r1;    
     r1 = SD_SendCommand(ACMD41, 0x40000000, 0);
                if(retry>200)return r1;  //超时则返回r1状态  
            }while(r1!=0);   
            //初始化指令发送完成,接下来获取OCR信息    
            //-----------鉴别SD2.0卡版本开始-----------
            r1 = SD_SendCommand_NoDeassert(CMD58, 0, 0);
            if(r1!=0x00)
{
SD_CS_H;//释放SD片选信号
return r1;  //如果命令没有返回正确应答,直接退出,返回应答  
}//读OCR指令发出后,紧接着是4字节的OCR信息
            buff[0] = SPIx_ReadWriteByte(0xFF);
            buff[1] = SPIx_ReadWriteByte(0xFF); 
            buff[2] = SPIx_ReadWriteByte(0xFF);
            buff[3] = SPIx_ReadWriteByte(0xFF);  
            //OCR接收完成,片选置高
            SD_CS_H;
            SPIx_ReadWriteByte(0xFF);    
            //检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC
            //如果CCS=1:SDHC   CCS=0:SD2.0
            if(buff[0]&0x40)SD_Type = SD_TYPE_V2HC;    //检查CCS  
            else SD_Type = SD_TYPE_V2;     
            //-----------鉴别SD2.0卡版本结束----------- 
            //设置SPI为高速模式
            SPIx_SetSpeed(SPI_SPEED_4);  
        }     
    }
    return r1;
}

这个是STM32的,要这样才能完成初始化
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-10 18:57:22 | 显示全部楼层
回复【3楼】以枫之名:
---------------------------------
以下为转贴: 

SDHC和SD的区别其实也就是SD 1.0/1.1规范和SD 2.0规范的区别。虽然编编手上有一份SD 1.1规范的文件,不过由于SD 2.0规范只有SDA的会员才能拿得到,而且对于一般用户来说冗长的规范文件实在没有多大的研究价值,因此编编就简单介绍一下SD 1.1和SD 2.0规范体现在SD卡上的区别。
 
由于SD 1.1规范中规定的SD卡使用的是FAT12和FAT16文件系统,这样一来符合SD 1.1规范的SD卡最大只能达到2G的容量(FAT12的最大磁盘管理能力为8M;最终版的FAT16分区格式最大磁盘管理能力为2G)。而随着flash闪存价格的逐步走低,大容量SD卡很快成为了主流,从而使得SD 1.1规范下的SD卡已经越来越无法满足未来应用的需要,为此SD协会指定了SD 2.0规范,符合该规范的SD卡就被成为SDHC(High Capacity SD Memory Card)。
 
从上文可以看出,由于文件系统的限制,普通SD卡的容量极限为2G,所以2G便成为了SDHC卡的容量起点。SDHC卡与SD卡的物理尺寸一样,最大的区别就是SDHC卡采用的是FAT32的文件系统,这样一来最大就可以支持到32GB的容量了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-11 01:44:05 | 显示全部楼层
我的SD卡是2G的,是FAT32文件系统,对于CMD8的返回值是0x01来说,注释是说这是SD2.0并且不是SDHC,以前我的理解是,SD卡是1.0,SDHC是2.0,撇开这些不说,我不能理解的是,为什么同一张卡,复位方式会不同,对我来说最好的方法是套用原子哥的程序,以便支持多种卡,但这里我确实想搞懂,渴望得到一个可以初始化所有卡的方案,就是按照命令的返回值判断卡的种类,然后做出对应的初始化,能麻烦告诉我各种卡应该发送哪些命令吗?特别是SD,SD2.0和SDHC,SD和SDHC比较容易区别,中间插个SD2.0,凌乱了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-11 08:21:46 | 显示全部楼层
回复【7楼】以枫之名:
---------------------------------
SD卡就只有V1.0(V1.1),V2.0(SDHC).严格来说SDHC卡就是V2.0的卡.
V2.0的卡又分为普通容量的卡与高容量卡.高容量卡就叫SDHC.
他们的区别就是判断OCR的第30位,是否为1.如果是1,说明是一张SDHC的卡,如果是0,说明是一张普通容量的SD卡.

这里有个参考资料比较好.http://wenku.baidu.com/view/e30d2e1cb7360b4c2e3f64f9.html
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-11 12:53:07 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我的卡是按字节寻址的,说明不是SDHC卡吧,那为什么CMD8的返回值又是0x01呢?例程上说返回值是0x05则是1.0,0x01是2.0,而2.0又分2.0 SD和2.0 SDHC,我的到底是什么卡呀?用STM32驱动时CMD0+CMD1就是复位不了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-11 15:03:44 | 显示全部楼层
返回0X01说明是2.0的卡。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-11 15:21:22 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
麻烦原子哥能说一下,各种卡的复位命令吗?还有寻址方式
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-11 15:24:36 | 显示全部楼层
回复【11楼】以枫之名:
---------------------------------
这个看sd卡的 hysical Layer Spec就行了哦,官方的文档,上面的说明很明确。
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-11 16:25:04 | 显示全部楼层
回复【12楼】Pony279:
---------------------------------
我的卡在51上CMD0+CMD1能复位,在STM32上不行,这是为什么?
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-11 16:28:08 | 显示全部楼层
回复【13楼】以枫之名:
---------------------------------

呵呵,我也不懂。网上是有流传2.0的卡能简单复位的,
但是程序最好按照官方文档上的说明去写,才是比较严谨的,你在51上的那种复位,未必能支持其它的2.0的卡
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-11 22:01:39 | 显示全部楼层
回复【14楼】Pony279:
---------------------------------
主要是同一张卡,居然有这样的区别,还有一个问题就是,显示图片的速度很慢,我用STC12单片机显示图片不到1秒,而STM32居然慢的蛋疼,我估计是把两个八位数据合成16位那里占用了大部分时间,有什么办法可以加快速度?不然这样16位操作TFT比8位还慢
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-11 22:21:37 | 显示全部楼层
回复【15楼】以枫之名:
---------------------------------
呵呵,STM32是不会比STC12慢的,模拟器都能在STM32上移植,
而且在STC12上你使用xdata的区话是明显比data区慢的,也就是访问内部扩展RAM会比较内部的128字节的RAM慢。
这个问题想想也知道。

至于SD卡,你能保证初始化的时候SPI的速度,还有硬件环境是一样的吗?
我在51上也弄过SD卡,用我的51开发板上的配的SD卡座,只能初始化SD2.0,
而对于SDHC那时候把单片机用的晶振改成24M才能初始化,程序没动过
搞不懂什么原因,而用电子商店买来的SD模块,能初始化SD2.0和SDHC,
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 12:09:43 | 显示全部楼层
回复【16楼】Pony279:
---------------------------------
我在51上没用xdata,而是在读取扇区函数里加一个TFT写入语句,读取2个字节后直接发送到TFT,这样比先读取一个扇区再写入速度明显要快,而且是以八位IO操作TFT的,而STM32,要把两个八位合成十六位,这样十六位操作TFT,反而比八位传输慢,有什么办法解决吗?
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-12 12:37:56 | 显示全部楼层
回复【17楼】以枫之名:
---------------------------------
这种方式我倒没用到过,8位TFT也没用过
两个8位合成16位的话,
union{
struct {
    u8 lbyte;
    u8 hbyte;   //(h, l 和主机的字节序有关)
}w;
u16 word;
}
这样行不?不使用移位运算。
代码语法上可能有问题,你自己测试下。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-12 12:42:57 | 显示全部楼层
回复【18楼】Pony279:
---------------------------------
另外速度要快的话,还和编译器的优化等级的设置有关,51上好像默认是8级优化,ARM上的,有3个等级,好像默认是2级。
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-12 12:43:44 | 显示全部楼层
回复【15楼】以枫之名:
---------------------------------
不会吧?还有这种事?图片是一摸一样的么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 13:49:57 | 显示全部楼层
图片都是150KB,BIN文件,一模一样,我测试过,不用缓冲区确实要快很多,刚才我用STM32又调了一下,初始化后,让SPI速度2分频,速度快了,但还是不能做到瞬间显示,和我用STC12差不多,晚上试一下不要缓冲区。
for(i=0;i<300;i++)
{
SD_CS=0;
SdCommand(0x11,4265472+(i*512),0xff);
if(SdResponse()==00)
{
while(SdRead()!=0xfe);
for(count=0;count<256;count++) 
{
aa=SdRead();
bb=SdRead();
write_data(bb,aa);

for(;count<256;count++) SdRead();
SdRead();
SdRead();
SD_CS=1;
SdRead();
}
}
这个是我在51上不用数组缓冲区的函数
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 13:54:00 | 显示全部楼层
关于8位合成16位,我试了用强制指针转换,把8位数组转换成16位数组,速度没变化,后来我确定了,原来不是因为合成数据占用时间,而是读取SD卡,我把SD卡读取函数注释掉,显示就是瞬间的,而不注释SD卡读取,注释掉数据合成,还是一样慢,然后把SPI提高到2分频,快多了,但还是没能瞬间显示,我一直想,瞬间显示图片对STM32来说应该是可以完成的,各位有什么方法吗?
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-12 14:20:30 | 显示全部楼层
回复【22楼】以枫之名:
---------------------------------
呵呵,优化速度的方式还是有的,比如利用 __forceinline把最低层的SPI改成强制内联的(用宏定义也可以),

再比如,循环体变量用递减而不是递增的方式,这跟汇编指令有关,不过这个影响不大,最受影响的其实还是SPI本身的速度

或许改用STM32的SD + DMA会更快一些吧

加油哈,我可就帮不了你了~


https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-12 15:27:40 | 显示全部楼层
回复【22楼】以枫之名:
---------------------------------
SDIO。
但是我觉得STM32的SPI,至少不会输给51啊....
51才跑多少M?12M?STM32的SPI,标称18M啊!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-12 15:37:22 | 显示全部楼层
我也这么觉得,STC12的SPI至少要四分频的
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 17:08:05 | 显示全部楼层
回复【25楼】Pony279:
---------------------------------
STM32主频9倍频到72M,STC12主频才22M,显示图片的速度居然差不多,而且STM32已经极限2分频了,不得不说STC12系列有点变态,我真不知道怎么提高STM32的速度了
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-12 17:18:16 | 显示全部楼层
回复【26楼】以枫之名:
---------------------------------

最好是去网上看看别人的例子后再下结论吧。
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-12 18:09:44 | 显示全部楼层
回复【26楼】以枫之名:
---------------------------------
STM32的SPI最高是18M的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 18:20:59 | 显示全部楼层
回复【28楼】正点原子:
---------------------------------
Stm32_Clock_Init(9);
SPIx_SetSpeed(SPI_SPEED_2);
这样设置后SPI速度是多少M?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-12 19:19:19 | 显示全部楼层
回复【29楼】以枫之名:
---------------------------------
这种问题,自己仿真看看不就知道了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-3-12 21:21:51 | 显示全部楼层
嗯,谢谢两位啦
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-10-2
在线时间
0 小时
发表于 2013-10-5 10:00:18 | 显示全部楼层
回复【楼主位】以枫之名:
---------------------------------
SD卡初始化不过,不知如何仿真,自己弄了好几天了,特来论坛求助。

SD卡为 东芝 8G 卡,最高速度30M/s, 

还有就是初始化的时候 时钟300k的低速问题,我程序里没有设置,

unsigned char SD_Init(void)
{  
   unsigned char temp;
   unsigned char i;

   SD_Port_Init(); 
   delay(200);
   
   Init_Flag=1; 
   for (i=0;i<200;i++) 
   {
          Write_Byte_SD(0xff);  //至少延时74个时钟
            delay(200);
   }

 GPIO_ResetBits(GPIOA,SD_CS_PIN); //打开SD卡片选

   i = 0;
   do
   { 
     temp=Write_Command_SD(CMD)  //发送CMD0
     i++;
     if(i >= 200)  
     { 
       return(INIT_CMD0_ERROR);  //CMD0 Error!
     }
   } 
   while(temp!=1); 
 
 
 
 
   i = 0;
   do{
            CMD[0] = 0x77;                   //CMD55命令
           temp = Write_Command_MMC(CMD); 

       if(temp == 0x01)               
       {
         CMD[0] = 0x69;             
         temp = Write_Command_SD(CMD); //ACMD41
         if(temp == 0x00)              
             {
                card_type =1;              //SD卡
               }
       }
       else                          
       {
         CMD[0] = 0x41;            //CMD1
         CMD[5] = 0xFF; 
         temp = Write_Command_SD(CMD);  
         if(temp == 0x00)           
             { 
                card_type =0;            //MMC卡
             }
       }
       i++;
       if(i >= 200)
       {
         return(INIT_CMD1_ERROR);     
       }
     }
 while(temp != 0x00);

   Init_Flag=0;    //初始化成功标志位置零
   
   GPIO_SetBits(GPIOA,SD_CS_PIN);  //关闭片选
 
   return(0); 
}

SD卡测试.zip

6.14 MB, 下载次数: 3040

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-5 11:41:06 | 显示全部楼层
回复【32楼】分析:
---------------------------------
那你的SPI速度是多少?
初始化必须设置低于250K的速度才可以,你没设置,怎么能过?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-10-2
在线时间
0 小时
发表于 2013-10-5 12:55:20 | 显示全部楼层
 回复【33楼】 正点原子 :
---------------------------------
感谢原子站长回复,

怎么设置,需要使用"STM32f10x_spi.h"吗?

我以为 :软件模拟就行了,不用用那个spi,我还没学spi,等我今天下午看完您的spi视频后,再来问您

怎么设置低速IO口,我还不会,您那个spi我没看懂,我那个源码是 我修改我板子后的,自己搜过资料,提到关于低速问题,除了spi还能用其他的方法吗??



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-5 16:20:00 | 显示全部楼层
IO口的速度,和你设计的实际输出速度,没有直接关系,比如你设置IO是50Mhz的,但是你横竖怎么折腾,都不能输出50Mhz的方波的....
实际输出速度,得看你自己的IO取反频率,比如:
while(1)
{
LED0=1;
delay_us(1);
LED0=0;
delay_us(1);
}
这样的语句,LED0的翻转频率,就是500Khz左右了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2013-11-21 18:18:46 | 显示全部楼层


原子哥,20bit~32bit不都0么,而且都是保留位,为什么读到的数据会是0xaa呢?



天道酬勤
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 22:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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