搜索
bottom↓
回复: 26

请大家帮我看看这个折磨我已经10天的SD卡程序

[复制链接]

出0入0汤圆

发表于 2008-8-1 17:20:31 | 显示全部楼层 |阅读模式
我是通过串口调试的,还没涉及到FAT,可以确认初始化是成功的,但是当我要读扇区0时,发现读出的数具都是0x78,可是扇区0应该是启动扇区的内容啊

#define uchar unsigned char
#define uint unsigned int
#define cs     PORTB.0
  
uchar BUFFER[512]; //扇区缓冲区
uint i=0;
  ///////////////////////////////////////////////////////////////////////////
//
//
void spi_init(void)
{
DDRB = 0xf7;    //SI输入,SO,SCK,SS输出  

SPCR = 0x51;  //setup SPI
SPSR = 0x00;  //setup SPI
}

///////////////////////////////////////////////////////////////////////////
//
//

void Write_Byte_SPI(unsigned char byte)
{   
    SPDR = byte;
    while (!(SPSR & (1<<7)));
}

uchar reading=0,a=0,pointer=0;

void high_spi(void)
{SPCR = 0x50;                //提速
SPSR = 0x01;                //setup SPI
}


///////////////////////////////////////////////////////////////////////////
//
//
unsigned char Read_Byte_SPI(void)
{   
    SPDR = 0xFF;
    while (!(SPSR &(1<<7)));
    return SPDR;
}

//****************************************************************************
//Send a Command to MMC/SD-Card
//Return: the second byte of response register of MMC/SD-Card
//****************************************************************************
uchar SD_Write_Command(uchar cmd,unsigned long arg)
{
   uchar tmp;
   uchar retry=0;
   cs=1; //关闭SD
   //send 8 Clock Impulse
   Write_Byte_SPI(0xFF);
    //set MMC_Chip_Select to low (MMC/SD-Card active)
   cs=0; //打开SD
   Write_Byte_SPI(cmd|0x40);   //送头命令
   Write_Byte_SPI(arg>>24);
   Write_Byte_SPI(arg>>16);     //send 6 Byte Command to MMC/SD-Card
   Write_Byte_SPI(arg>>8);
   Write_Byte_SPI(arg&0xff);
   Write_Byte_SPI(0x95);       //仅仅对RESET有效的CRC效验码
  
   //get 8 bit response
   //Read_Byte_MMC(); //read the first byte,ignore it.
   do
   {  //Only last 8 bit is used here.Read it out.
      tmp = Read_Byte_SPI();
      retry++;
   }while((tmp==0xff)&&(retry<100));  //当没有收到有效的命令的时候
   cs=1;       //SD卡关闭   
   //if(reading==0)
  // MMC_PORT|=MMC_CS_PIN;            //MMC_CS_PIN=1;
   //else MMC_PORT&=~MMC_CS_PIN;      //MMC_CS_PIN=0;   
   return(tmp);
}  


//****************************************************************************
//SD卡初始化(SPI-MODE)
//****************************************************************************
uchar SD_Init(void)
{  unsigned long int retry,temp;
   uchar i;
   spi_init();
   delay_us(300);  //Wait MMC/SD ready...  
   for (i=0;i<20;i++)
   {
      Write_Byte_SPI(0xff); //send 74 clock at least!!!
   }
   //Send Command CMD0 to MMC/SD Card
   retry=0;   
   do
   { //retry 200 times to send CMD0 command
     temp=SD_Write_Command(0,0);
     retry++;
     if(retry>500)
     {
     return(4);//CMD0 Error!
     }
   }
   while(temp!=1);
    //Send Command CMD1 to MMC/SD-Card
   retry=0;
   do
   { //retry 100 times to send CMD1 command
     temp=SD_Write_Commnd(1,0);
     retry++;
     if(retry>500)
     {
      return(9);
     }
   }
   while(temp!=0);
   retry=0;
   SD_Write_Command(16,512);//设置一次读写BLOCK的长度为512个字节
  // SD_Write_Command(59,0);      
  high_spi();
    cs=1;  //MMC_CS_PIN=1;  //关闭SD
   return(80); //初试化成功
}   



//****************************************************************************
//从SD卡读一个扇区  Return 0 if no Error.
//****************************************************************************
uchar SD_Read_Block(unsigned long address)
{  
   unsigned int retry,temp=0;uint i=0;
   address=(address<<9);
   //reading=1;
    cs=0;   //打开SD
   temp=SD_Write_Command(17,address);     //读出RESPONSE   
  
   while (Read_Byte_SPI()!=0xfe)
   {retry++;if(retry>200) return 9;};//直到读取到了数据的开始头0XFE,才继续
   for(i=0; i<512; i++)
        {
        BUFFER=Read_Byte_SPI();
        //printf("%x",BUFFER);
       
        }
   Read_Byte_SPI();//CRC - Byte
   Read_Byte_SPI();//CRC - Byte
   reading=0;
   cs=1;      //关闭SD卡
   return(temp);
}

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

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

出0入0汤圆

 楼主| 发表于 2008-8-1 17:26:25 | 显示全部楼层
我是这样读扇区0 的, SD_Read_Block(0),然后通过串口查看扇区0的内容,可是都是0x78,
下面是WINHEX查看的结果

(原文件名:未命名.GIF)

出0入0汤圆

 楼主| 发表于 2008-8-1 17:27:33 | 显示全部楼层
从SD_Read_Block(0)返回是0,数据的开始头0XFE也可以读出来,这应该没问题,可就是BUFFER的内容为什么与WINHEX查看的内容不同呢?

出0入0汤圆

 楼主| 发表于 2008-8-1 17:52:38 | 显示全部楼层
baozai,还有其他几位大虾在吗

出0入0汤圆

发表于 2008-8-1 18:26:50 | 显示全部楼层
你读到的可能是MBR,不是DBR,你上面的图是DBR区域,他在SD卡里不是第1个sector。不过MBR也不可能全是0X78啊,至少最后两位应该是0x55,0xAA啊,

出0入0汤圆

发表于 2008-8-1 19:22:39 | 显示全部楼层
你要注意逻辑扇区和物理扇区,以物理扇区来读,你注意下

出0入0汤圆

 楼主| 发表于 2008-8-1 19:23:06 | 显示全部楼层
好的,谢谢,可能是这个问题我根本没搞清楚

干开始是串口问题,现在不管读什么sector,读出来都是0,我的卡是3年前买的,但用读卡器没什么问题

出0入0汤圆

 楼主| 发表于 2008-8-1 20:34:17 | 显示全部楼层
解决了,哈哈,感谢万能的坛,原来就是qkj1575 所说的逻辑扇区和物理扇区问题

出0入0汤圆

 楼主| 发表于 2008-8-1 20:56:05 | 显示全部楼层
为了让象我一样的菜鸟少走弯路,我特意把图贴出来


(原文件名:aa.GIF)
显示的是逻辑扇区0,物理扇区97(红色部分),所以要读出启动扇区,应该读它的物理扇区(97)(不明白97前面还有几十个扇区留着干什么用)

下面是读出来的结果


(原文件名:bb.JPG)

出0入0汤圆

发表于 2008-8-1 23:21:04 | 显示全部楼层
怎么不把改好的共享以下啊?

出0入0汤圆

发表于 2008-8-1 23:54:17 | 显示全部楼层
LS的就不要这么直接了,这样不好,也没见你共享什么,呵呵

出0入0汤圆

发表于 2008-8-2 00:09:02 | 显示全部楼层
先读物理扇区0(即MBR),在物理扇区0中有一处叫DPT的部分(硬盘分区表),相对偏移量为1BE。DPT总共64字节,每16字节为一部分。如下图蓝线框出的部分就告诉了我们逻辑扇区0的相对位置,因为是小端格式存储,所以读出的数据应该为0x00000020,好,其实告诉我们逻辑扇区0就是在第32扇区。

(原文件名:Snap1.jpg)
好我们跳转到第32扇区看看,到底对不对。512*32=16384=0x4000。呵呵,看在0x4000的位置就是逻辑扇区0(即DBR)

(原文件名:Snap2.jpg)

出0入0汤圆

 楼主| 发表于 2008-8-2 10:45:58 | 显示全部楼层
谢谢lanshuitianxia
我以前也学过FAT一段时间,只不过当时理解的不是很清楚,看了又回想起来了

这个东西等我把FAT加上去之后,肯定会贴出来,可能还需要一些时间,现在这个东西我自己还搞的不是很懂,贴出来怕误人子弟

出0入0汤圆

发表于 2008-8-2 10:53:01 | 显示全部楼层
学习了.谢谢!

出0入0汤圆

发表于 2008-8-2 12:00:37 | 显示全部楼层
也学习了

出0入0汤圆

发表于 2008-12-30 22:01:50 | 显示全部楼层
这个要顶!

出0入0汤圆

发表于 2008-12-30 21:55:18 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-11-25 23:03:44 | 显示全部楼层
记号&nbsp;mark

出0入0汤圆

发表于 2008-10-28 15:42:56 | 显示全部楼层
好,非常好!!!!

出0入0汤圆

发表于 2009-3-31 14:27:44 | 显示全部楼层
我也碰到这个问题,郁闷了一阵。谢谢了。

出0入0汤圆

发表于 2009-6-18 21:42:19 | 显示全部楼层
ding

出0入0汤圆

发表于 2009-7-4 01:04:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-4 11:47:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-9-28 15:20:47 | 显示全部楼层
真是感谢,又长知识了。

出0入0汤圆

发表于 2013-9-28 17:28:04 | 显示全部楼层
老帖 了 还要赞一个                                 

出0入0汤圆

发表于 2013-10-25 11:59:23 | 显示全部楼层
顶一下,问题解决有报告,有始有终好同志。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 00:28

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

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