Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4462790
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-07-03 10:30:21

工程代码:  2_spi_sd卡读写扇区csd容量问题.rar  
看资料 : sd卡文件 http://blog.chinaunix.net/space.php?uid=22666248&do=blog&id=1593835
          csd 寄存器 http://www.baiheee.com/Documents/091203/091203224635.htm     

        2G SD卡  获取的容量大小
                  高16位 :29
                  低16位: 18432
              所以容量大小:29 * 2^16 + 18432 字节

  1. /*******************************************************************************
  2. * Function Name : SD_GetCapacity
  3. * Description : 获取SD卡的容量
  4. * Input : None
  5. * Output : None
  6. * Return : u32 capacity
  7. * 0: 取容量出错
  8. *******************************************************************************/
  9. u32 SD_GetCapacity(void)
  10. {
  11.     u8 csd[16];
  12.     u32 Capacity ;
  13.     u8 r1 ;
  14.     u16 i ;
  15.     u16 temp ;
  16.     
  17.     //取CSD信息,如果期间出错,返回0
  18.     if(SD_GetCSD(csd)!=22)
  19.     {
  20.         return 33 ;
  21.     }
  22.     
  23.     //如果为SDHC卡,按照下面方式计算
  24.     if((csd[0]&0xC0)==0x40)
  25.     {
  26.         Capacity=(((u32)csd[8])<<8+(u32)csd[9]+1)*(u32)1024 ;
  27.     }
  28.     else
  29.     {
  30.         //下面代码为网上版本
  31.         ////////////formula of the capacity///////////////
  32.         //
  33.         // memory capacity = BLOCKNR * BLOCK_LEN
  34.         //
  35.         //    BLOCKNR = (C_SIZE + 1)* MULT
  36.         //
  37.         // C_SIZE_MULT+2
  38.         //    MULT = 2
  39.         //
  40.         // READ_BL_LEN
  41.         //    BLOCK_LEN = 2
  42.         /**********************************************/
  43.         //C_SIZE
  44.         #if 0
  45.         /*下面的程序代码,计算容量,在自己的SD卡上没有用*/
  46.         i=csd[6]&0x03 ;
  47.         i<<=8 ;
  48.         i+=csd[7];
  49.         i<<=2 ;
  50.         i+=((csd[8]&0xc0)>>6);
  51.         
  52.         //C_SIZE_MULT
  53.         r1=csd[9]&0x03 ;
  54.         r1<<=1 ;
  55.         r1+=((csd[10]&0x80)>>7);
  56.         
  57.         //BLOCKNR
  58.         r1+=2 ;
  59.         temp=1 ;
  60.         while(r1)
  61.         {
  62.             temp*=2 ;
  63.             r1--;
  64.         }
  65.         Capacity=((u32)(i+1))*((u32)temp);
  66.         
  67.         // READ_BL_LEN
  68.         i=csd[5]&0x0f ;
  69.         //BLOCK_LEN
  70.         temp=1 ;
  71.         while(i)
  72.         {
  73.             temp*=2 ;
  74.             i--;
  75.         }
  76.         //The final result
  77.         Capacity*=(u32)temp ;
  78.         //Capacity /= 512;
  79.         #endif

  80.         //使用这个计算方式 计算 容量
  81.         Capacity = (((csd[6]&0x03)<<10) | (csd[7]<<2) | ((csd[8]&0xC0)>>6) + 1) * (1 << ((((csd[9]&0x03)<<1) | ((csd[10]&0x80)>>7)) + 2));
  82.     }
  83.     return (u32)Capacity ;
  84. }






阅读(4506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~