下面是 SD 卡 V2.0 协议的 CSD 寄存器内容,来自官方手册:

单片机如何确定当前的 SD 卡遵循 V2.0 协议

CSD 寄存器为 128 个位,即 16 个字节。通过检测 CSD 寄存器的 bit126 是 0 还是 1 来判断。如果是 1,即是 V2.0 版本的。

相关代码如下:

u8 SD_GetCSD(u8 *csd_data)
{
u8 r1; /* 发送读取 CSD 指令 */
r1=SD_SendCmd(CMD9,0,0x01);、
if(r1==0)
{
r1=SD_RecvData(csd_data, 16);
} /* 取消片选 */
SD_DisSelect(); if(r1)return 1;
else return 0;
}
/* 访问出错返回 */
if(SD_GetCSD(csd) != 0) return 0; /* 确保为 V2.0 的卡 */
if((csd[0]&0xC0)==0x40)

V2.0 的 CSD 寄存器中,关于描述容量的位如下图所示:

V2.0 的 C_SIZE 和容量相关,共 22 个位,从 bit48~69,位于 csd[7]、csd[8]、csd[9]。

手册上提供计算的公式和方法如下图所示:

总结起来即:

csize = csd[9] + ((uint32_t)csd[8] << 8) + ((uint32_t)(csd[7] & 63) << 16) + 1;
Capacity = csize << 9;

注意:Capacity 算出来的容量单位是 bytes,实际应用中,注意单位的转换。

程序附录

u8 SD_GetResponse(u8 Response)
{
u16 Count =0xFFFF; /* 等待响应 */
while ((SD_SPI_ReadWriteByte(0XFF) != Response)&&Count)Count--; if (Count==0)
return MSD_RESPONSE_FAILURE;
else
return MSD_RESPONSE_NO_ERROR;
} u8 SD_RecvData(u8*buf,u16 len)
{
/* 等待响应 */
if(SD_GetResponse(0xFE))return 1; while(len--)
{
*buf = SPI1_ReadWriteByte(0xFF);
buf++;
} /* 发送 2 个伪 CRC */
SD_SPI_ReadWriteByte(0xFF);
SD_SPI_ReadWriteByte(0xFF);
return 0;
} u32 SD_GetSectorCount(void)
{
u8 csd[16];
u32 Capacity;
u32 csize; if(SD_GetCSD(csd)!=0) return 0; if((csd[0]&0xC0)==0x40)
{
csize = csd[9] + ((uint32_t)csd[8] << 8) + ((uint32_t)(csd[7] & 63) << 16) + 1;
Capacity = csize << 9;
} return Capacity;

以 SPI 方式获取 SD 卡容量(V2.0)的更多相关文章

  1. SPI 方式初始化 SD 卡总流程图(V2.0)

  2. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  3. android 获取sd卡根目录

    dir:/storage/emulated/0 也就是 sdcard目录 ====== android 获取sd卡根目录 public String getSDPath(){        File ...

  4. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...

  5. Android开发学习---如何写数据到外部存储设备(sd卡),Environment.getExternalStorageDirectory,怎么获取sd卡的大小?

    本文主要介绍如何写数据到sd卡,这里主要到的技术是Environment中的方法. 1. 2.实现代码: /datasave/src/com/amos/datasave/savePasswordSer ...

  6. 分析setting源代码获取sd卡大小

    分析setting源代码获取sd卡大小 android系统有一个特点,即开源,我们可以得到任何一个应用的源代码,比如我们不知道这样的android代码怎么写,我们可以打开模拟器里面的设置(settin ...

  7. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  8. Android Environment 判断sd卡是否挂载 获取sd卡目录

    在将一个文件存储到sd卡上面的时候,一般需要判断sd是否已经挂载才进行操作. 那么如何判断sd卡已经挂载呢? 我们可以使用Android的Environment类,具体使用如下: if(Environ ...

  9. Android 获取SD卡路径和推断SD卡是否存在

    android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...

随机推荐

  1. fiddler抓包工具总结

    Fiddler 抓包工具总结 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也 ...

  2. Xamarin常见问题

    1. Could not locate Java 6 or 7 SDK. (Download from http://www.oracle.com/technetwork/java/javase/do ...

  3. alome配环境

    1. gitLab: 将工程git到alome版的exlipse中. 2. 打开右上角Aclome视图: 3. 打开Aclome资源管理器窗口: 4. 打开git窗口,在Working Tree上右键 ...

  4. CentOS开启telnet服务

    原文地址:https://blog.csdn.net/zhujiangm/article/details/4540778 服务器:CentOS-5.1(192.168.1.87)客户机:FC6(192 ...

  5. PMP:9.项目资源管理

    项目资源管理包括识别.获取和管理所需资源以成功完成项目的各个过程,这些过程有助于确保项目经理和项目团队在正确的时间和地点使用正确的资源. 项目资源管理过程包括:   团队资源管理相对于实物资源管理,对 ...

  6. WPF 开发备忘录

    运营日: select t.*   from (select ab.*, bs.station_cn_name, bd.device_name           from audit_tvm_cas ...

  7. 在windows上安装wamp时遇到apache无法启动,图标为橙色

    1.首先测试端口号是否被占用,如果端口号被占用,修改相对应文件的端口号,修改端口号的方法网上很容易搜到. 2.如果端口号没有被占用,cd到httpd.exe目录下,查看错误原因,这里我显示的错误是ht ...

  8. MySQL InnoDB 索引组织表 & 主键作用

    InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...

  9. Python学习笔记【第四篇】:基本数据类型

    变量:处理数据的状态 变量名 = 状态值 类型 python中有以下基本数据类型: 1:整形 2:字符串类型 3:Bool类型 4:列表 5:元祖(不可变) 6:字典(无序) 7:集合 (无序.不重复 ...

  10. Kali学习笔记25:Arachni使用(实现分布式扫描)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 Arachni不同于上次介绍的nikto和skipfi ...