SD卡驱动-程序员宅基地

技术标签: SD  单片机  

一、介绍

1.SD 卡

安全数码卡, 它是在 MMC 的基础上发展而来, 是一种基于半导体快闪记忆器的新一代记忆设备。按容量分类,可以将SD 卡分为 3 类: SD 卡、 SDHC 卡、 SDXC 卡。SD卡(SDSC):0~2G SDHC卡:2~32G SDXC卡:32G~2T

2. SD的通讯模式

  • SD 卡模式(通过 SD 总线通信):允许 4 线的高速数据传输,只能使用 3.3V 的 IO 电平,所以, MCU 一定要能够支持 3.3V 的 IO 端口输出。
  • SPI 模式:同 SD 卡模式相比就是丧失了速度,在 SPI 模式下, CS/MOSI/MISO/CLK 都需要加 10~100K 左右的上拉电阻。
    请添加图片描述

3.SD引脚定义

请添加图片描述

二、SD卡驱动介绍

1.SD寄存器介绍

名称 宽度 描述
CID 128 卡识别寄存器
CSD 128 卡描述数据寄存器:卡操作条件相关的信息数据。
OCR 32 操作条件寄存器
RCA 16 相对卡地址寄存器:本地系统中卡的地址,动态变化,在卡的初始化时确定。(SPI模式中没有)
SCR 64 SD配置寄存器:SD卡特定信息数据

2、SD卡识别流程

请添加图片描述

初始化过程

  1. 初始化与 SD 卡连接的硬件条件(MCU 的 SPI 配置, IO 口配置;
  2. 上电延时(>74 个 CLK)(因为 SD 卡内部有个供电电压上升时间,大概为 64 个 CLK,剩下的 10 个 CLK 用于 SD 卡同步,之后才能开始 CMD0 的操作);
  3. 复位卡(CMD0),进入 IDLE 状态;
  4. 发送 CMD8,检查是否支持 2.0 协议;
  5. 根据不同协议检查 SD 卡(命令包括: CMD55、 CMD41、 CMD58 和 CMD1 等);
  6. 取消片选,发多 8 个 CLK(提供 SD 卡额外的时钟,完成某些操作),结束初始化;

3、读写SD卡

请添加图片描述

SD卡读取数据(CMD17):

  • 发送 CMD17;
  • 接收卡响应 R1;
  • 接收数据起始令牌 0XFE;
  • 接收数据;
  • 接收 2 个字节的 CRC,如果不使用 CRC,这两个字节在读取后可以丢掉。
  • 禁止片选之后,发多 8 个 CLK;

SD卡写数据(CMD24):

  • 发送 CMD24;
  • 接收卡响应 R1;
  • 发送写数据起始令牌 0XFE;
  • 发送数据;
  • 发送 2 字节的伪 CRC;
  • 禁止片选之后,发多 8 个 CLK;

三、SD卡驱动源码

源文件

#include "mmc_sd.h"

uint8_t  SD_Type = 0;//SD卡的类型
uint32_t Capacity = 0; //可用扇区数

移植修改区///
//SPI初始化
void hal_spi_init(void)
{
   
    

}

/*****************************************************************************
** 描  述:写入一个字节 
** 入  参:Dat:待写入的数据
** 返回值:读出的数据
******************************************************************************/
uint8_t SD_SPI_ReadWriteByte(uint8_t Dat)
{
   
    
	/**
		根据不同平台进行实现
		****/
}

//取消选择,释放SPI总线
void SD_DisSelect(void)
{
   
    
    SD_CS_HIGH_HRS();
    SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟
}

//选择sd卡,并且等待卡准备OK
//返回值:0,成功;1,失败;
uint8_t SD_Select(void)
{
   
    
    SD_CS_LOW_HRS();
    if(SD_WaitReady()==0)return 0;//等待成功
    SD_DisSelect();
    return 1;//等待失败
}
///

//等待卡准备好
//返回值:0,准备好了;其他,错误代码
uint8_t SD_WaitReady(void)
{
   
    
    uint32_t t=0;
    do
    {
   
    
        if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK
        t++;
    }
    while(t<0XFFFFFF); //等待
    return 1;
}
//等待SD卡回应
//Response:要得到的回应值
//返回值:0,成功得到了该回应值
//    其他,得到回应值失败
uint8_t SD_GetResponse(uint8_t Response)
{
   
    
    uint16_t Count=0xFFF;//等待次数
    while ((SD_SPI_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到准确的回应
    if (Count==0)return MSD_RESPONSE_FAILURE;//得到回应失败
    else return MSD_RESPONSE_NO_ERROR;//正确回应
}
//从sd卡读取一个数据包的内容
//buf:数据缓存区
//len:要读取的数据长度.
//返回值:0,成功;其他,失败;
uint8_t SD_RecvData(uint8_t*buf,uint16_t len)
{
   
    
    if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
    while(len--)//开始接收数据
    {
   
    
        *buf=SD_SPI_ReadWriteByte(0xFF);
        buf++;
    }
    //下面是2个伪CRC(dummy CRC)
    SD_SPI_ReadWriteByte(0xFF);
    SD_SPI_ReadWriteByte(0xFF);
    return 0;//读取成功
}
//向sd卡写入一个数据包的内容 512字节
//buf:数据缓存区
//cmd:指令
//返回值:0,成功;其他,失败;
uint8_t SD_SendBlock(uint8_t*buf,uint8_t cmd)
{
   
    
    uint16_t t;
    if(SD_WaitReady())return 1;//等待准备失效
    SD_SPI_ReadWriteByte(cmd);
    if(cmd!=0XFD)//不是结束指令
    {
   
    
        for(t=0; t<512; t++)SD_SPI_ReadWriteByte(buf[t]); //提高速度,减少函数传参时间
        SD_SPI_ReadWriteByte(0xFF);//忽略crc
        SD_SPI_ReadWriteByte(0xFF);
        t=SD_SPI_ReadWriteByte(0xFF);//接收响应
        if((t&0x1F)!=0x05)return 2;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45531642/article/details/121035050

智能推荐

机器学习中的模型评价策略metric(ROC,PR,AUC,F1)_auc metric-程序员宅基地

文章浏览阅读977次,点赞2次,收藏3次。TP(真阳性 true positives)TN(真阴性 true negatives) FP(假阳性 false positives) FN(假阴性 false negatives)混淆矩阵:图一_auc metric

npm 安装报错 "npm ERR! code Z_BUF_ERROR" 问题解决_npm install zlib: unexpected end of file-程序员宅基地

文章浏览阅读446次。一、引言最近在做vue项目后,需要执行一个 npm install 的命令来安装项目所需要的依赖文件,但是报错了:I’m all done. Running npm install for you to install the required dependencies. If this fails, try running the command yourself.npm ERR! ..._npm install zlib: unexpected end of file

[golang][history]The Go Annotated Specification\ Go注释规范 266b9d49bfa3d2d16b4111378b1f9794373ee141...-程序员宅基地

文章浏览阅读480次。266b9d49bfa3d2d16b4111378b1f9794373ee141The Go Annotated SpecificationThis document supersedes all previous Go spec attempts. The intentis to make this a reference for syntax and semantics. ..._京器晴bfa49d

视觉SLAM十四讲笔记(超级通俗易懂哦~)_视觉slam十四讲ppt-程序员宅基地

文章浏览阅读1.6w次,点赞50次,收藏361次。第二讲 初识SLAM传感器 Sensors两类传感器:安装于环境中的:二维码,GPS,携带于机器人本体的:对比激光和相机两大类传感器,激光建图基本上已经研究清楚,视觉SLAM还没有稳定可靠运行摄像头:轻便、便宜、信息丰富缺点:遮挡、受光照影响、计算量大、单目,双目,深度相机(TOF/结构光)..._视觉slam十四讲ppt

@Entity和@Table_"@entity @table( name = \"wcs_robot_configuration\-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏11次。@Entity注释指名这是一个实体Bean,@Table注释指定了Entity所要映射带数据库表,其中@Table.name()用来指定映射表的表名。如果缺省@Table注释,系统默认采用类名作为映射表的表名。实体Bean的每个实例代表数据表中的一行数据,行中的一列对应实例中的一个属性。@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:1)name:映射的列名。如..._"@entity @table( name = \"wcs_robot_configuration\" )"

Linux 磁盘管理_emmc 启动,怎么查看内核文件系统的分区大小-程序员宅基地

文章浏览阅读1.6k次。Linux分区实践_emmc 启动,怎么查看内核文件系统的分区大小

随便推点

EXCEL 字符串截取 获取最后1个分割字符起始位置_excel根据分割取最后一个-程序员宅基地

文章浏览阅读455次,点赞8次,收藏5次。# 获取分隔符 将分隔符 替换 未空格 扩容 N倍。## 整个字符长度 减去 最后一个字段长度。##截取后N长度的字符,_excel根据分割取最后一个

snmp 中的MIB变量ifInOctets and ifOutOctets 溢出问题_if out octets-程序员宅基地

文章浏览阅读7.6k次。snmp 中进行流量统计的MIB变量ifInOctets and ifOutOctets 溢出问题 在MRTG中进行流量统计是通过采集ifInOctets and ifOutOctets ,等过一段时间再采集这两个值,然后进行相减就得出这一段时间的平均流量,如果这个数出现溢出就会出现问题。 snmp 中进行流量统计的MIB变量ifInOctets and ifOutOctet_if out octets

HttpWebRequest的GetResponse()超时问题_httpwebresponse response = request.getresponse() a-程序员宅基地

文章浏览阅读3.1k次。本人遇到的问题只针对极个别的需要的朋友,这种情况比较少见。先说下,触发情况,post请求,application/x-www-form-urlencoded格式。第一,参数是否需要urlencode,例如:string name="张三";var newname=HttpUtility.UrlEncode(name);string body=$"key={newname}";..._httpwebresponse response = request.getresponse() as httpwebresponse,操作超时

原北京计算机学院并入那个学校了,北京高校合并历史,仅存一所本科“联合大学”的诞生...-程序员宅基地

文章浏览阅读2.6k次。原标题:北京高校合并历史,仅存一所本科“联合大学”的诞生提起“联合大学”,大家的第一反应是高校重组和赫赫有名的西南联合大学。除西南联大外,国内还有这么6所大学曾使用过“联合大学”之名,而如今以“联合大学”命名的只剩北京一所。北京联合大学1985年开始组建,名字的由来是因为期初由十五所分院联合组建而成。今天小编为您梳理20世纪90年代以来,特别是在2000年前后北京市高校在高校重组、合并浪潮中的变化..._北京计算机学院 更名为

拯救狗屎代码:基于 Gitlab 的代码审查,简单实用_git的approvers-程序员宅基地

文章浏览阅读1.1k次。作者:刘凯_7013https://www.jianshu.com/p/5d764b52ea88code review 的目的是提高代码质量,减少开发bug,俗话说,三人行必有我师,众人拾柴火焰高。gitlab提供了code review机制,对基于gitlab的code review,直接以具体例子的形式做个实践总结。gitlab提供了两种代码merge机制:1)在本地将源分支(Source branch)代码合并到目标分支(Target branch),然后Push到目标分支(Target._git的approvers

黑马程序员-Java高级:反射_有三个类student,teacher,worker-程序员宅基地

文章浏览阅读799次。——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——反射与动态代理一、类加载器 我们已经知道一个Java程序是由很多的类,以及这些类的对象组成的,因为类是创建对象的模板,所以当某个Java程序中需要使用某个类,那么JVM就会将该类加载到内存,并为之创建一个Class类的对象。 注意:Java中每一个类或接口都会有一个对应的Class类的对象,该对象用于描述所有类共_有三个类student,teacher,worker