SD驱动调试

ZynqMP ZCU102 SD卡驱动调试实战:从设备树配置到电压问题解决 本文详细记录了在ZynqMP ZCU102平台上调试SD卡驱动的实战过程,重点解决了因设备树配置不当导致的SD卡初始化失败问题。文章深入分析了`error -84`错误的根源,特别是电压不匹配这一关键因素,并提供了从设备树配置、引脚电压标准设置到利用`no-1-8-v`属性等核心调试技巧与解决方案,帮助开发者快速定位并解决类似硬件驱动兼容性问题。 阅读详情
 

SD卡调试要点

SPI模式下SD卡调试的最主要工作是熟悉SD的相关规范,特别是理解关于SD卡的的读写时序。以下为调试过程中的一些要点:

SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多CPU内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。

 

SD卡自身有完备的命令系统,以实现各项操作。命令格式如下:

 

命令的传输过程采用发送应答机制,过程如下:

 

每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

字节

位

含义

1

7

开始位,始终为0

6

参数错误

5

地址错误

4

擦除序列错误

3

CRC错误

2

非法命令

1

擦除复位

0

闲置状态

字节

位

含义

1

7

开始位,始终为0

6

参数错误

5

地址错误

4

擦除序列错误

3

CRC错误

2

非法命令

1

擦除复位

0

闲置状态

2

7

溢出,CSD覆盖

6

擦除参数

5

写保护非法

4

卡ECC失败

3

卡控制器错误

2

未知错误

1

写保护擦除跳过,锁/解锁失败

0

锁卡

字节

位

含义

1

7

开始位,始终为0

6

参数错误

5

地址错误

4

擦除序列错误

3

CRC错误

2

非法命令

1

擦除复位

0

闲置状态

2~5

全部

操作条件寄存器,高位在前

1.   复位及其初始化。

SD卡的复位很简单,规范里写的也很详细,个人认为基本不存在太大问题。首先是74个clk,然后CS_LOW;发送CMD0,收到的应答是0x01;接着发送CMD1,收到的应答应该是0x00;最后CS_HIGH。至此,复位完成。需要注意的问题:此时的时钟不宜太快,可以在SD卡初始化完成后可提高数据读写速度;在发送命令之前和收到应答位之后,主控制器应该发送8个时钟完成相应操作。具体的时序图如下:

初始化是通过发送CMD1来进行的,具体时序图如下:

 

需要注意的是:SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的。在以前的实验中,很多是因为疏忽了这一点,而使初始化不成功。随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式。

2.   读取CID及其CSD

CID寄存器存储了SD卡的标识码。每一个卡都有唯一的标识码。

CID寄存器长度为128位。它的寄存器结构如下:

名称

域

数据宽度

CID划分

生产标识号

MID

8

[127:120]

OEM/应用标识

OID

16

[119:104]

产品名称

PNM

40

[103:64]

产品版本

PRV

8

[63:56]

产品序列号

PSN

32

[55:24]

保留

-

4

[23:20]

生产日期

MDT

12

[19:8]

CRC7校验合

CRC

7

[7:1]

未使用,始终为1

-

1

[0:0]

读取CID 的时序图如下:

CSD(Card-Specific Data)寄存器提供了读写SD卡的一些信息。其中的一些单元可以由用户重新编程。具体的CSD结构如下:

名称

域

数据宽度

单元类型

CSD划分

CSD结构

CSD_STRUCTURE

2

R

[127:126]

保留

-

6

R

[125:120]

数据读取时间1

TAAC

8

R

[119:112]

数据在CLK周期内读取时间2(NSAC*100)

NSAC

8

R

[111:104]

最大数据传输率

TRAN_SPEED

8

R

[103:96]

卡命令集合

CCC

12

R

[95:84]

最大读取数据块长

READ_BL_LEN

4

R

[83:80]

允许读的部分块

READ_BL_PARTIAL

1

R

[79:79]

非线写块

WRITE_BLK_MISALIGN

1

R

[78:78]

非线读块

READ_BLK_MISALIGN

1

R

[77:77]

DSR条件

DSR_IMP

1

R

[76:76]

保留

-

2

R

[75:74]

设备容量

C_SIZE

12

R

[73:62]

最大读取电流@VDD min

VDD_R_CURR_MIN

3

R

[61:59]

最大读取电流@VDD max

VDD_R_CURR_MAX

3

R

[58:56]

最大写电流@VDD min

VDD_W_CURR_MIN

3

R

[55:53]

最大写电流@VDD max

VDD_W_CURR_MAX

3

R

[52:50]

设备容量乘子

C_SIZE_MULT

3

R

[49:47]

擦除单块使能

ERASE_BLK_EN

1

R

[46:46]

擦除扇区大小

SECTOR_SIZE

7

R

[45:39]

写保护群大小

WP_GRP_SIZE

7

R

[38:32]

写保护群使能

WP_GRP_ENABLE

1

R

[31:31]

保留

-

2

R

[30:29]

写速度因子

R2W_FACTOR

3

R

[28:26]

最大写数据块长度

WRITE_BL_LEN

4

R

[25:22]

允许写的部分部

WRITE_BL_PARTIAL

1

R

[21:21]

保留

-

5

R

[20:16]

文件系统群

FILE_OFRMAT_GRP

1

R/W

[15:15]

拷贝标志

COPY

1

R/W

[14:14]

永久写保护

PERM_WRITE_PROTECT

1

R/W

[13:13]

暂时写保护

TMP_WRITE_PROTECT

1

R/W

[12:12]

文件系统

FIL_FORMAT

2

R/W

[11:10]

保留

-

2

R/W

[9:8]

CRC

CRC

7

R/W

[7:1]

未用,始终为1

-

1

 

[0:0]

读取CSD 的时序图如下:

 

综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,如卡的容量等信息。

3.   扇区数据读取

扇区读是对SD卡驱动的目的之一。SD卡的每一个扇区中有512个字节,一次扇区读操作将把某一个扇区内的512个字节全部读出。过程很简单,先写入命令,在得到相应的回应后,开始数据读取。

读取单块数据流程:CS_LOW-->8个clk-->发送CMD17-->接收响应R1-->接收读数据起始令牌0xFE-->接收数据-->接收CRC-->8个clk-->CS_HIGH。

数据读取的时序图如下:

4.   扇区数据写入

扇区写是SD卡驱动的另一目的。每次扇区写操作将向SD卡的某个扇区中写入512个字节。过程与扇区读相似,只是数据的方向相反与写入命令不同而已。

写入单块数据流程:CS_LOW-->8个clk-->发送CMD24-->接收响应R1-->写入读数据起始令牌0xFE-->写入数据-->接收CRC-->8个clk-->CS_HIGH。

数据写入的时序图如下:

总之,进行单块数据读写的流程图如下:

5.   文件系统

个人认为相对比较困难的是FAT32文件系统的理解和掌握。文件以只写方式打开文件的流程如下图所示。

FAT32分为几个区域,这里将简单对它们的结构与在文件存储中的功能要点进行描述。

Ø  DBR(DOS BOOT RECORD 操作系统引导记录区)

DBR是我们进军FAT32的首道防线。其实DBR中的BPB部分才是这一区域的核心部分(第12~90字节为BPB),只有深入详实的理解了BPB的意义,才能够更好的实现和操控FAT32。其实对我们有用的数据只不过90个字节。仅仅是这90个字节就可以告诉我们关于磁盘的很多信息,比如每扇区字节数、每簇扇区数、磁道扇区数等等。对于这些信息的读取,只要遵循DBR中的字段定义即可。

Ø  FAT(文件分配表)

FAT表是FAT32文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。可以说FAT表是FAT32文件系统最有特色的一部分,它的链式存储机制也是FAT32的精华所在,也正因为有了它才使得数据的存储可以不连续,使磁盘的功能发挥得更为出色。

Ø  根目录区

在FAT32中其实已经把文件的概念进行扩展,目录同样也是文件,从根目录的地位与其它目录是相同的,因此根目录也被看作是文件。既然是文件就会有文件名,根目录的名称就是磁盘的卷标。

每一个文件都对应一个描述它属性的结构,定义如下:

FAT32文件目录项32个字节的定义

字节偏移量

字数量

定义

0~7

8

文件名

8~10

3

扩展名

11

1

属性字节

0x00 (读写)

0x01 (只读)

0x02 (隐藏)

0x04 (系统)

0x08 (卷标)

0x10 (子目录)

0x20 (归档)

12

1

系统保留

13

1

创建时间的10毫秒位

14~15

2

文件创建时间

16~17

2

文件创建日期

18~19

2

文件最后访问日期

20~21

2

文件起始簇号的高16 位

22~23

2

文件的最近修改时间

24~25

2

文件的最近修改日期

26~27

2

文件起始簇号的低16 位

28~31

4

表示文件的长度

 

至此对于FAT32文件系统根目录下的文件读取就已经实现了,至于多级子目录结构可以像查找文件的首簇一样查找某一级目录名的首簇,然后再到此簇下去找下一级目录的首簇,直到最终的文件。

STM32L4 SDIO驱动SD卡原理与实战调试 SDIO(Secure Digital Input Output)是嵌入式系统中复用SD卡槽实现外设通信的关键总线协议,其本质是在SD存储协议基础上扩展的低引脚数、高兼容性接口标准。它基于标准SD物理层,支持单线/四线模式,通过CMD、CLK、D0等信号完成命令交互与数据传输,广泛应用于Wi-Fi、蓝牙及本地日志存储等场景。在STM32平台,SDIO功能由SDMMC外设实现,需严格匹配时钟分频(如PCLK2→20MHz)、SD/MMC模式选择、1-bit总线配置及HAL状态机初始化流程。本文围绕STM32L 阅读详情

相关推荐

嵌入式Linux实战:RK3576平台SD卡驱动调试全记录(附完整dts配置)

本文详细记录了在RK3576嵌入式Linux平台上调试SD卡驱动的全过程。针对SD卡无法识别和初始化超时两大难题,深入分析了卡检测(CD)信号的特殊性以及电压切换时序问题,并提供了经过验证的完整设备树(dts)配置方案,为开发者解决同类问题提供了实战参考。

weixin_29192365的博客 398

SD卡读写测试(二)

SPI的通信原理比较简单,它以主从方式工作,通常有一个主设备(FPGA)和一个或多个从设备,SPI通信需要四根线,分别为SPI_CS、SPI_CLK、SPI_MOSI、SPI_MISO,其中前三根信号线是由主机输送给从机,SPI_MISO是从机发送给主机。SPI_MOSI和SPI_MISO是主机发送和接收的数据,一般而言,SPI通信有四种不同的模式,不同的设备在出厂的时候被厂家配置为其中 的一种模式,模式是不允许用户修改的,主设备和从设备必须在同一模式下进行通信否则数据会接收错误。

2403_86572833的博客 2133

zynqmp zcu102 SD卡驱动设备树配置与调试实战

本文详细解析了在Xilinx Zynq UltraScale+ MPSoC ZCU102开发板上配置SD卡驱动时,因设备树电压协商不匹配导致“error -84”错误的实战解决方案。通过深度分析SD卡协议与硬件电路,重点阐述了如何正确配置sdhci0设备树节点,特别是使用`no-1-8-v`属性绕过电压协商冲突,并提供了关键的调试技巧与性能调优建议。

weixin_29188997的博客 421

简述sd卡2.0协议_【正点原子FPGA连载】第十二章SD卡读写TXT文本实验-领航者 ZYNQ 之嵌入式开发指南...

1)实验平台:正点原子领航者ZYNQ开发板2)平台购买地址:https://item.taobao.com/item.htm?&id=6061601087613)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html4)对正点原子FPGA感兴趣的同学可以加群讨论:8767449005)关注正点原子...

weixin_39528289的博客 2161

嵌入式开发中的时间陷阱:SD3078驱动开发常见误区与调试指南

本文深入探讨嵌入式开发中SD3078实时时钟芯片的驱动开发常见误区与调试技巧。针对HC32L130 MCU平台,详细解析GPIO模拟I2C通信的硬件配置陷阱、时序精确控制方法、电源管理策略及数据可靠性保障机制,帮助开发者规避时间陷阱,提升RTC模块的稳定性和精度。

nginx7reverse的博客 692

RT-Thread SD/eMMC驱动调试三阶法:状态验证、日志分级与报文追踪

SD/eMMC存储驱动是嵌入式系统中连接硬件与文件系统的关键中间件,其核心依赖于MMC协议栈的正确实现与可观测性保障。原理上,驱动需完成主机初始化、卡识别(CMD0/CMD2/CMD3)、电压/时序配置及块设备注册;技术价值在于支撑固件升级、日志持久化与高可靠数据存取;典型应用场景涵盖工业控制、边缘网关与车载终端等对存储稳定性要求严苛的领域。本文围绕RT-Thread平台,深入解析运行时设备状态验证(如list_device输出语义)、双层级日志控制机制(RT_DEBUG_DRIVER与RT_MMCSD_D

weixin_42599908的博客 48

STM32开发_利用SPI协议读写SD卡、介绍SD卡SPI时序

SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。

1万+

嵌入式老鸟带你玩转SD/MMC控制器:从寄存器配置到驱动调试的完整心法

本文由嵌入式专家分享SD/MMC控制器的实战经验,涵盖寄存器配置、驱动调试及性能优化。通过STM32H743平台和SanDisk Extreme Pro SD卡的实例,详细解析硬件架构、协议栈实现及常见问题解决方案,帮助开发者提升存储子系统设计能力。

weixin_42567752的博客 432

SD卡相关时序

SD卡初始化:

hang_zz的博客 675

RK3399平台开发系列讲解(内核调试篇)2.27、SD等存储设备驱动常用调试方法

一、简单读写测试 1、写入数据 2、读出数据 二、查看当前系统支持文件系统 三、获取SD卡/eMMC基本信息

内核笔记 3760

SD存储设备驱动调试方法及单片机实现

在读取数据时,需要先发送CMD17命令,并带上读取的起始地址,之后便可以不断接收数据块。在写入数据时,需要先发送CMD24命令,并带上写入的起始地址,之后可以不断发送数据块。在SD卡读写之前,需要进行初始化操作。在开发过程中,需要密切关注SD卡状态、异常情况和性能瓶颈等,不断完善和优化驱动程序,提高系统稳定性和数据传输效率。SD存储设备在嵌入式系统中应用广泛,但是SD卡的驱动开发较为复杂,需要一定的经验和技巧。发送的命令需要包含命令码、参数、CRC等信息,接收的响应包括响应码、状态寄存器等信息。

qq_37934722的博客 357

SD2.0 Specification之时钟(频率)与时序

本文章主要讲解SD2.0的时钟与时序。

云中屋的博客 2701

展锐UDX710:MMC概述、SD Card驱动解析及调试

展锐UDX710平台 Linux MMC SD卡驱动

不秃头的程序猿Gabriel的博客 4106

从SD卡驱动入门Linux驱动开发:协议、框架与调试实战

在嵌入式Linux系统中,驱动开发往往涉及总线协议、设备模型与中断管理等复杂概念。理解这些底层机制,通常从一种简单而完整的设备入手,SD卡驱动正是理想切入点。它涵盖主机控制器、命令响应、DMA传输、热插拔检测及块设备对接等核心要素。通过学习SD卡协议的命令结构、寄存器布局和卡识别流程,可以快速建立对Linux MMC子系统分层架构的认知。实践层面,MMC核心层与主机控制器驱动的回调机制,提供了清晰的可扩展框架。配合逻辑分析仪与内核调试信息,可高效排查电源、时钟、命令交互等典型故障。掌握这套方法论后,再扩展至

weixin_33910191的博客 207

通达信+大智慧数据同步存调DLL

数据同步存调DLL(通达信版+大智慧版)

guleba的博客 2050

FortiOS路径遍历漏洞CVE-2022-41328实战复现:从环境搭建到漏洞利用全记录

本文深入解析FortiOS路径遍历漏洞CVE-2022-41328,从漏洞背景、影响范围到技术原理进行全面剖析。提供详细的漏洞复现环境搭建步骤和实战利用方法,并给出官方修复方案与临时缓解措施,帮助企业有效防御此类防火墙漏洞风险。

weixin_30485379的博客 522

RK3576 SD卡热插拔失效的硬件与驱动协同调试指南

SD卡热插拔是嵌入式Linux系统中典型的软硬协同场景,其核心依赖于Card Detect(CD)信号的物理电平、设备树配置与内核驱动逻辑三者严格一致。CD信号作为SDMMC控制器初始化的前提条件,若硬件未提供确定电平(如悬空或上下拉缺失),或设备树中active-low/active-high属性与实际电路不匹配,将导致内核probe阶段静默退出,表现为/dev/mmcblk*设备缺失、dmesg无日志等‘无错失败’现象。RK3576因CD引脚无内置上下拉、默认active-low契约及中断易受噪声干扰等

weixin_29163857的博客 299

RV1106G3的AOV下的yolov5调试记录

本文介绍了基于LuckFoxPicoMax开发板的RV1106芯片调试经验,重点包括AOV(Always-On Vision)和Yolov5目标检测的实现。在硬件方面,板载1TOPS NPU、256MB内存,并更换为SPI NOR存储。软件调试涉及MK配置文件修改、设备树调整(按键唤醒和sensor配置)以及程序自启动设置。Yolov5模型优化为320*320尺寸,推理时间约45ms。系统采用VI采图与AI识别通过共享内存通信的方案,实测功耗在20-35mA范围。文章还指出了当前存在的功耗优化、ISP调试等

fzktongyong的博客 1710

SD NAND选型与驱动调试实战:从SPI Flash到eMMC的嵌入式存储方案

在嵌入式系统开发中,非易失存储选型直接影响数据可靠性与产品寿命。SPI NOR Flash、SPI NAND Flash和SD NAND是三种常见方案,其中SD NAND通过集成控制器实现坏块管理与磨损均衡,对外提供标准SD/SPI接口,显著降低MCU端的软件复杂度。其核心原理在于FTL闪存转换层,负责逻辑地址到物理页的映射,并支持静态磨损均衡与ECC纠错,从而提升写入寿命与数据保持能力。对于数据记录仪、音视频缓存、工业日志等场景,SD NAND在容量、成本与易用性之间取得了平衡。然而,选型时需关注接口模式

weixin_34326429的博客 248

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4540

Python 爬虫实战:全面解析雪球网用户投资组合数据采集

本文介绍了如何使用 Python 爬虫技术,抓取雪球网用户的投资组合信息。通过模拟登录、解析页面内容等步骤,获取了用户的持仓数据。未来,可以进一步探索以下方向:

2201_76125261的博客 1304

SD卡驱动调试经验

做SD/MMC卡驱动的项目也有大半年了,总觉得该总结些什么了。在这里,主要就是记录一些比较常见的问题及解决方法,以免再一次遇到。 首先就是SD/MMC卡的初始化错误问题。在找错误之前,先确认:1.用读卡器确认这张SD卡是否损坏;2.用另一套环境(一样的程序)读取同一张卡,是否正常;3.用相同的环境读取另外一张SD卡是否正常。如果是1,那么就直接退出本文章了;如果是2,那么就是该环境上出现虚焊短路

bingqingsuimeng的专栏 4999

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 997
上一篇: Makefile and Example
下一篇: SD 卡驱动程序分析
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值