打印

关于SD卡的驱动

[复制链接]
5875|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhwaizhu|  楼主 | 2012-9-21 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用单片机驱动一个8G的SD卡,FAT32格式,采用SPI模式,现在的情况是第一次调试的时候发送CMD0 返回0x01 发送CMD1返回0x00,正常激活了,后来调试的时候同样的程序发送CMD0 返回0x01 发送CMD1返回还是0x01,一致通过不了,请教大家是不是我程序的问题啊?谢谢:
#include"SD.h"

//**************控制端口定义********************
//定义SD卡引脚定义
#define SD_DO   PORTB.6
#define SD_CLK  PORTB.7
#define SD_DI   PORTB.5
#define SD_CS   PORTB.4

//******************全局变量***************************
unsigned char   DATA[512];//定义512字节缓冲区,注意需要使用


//================================================================================================
//实现功能:写一字节到SD卡,模拟SPI总线方式
//输入参数:n 待写入数据
//================================================================================================
void SdWrite(unsigned char n)
{

        unsigned char i;

        for(i=0;i<8;i++)
        {
         SD_CLK=0;

         if(n&0x80)SD_DI=1;else SD_DI=0;
         n<<=1;
         SD_CLK=1;

        }
        
    SD_DI=1;
}

//================================================================================================
//实现功能:从SD卡读一字节,模拟SPI总线方式
//返回参数:n 读取的8位数据
//================================================================================================
unsigned char SdRead()
{
        unsigned char n=0,i;
                    
    for(i=0;i<8;i++)
        {
         SD_CLK=0;

         SD_CLK=1;
         n<<=1;
         if((PINB&0x40)==0x40) n|=1;else n|=0;
        }
      
        return n;
}

//================================================================================================
//实现功能:读取SD卡的响应
//返回参数:response 响应标志
//================================================================================================
unsigned char SdResponse()
{
    unsigned char response,time=0;;
   
    do
    {  
      response=SdRead();
      time++;
    }
    while((response==0xff)&&(time<100));//100次以内尝试读取响应

    return response;      //返回读取的数据

}

//================================================================================================
//实现功能:发命令到SD卡
//================================================================================================
void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
{
        unsigned char i,a[6];
        
        a[0]=command|0x40;
        a[1]=((argument&0xff000000)>>24);
        a[2]=((argument&0x00ff0000)>>16);
        a[3]=((argument&0x0000ff00)>>8);
        a[4]=  argument&0x000000ff;
        a[5]=  CRC;
        
        for(i=0;i<6;i++)
        {   
             SdWrite(a);
        }
}

//================================================================================================
//实现功能:初始化SD卡(参考SD卡初始化时序)
//================================================================================================
unsigned char SdInit(void)
{
        unsigned char i,time=0;
        unsigned char response=0x01;
      
    //send CMD0,如果response=0x01则SD卡成功转到SPI模式
    do
     {
      SD_CS=1;
          for(i=0;i<=9;i++)       //复位时最少写入74个时钟周期
          SdWrite(0xff);
          SD_CS=0;                //复位后CS拉低
        
      SdCommand(0x00,0,0x95); //Send Command 0 to put MMC in SPI mode
      response=SdResponse();
         
      time++;
     }
    while((response!=0x01)&&(time<100));   //等待命令CMD0的响应
    if(time==100)return 0;    //100次仍然不能得到命令CMD0的响应,超时退出

        
    //SD卡在进入SPI模式后,激活命令为Cmd1
        do
        {
         SdWrite(0xff);           //补偿8个时钟
         SdCommand(0x01,0,0xff);  //send CMD1
         response=SdResponse();
        } while(response!=0x00);  //等待返回0x00

    //最后CS拉高
        SD_CS=1;
        SdWrite(0xff);            //补偿8个时钟
        return 1;                 //初始化成功,返回成功信号1
}

//================================================================================================
//实现功能:从SD卡指定地址读取数据,一次最多512字节(参考SD卡读时序)
//================================================================================================
unsigned char SdReadBlock(unsigned char *Block, unsigned long address,unsigned int len)
{
    unsigned int count;

    SD_CS=0;       //使能SD卡

    SdCommand(17,address,0xff);//send command 17读扇区命令
      
    if(SdResponse()==00)//command was a success - now send data
        {
           while(SdRead()!=0xfe); //等待数据的起始令牌号
         for(count=0;count<len;count++) *Block++=SdRead(); //读512个数据
        
         SD_CS=1;
         return 1;
        }
        return 0;
}

相关帖子

沙发
戒指320| | 2012-9-22 13:18 | 只看该作者
建议换个4G以下的试试

使用特权

评论回复
板凳
阿南| | 2012-9-22 14:18 | 只看该作者
这个还是要多试试,不行看尽量恢复到之前的状态,如代码,卡等

使用特权

评论回复
地板
anboe2012| | 2013-3-21 09:41 | 只看该作者
单片机读写SD卡 模块 支持FAT32 UART接口 .TXT文件

随着电子技术的发展,SD卡作为大容量数据存储器越来越受到广大电子爱好者和客户的衷爱。但是由于SD卡FAT操作的编程复杂,很多电子爱好者望而却步,现在好了,我们推出了这块小巧玲珑的SD卡读卡模块,将复杂的FAT操作集成其内,单片机只需简单的串口操作就能将数据存到SD卡中去,而且支持FAT32。
功能简介:
1. 电源输入范围宽:5~9V,支持3.3V和5V的UART接口。
2. 和单片机的接口简单 UART(串口)接口 可以直接和单片机的UART接口连接
3. 集成FAT32格式系统
4. 文件的读写支持两种模式,一种顺序读写,用以连续的大量数据的读写.一种为给定起始地址的读写,用来随即读写的少量数据的情况,这个功能是的文件的读写非常灵活
5. 波特率可以用拨码开关选择,支持从1200~115200bps
6. 一次性发送数据贞可以长达256字节,有效字节数250
7. 支持<=8G容量的SD卡
8. 读写SD卡模块的速度快
9. 命令结构简单,方便发送
10.能动态监测SD状态有错就会提示
11.模块尺寸小,便于安装与使用。




那个带SD卡的是个模块,带处理器,整合了FAT32,接口是串口(UART)
51单片机串口115200bps读写,写入后文件样子如下:

说明书下载地址:http://www.prog430.com/files/SDV6.pdf

测试软件下载地址:http://www.prog430.com/files/SDV6_test.rar

说明书下载地址:http://www.prog430.com/files/SDV7.pdf

测试软件下载地址:http://www.prog430.com/files/SDV7_test.rar

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

79

帖子

2

粉丝