以 SPI 方式获取 SD 卡容量(V2.0)
下面是 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)的更多相关文章
- SPI 方式初始化 SD 卡总流程图(V2.0)
- 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件
[源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...
- android 获取sd卡根目录
dir:/storage/emulated/0 也就是 sdcard目录 ====== android 获取sd卡根目录 public String getSDPath(){ File ...
- Android获取SD卡路径及SDCard内存的方法
这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...
- Android开发学习---如何写数据到外部存储设备(sd卡),Environment.getExternalStorageDirectory,怎么获取sd卡的大小?
本文主要介绍如何写数据到sd卡,这里主要到的技术是Environment中的方法. 1. 2.实现代码: /datasave/src/com/amos/datasave/savePasswordSer ...
- 分析setting源代码获取sd卡大小
分析setting源代码获取sd卡大小 android系统有一个特点,即开源,我们可以得到任何一个应用的源代码,比如我们不知道这样的android代码怎么写,我们可以打开模拟器里面的设置(settin ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- Android Environment 判断sd卡是否挂载 获取sd卡目录
在将一个文件存储到sd卡上面的时候,一般需要判断sd是否已经挂载才进行操作. 那么如何判断sd卡已经挂载呢? 我们可以使用Android的Environment类,具体使用如下: if(Environ ...
- Android 获取SD卡路径和推断SD卡是否存在
android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...
随机推荐
- HTTP二、HTTP请求处理过程的七个步骤
HTTP02 HTTP请求处理过程的七个步骤 1.web服务处理步骤 web服务的处理过程可总结为七个步骤: 1)发起请求:客户端向服务器端发起连接请求,建立”三次握手“: 2)接收请 ...
- bzoj3237(cdq+并查集)
这题一眼lct,然而 #include<iostream> #include<cstdio> #include<cmath> #include<cstring ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- 一招让 IOS 自动化化快的飞起
前言 最近在做IOS自动化测试,IOS的Appium环境都配置OK,Demo脚本运行没有问题,多开执行没有问题,IOS安卓统一平台调度集成没有问题,可以进行自动化测试.课时真正执行用例时发现个严重问题 ...
- 利用Qt Designer 进行 空间提升propomotion 的时候异常: NO such file or directory
1. 因为在提升的时候,只设置了 类名,以及文件名,但是没有给定Qt 的uic 的指定搜索路径,因此报错 在生成的ui_xxxx.h文件必然找不到这个文件. 如下图: 2. 解决方法 在项目的属性中: ...
- c语言编程上次输入影响下次记过怎么解决要交作业啦求大神相助
秦时鸥总算知道为什么这里这么多的房屋了,当一座吧台和一张张台球桌清理出来的时候他才发现,原来这渔场还有酒吧和桌球厅.
- idea 2017破解的三种方式
1.该方法最为简便,但是该方法只可以在联网时使用,打开idea主页,找到最后面的Help,打开,找到register-license server, 在输入http://idea.iteblog.co ...
- 《JavaScript 高级程序设计》读书笔记五 引用类型
一 Object类型 a.两种创建方式: 1.new+构造函数Object; 2.对象字面量表示法: b.两种访问属性方式: 1.点表示法(.属性): 2.方括号([“属性”]): 二 Arr ...
- maven项目(多模块)
在eclipse下构建maven项目,该项目由多个子模块组成. 1.创建一个父项目 NEW -->project-->maven-->maven Project,点击下一步,进入ne ...
- 背水一战 Windows 10 (110) - 通知(Tile): secondary tile 模板之基础, secondary tile 模板之文本
[源码下载] 背水一战 Windows 10 (110) - 通知(Tile): secondary tile 模板之基础, secondary tile 模板之文本 作者:webabcd 介绍背水一 ...