SD卡驱动开发随笔(1)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

前不久刚写完SD卡驱动,最后的运行和读写文件效果自己也比较满意以下是性能测试结果

---------------------------------------------------------------------------------------------------------------

File Size is 25165824

Block:00000128Byte,Cost:00006655ms,Average:3781KByte/sec

Block:00001024Byte,Cost:00005752ms,Average:4375KByte/sec

Block:00016384Byte,Cost:00003638ms,Average:6917KByte/sec

Block:00065536Byte,Cost:00003169ms,Average:7941KByte/sec

Block:00262144Byte,Cost:00003041ms,Average:8275KByte/sec

Block:01048576Byte,Cost:00002999ms,Average:8391KByte/sec

Block:02097152Byte,Cost:00003012ms,Average:8355KByte/sec

---------------------------------------------------------------------------------------------------------------

现就把自己所得所想做个清理。

 

按照SD卡的协议的描述可分为2种总线的接口

1.  SD BUS

物理层定义:(具体连接图不在贴出)下面大致介绍下一些数据线的定义

D0-D3    数据传送

CMD     进行CMD Respons

CLK      大家最熟悉的HOST时钟信号线了

VDD VSS  电源和地

2.  SPI BUS 一般用SPI协议的接口来做

物理层定义:

CLK       HOST时钟信号线了

DATAIN    HOST-àSD Card数据信号线

DATAOUT  SD Card àHOST数据信号线

除了以上述数据线外SPI BUS多了CS片选(注意:如果是以SPI方式来写SD卡驱动要注意这点)

通常SD  MMC卡内部会有一些Register

一般有下面几种

1.  CID  卡的识别号

2.  RCA  卡的相对地址

3.  DSR  可选寄存器

4.  CSD  描述操作该卡的规则(时序规则)。包括,数据读/写时间,工作电流,扇区大小,文件系统格式,卡所使用的命令集,写保护等信息。通过该寄存器可以获取卡的容量,访问方式。

5.  SCR  卡的配置寄存器

6.  OCR  卡运行条件寄存器 描述卡的工作电压范围 ,它还还包含一个上电状态标记位用于描述是否完成卡上电过程 (驱动对卡在作初试化动作的时候特别要注意这点)

 

因为我本人是用SD BUS 方式来驱动SD卡所以主要将过程做简单介绍。

 

首先谈下SD协议定义的一些游戏规则:

SD总线的访问状态有3

1 COMMOND:启动操作的会话,由HostCMD连线传送到卡类设备

2 Response:响应CMD的会话,由卡类设备由CMD连线传送至Host

3 Data:在Host与卡设备间传送数据的双向数据流,物理链路为Data0-Data3

注意:每一个完整的操作都需要一个CMD来启动,根据不同的CMD 有相应的DataResponse.

SD可以一主对多从,也可以P2P 所以大家弄清楚P2P的规律,其他的多卡广播也自然明了

按照协议的描述对于P2P的情形是否有数据传输来分4

1.无响应的广播命令-BC

2.响应型的广播命令-BCR

3.无数据传输的点对点命令(AC

4.带数据传输的点对点命令(ADTC

这些会话都有一定的时序。

 

(未写完)待续.......

Linux SD卡驱动开发() —— SD 卡驱动分析HOST篇 回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的。 CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为HOST 层的驱动提供了接口函数。 CARD 部分:因为这些记忆都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将你的SD 如何实现为块设备的。 它们 阅读详情

相关推荐

Linux SD卡驱动开发() —— SD 相关基础概念

一.SD/MMC基础概念 1.1.什么是MMC       MMC:MMC就是MultiMediaCard的缩写,即多媒体。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗电量低,传输速度快,广泛应用于消费类电子产品中。 1.2.什么是SD      SDSD为Secure Digital Memory Card, 即安全数码。它在MMC的基础

知秋一叶 1万+

模拟SPI驱动SD

模拟SPI访问SD程序以及资料

klp1358484518的博客 1401

Linux SD卡驱动开发() —— SD 控制器之真正的硬件操作

前面对SD控制器有了一个基本的介绍。其实SD控制器层更过的意义是为core层提供一种操作SD硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装有操作方法的数据结构,那便是即将闪亮登场的struct mmc_host_ops....对应的host文件为s3cmci.c。     接下来就来揭开与之对应的struct mmc_host_ops

知秋一叶 8914

TF/SD开发驱动SPI

对于SDSPI模式在上电同步后应该马上进行CM0复位进入SPI模式,SDIO模式这步非必要,复位时序在正常情况下都是要求四线都是高电平,这也是为什么外接上拉电阻的原因,如果CS交给硬件管理,那么只会在发送数据的时候拉低CS,完成马上拉高CS,所以不符合这里的时序,还有一个问题就是MOSI在空闲时必须保持高电平,这点非常重要,就算外接上拉电阻复用后也会被拉下来,因为是输出,默认是输出低电平的,所以在发送时钟脉冲的时候MOSI初始为输入IO口就好了,在需要发送数据之前在复用到SPI上。

Ender_LJY的博客 4686

SPI方式驱动SD的方法

<br />对SD驱动主要有初始化、读、写、擦除等。<br />1、初始化步骤:<br />(1)      延时至少74clock<br />(2)      发送CMD0,需要返回0x01,进入Idle状态<br />(3)      循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态。<br />如果是MMC,此步应发送CMD1。<br />2、读步骤:<br />(1)      发送CMD17(单块)或CMD18(多块)读命令,返回0x00<br />(2)      接收

空之轨迹~约修亚 1万+

SD的读写(SD模式和SPI模式)

需要特殊说明的是CRC的问题,这是一种检验错误的方法,具体问题度娘说的还算明白,在SPI模式中,CRC校验默认是关闭的,也就是说这7位必须要发,但是SD会在读到CRC以后自动忽略它,所以全部发1就可以。这里需要说明一下0x40的意思,任何命令都有一个固定的起始格式,即先0后1,这是固定的命令起始标志,前两个字节的二进制码就是:01xx xxxx SD 所有的命令都是由 48 个数据位组成的,其结构如表 2 所示。ACMD指令是通过CMD55命令激活的,用于执行与SD应用相关的操作。

dddds222_的博客 5043

基于SPI模式的SD卡驱动程序

***********************接收数据*****************************//----------------SD、MMC初始化开始------------------//-------------------SD复位到idle开始-------------------//------------------鉴别SD2.0版本结束------------------//---------------MMC额外初始化操作开始-------------

zhangjianfzf的博客 397

全面解析Linux SD卡驱动开发

Linux操作系统之所以强大,部分原因在于其模块化的驱动程序设计。驱动程序是操作系统与硬件设备之间沟通的桥梁。它们的作用是控制和管理硬件设备,使得操作系统能够识别、使用这些设备。对于IT专业人士而言,理解驱动程序的工作原理和结构对于维护、优化系统性能至关重要。FAT32:FAT32是最常见的文件系统之一,它的兼容性非常好,可以被多种操作系统读取。FAT32适用于较小容量的SD。exFAT:exFAT是FAT32的增强版,支持更大的文件和更大的存储容量,适合用于高容量的SD

weixin_35696112的博客 1047

Linux SD卡驱动开发

Linux SD卡驱动开发() —— SD 相关基础概念 Linux SD卡驱动开发() —— SD 卡驱动分析HOST篇 Linux SD卡驱动开发() —— SD 卡驱动分析CORE篇 Linux SD卡驱动开发() —— SD 控制器之真正的硬件操作 Linux SD卡驱动开发() —— SD 卡驱动分析Core补充篇 Linux SD卡驱动开发() —— SD启动过程总体分析 一.SD/MMC基础概念 1.1.什么是MMC MMC:MMC就是MultiM...

RICK 964

Linux SD卡驱动开发() —— SD 卡驱动分析CORE篇

废话不多说,直接切进主题:        Linux在内核源码的drivers/mmc/core文件夹下为我们的提供了一系列SD的接口服务函数。可以查看Makefile如下 可见,core文件夹下有针对总线的服务bus.c,针对主控制器的服务host.c,针对SD的服务sd.c, sd_ops.c等等。其中,最为核心的一个函数便是之前提到的位于core.c的mmc_rescan

知秋一叶 1万+

SD卡驱动

SD卡驱动介绍一、介绍1.SD 2. SD的通讯模式3.SD引脚定义二、SD卡驱动介绍1.SD寄存器介绍2、SD识别流程初始化过程3、读写SDSD读取数据(CMD17):SD写数据(CMD24):三、SD卡驱动源码源文件头文件使用指南在不同的平台下实现以下函数 一、介绍 1.SD 安全数码, 它是在 MMC 的基础上发展而来, 是一种基于半导体快闪记忆器的新一代记忆设备。按容量分类,可以将SD 分为 3 类: SD SDHC SDXC SD(SDSC):0~2G SDHC

qq_45531642的博客 3079

掌握SD卡驱动开发:嵌入式系统关键资料包

51单片机在与SD进行接口连接时,通常使用SPI(Serial Peripheral Interface)模式。这是因为SPI模式下,SD的数据传输效率较高,且硬件连接相对简单。基本连接方式包括将SD的MISO(Master Input Slave Output)、MOSI(Master Output Slave Input)、SCK(Serial Clock)以及CS(Chip Select)信号线连接到51单片机相对应的SPI接口引脚。

weixin_42511832的博客 1160

深入理解S3C2410的SD卡驱动开发

S3C2410是由Samsung公司生产的一款基于ARM920T内核的16/32位RISC处理器,具有丰富的外设接口,其中包括SD控制器。S3C2410支持多种通信接口,如USB、Ethernet和UART等,但是SD接口是其用于存储扩展的重要功能之一。硬件抽象层(HAL)是驱动架构中用于隔离硬件与驱动软件之间复杂性的关键层次。HAL负责提供一组标准化的接口,使得驱动程序可以不关心硬件的具体实现,而只与这些接口交互。

weixin_42587866的博客 1077

sd 卡驱动--基于高通平台

内容来自以下博客: http://blog.csdn.net/qianjin0703/article/details/5918041 Linux设备驱动子系统第二弹 - SD (有介绍SD硬件) http://blog.csdn.net/wavemcu/article/details/7366852     linux2.6内核SD Card Driver详细解析之一 http:

kinbo88的专栏 4718

STM32CubeMx之SD卡驱动

SD存储(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储的技术是从MMC(MultiMedia Card)格式上发展而来,在兼容SD存储基础上发展了SDIO(SD Input/ Output),此兼容性包括机械,电子,电力,信号和软件,通常将SDSDIO俗称SD存储SD/SDIO MMC主机模块(SDIO)在AHB外设总线和多媒体(MMC)SD存储SDIO和CE-ATA设备间提供了操作接口。

weixin_44453694的博客 4228

STM32F407微控制器的SD卡驱动开发教程

STM32F407是由STMicroelectronics(意法半导体)推出的高性能微控制器,属于Cortex-M4核心系列。它带有DSP(数字信号处理器)和FPU(浮点运算单元),具备高速运行能力和出色的信号处理能力。内置高达1MB的闪存和192KB的SRAM,为复杂应用提供足够的内存空间。SDIO(Secure Digital Input Output)是一种通用的串行接口,它在移动设备和嵌入式系统中广泛应用。SDIO接口可以同时支持数据和命令的传输,具备高度的灵活性和扩展性。

weixin_33597080的博客 940

SD卡驱动程序解析

一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、MMC/SD介绍及SDI主机控制器 首先我们来理清几个概念: MMC:(Multi Media Card)由西门子公司和首推CF的SanDisk于1997年推出的多媒体记忆标准。 SD(S...

u010783226的专栏 3458

linux SD卡驱动

Linux SD卡驱动开发() —— SD 相关基础概念 https://blog.csdn.net/zqixiao_09/article/details/51039378 Linux SD卡驱动开发() —— SD 卡驱动分析HOST篇 https://blog.csdn.net/zqixiao_09/article/details/5103...

li5830的博客 1323

STM32F407 SPI SD卡驱动的验证

前言 看到第三方从ST官方移植过来的SPI方式的SD卡驱动,测试一下,很稳定。 上到自己板子后,感觉读写速度很慢,慢的没法用。准备调整提交读写速度,尽量稳定。 在F407板子上的SDSPI方式硬件连接如下, 用了SPI3: ...

博客标题不能为空 3293
上一篇: BootLoader代码简析
下一篇: 感慨万千
Professionaler
博客等级 码龄20年 0粉丝 15原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值