这几天在FPGA调试与SD通信,读SD卡里的图片,之前接触32时没有去研究过SD卡,不太熟悉操作流程,在网上找了很多资料,也看了几个32开发板的资料,但大多数都讲得不是特别清楚,只能瞎操作了一番,在别人的代码做了修改,能初始化成功,但是读数据一直有问题,加上用Arria 10在Quartus下编译比较慢,下载验证也比较慢,调了好几天才调好,在此总结一下,读操作按照SD协议来,读单块发送CMD17,加扇区地址,加一字节FF如下:

发送读操作指令后,SD会有一字节00应答,这一点很重要,我在找资料过程中没有人特别说明这点,所以有段时间卡在这,没法确定发送的指令SD是否接收辨识到。

发送读操作指令且有应答后,就一直给SD卡提供时钟,通常是一直发送0xFF,此时发送的数据无关紧要,只要紧紧关注SD的回应,当SD回应0xFE时就说明SD在传数据给你了,这一点也非常重要,我找资料时有网友提到这,但是没有特别提醒,所以也纠结在这,不知道什么时候数据有效,再次强调,发送CMD17和扇区地址后,一直提供时钟,并检测SD回应,当SD卡回应0xFE时指示接下来的数据为有效数据,如下截图:

如果已经到以上步骤了,那说明已经快接近成功了,接下来是非常关键的,也是让我折腾了几天没弄出来的,其实就是没有理解给的扇区地址的问题,网上找了好多资料,大多数都会提到SD卡的逻辑地址和物理地址,但是就没谁点一下,不使用FAT文件系统,直接读SD卡,应该读逻辑地址还是物理地址,自己折腾了几天,在此总结一下:

当你使用SPI或SDIO方式直接读SD卡时,应该直接读你用WinHex看到的物理扇区地址!!!直接读你用WinHex看到的物理扇区地址!!!直接读它,我就是因为不知道该读哪个,一直读看到的逻辑扇区地址,数据一直对不上,然后一直以为是通信时序问题,浪费了好多时间。下面是我实际操作的截图,简单说明一下,供参考。

我实验时先读0扇区的数据,看看对不对(因为0扇区一定有数据,SD保留区域),通过WinHex查看0扇区的物理扇区地址如下:

FPGA读到后送到RAM查看得到数据如下:

对比两张截图,可以清晰的得到结论,直接读SD的数据时,地址选物理扇区地址,才能正确读出来对应的数据。

以下是我在SD卡存了图片,读出来的数据对比:

先是WinHex查看到的图片的物理扇区地址:46144

FPGA读该地址并送到RAM中查看得到数据如下:

两张图片对比都一致。

FPGA之SPI SD卡读操作的更多相关文章

  1. Android入门开发之SD卡读写操作(转)

    SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String  sdCardRoot = Environment.getE ...

  2. 关于2440的裸跑程序中SD卡读后不能成功写入问题的讨论

    问题描述: TQ2440的官方裸跑程序中,对SD卡先进行读操作,然后再写,发现不能程序卡死.倘若对SD卡先写后读,程序可以正常运行,奇哉怪哉? 写数据的关键代码--> while(i < ...

  3. [SD卡] FPGA笔记之SD卡

    1.数据怎么存进去的? 其中的sd_miso就是接收的1位数据,n个时钟下就收到n个数据,比如n=21. 2.如何做到先发送高位?

  4. SPI模式下MCU对SD卡的控制及操作命令

    一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...

  5. SPI模式下MCU对SD卡的控制及操作命令(转)

    源:SPI模式下MCU对SD卡的控制及操作命令 一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控 ...

  6. SD卡 模拟SPI总线控制流程

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  7. [FatFs 学习] SD卡总结-SPI模式

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  8. Android 常见SD卡操作

    目录 Android 常见SD卡操作 Android 常见SD卡操作 参考 https://blog.csdn.net/mad1989/article/details/37568667. [0.] E ...

  9. STM32之SD卡

    目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...

随机推荐

  1. [Asp.Net Core] Blazor WebAssembly - 工程向 - 如何在欢迎页面里, 预先加载wasm所需的文件

    前言, Blazor Assembly 需要最少 1.9M 的下载量.  ( Blazor WebAssembly 船新项目下载量测试 , 仅供参考. ) 随着程序越来越复杂, 引用的东西越来越多,  ...

  2. Java——线程安全的集合

    线程安全的集合    java.util.concurrent包:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,Concu ...

  3. WordPress获取某个标签关联的分类

    反过来,我们可能会有这样的需求,既然可以获取某个分类的关联标签,那我能获取某个标签的关联分类吗?答案是可以的,将上面的代码稍微改一下就可以了: function ludou_get_tag_categ ...

  4. Spring的bean创建方式ref使用方法

    java public class UserServiceImp implements UserService{ private UserDao userDao =null; public void ...

  5. Python的多线程锁跟队列

    一.互斥锁: 1.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁. 2.互斥锁为资源引入一个状态:锁定.非锁定 3.某个线程要更改共享数据是,先将其锁定.此时资源的状态为锁定, ...

  6. android小Demo--七彩霓虹灯效果

    七彩霓虹灯效果,基于网上的小Demo进行修改. 在android项目values文件夹下创建文件colors.xml,配置七种颜色: <?xml version="1.0" ...

  7. 03 . Nginx日志配置及日志切割

    Nginx日志 日志对于统计排错来说是非常有利的,Nginx日志主要分为两种: access_log(访问日志)和error_log(错误日志),通过访问日志可以得到用户的IP地址.浏览器的信息,请求 ...

  8. 【译】Welcome to C# 9.0

    C# 9.0正在形成,我想分享我们对添加到该语言下个版本的一些主要功能的看法.对于每个新版本的 C#,我们努力使常见的编码方案更加清晰和简单,C# 9.0 也不例外.这次的一个特别重点是支持数据形状的 ...

  9. 深入理解JS:var、let、const的异同

    目录 序言 var 与 let 的区别 作用域 重复声明 绑定全局对象 变量提升与暂存死区 let 与 const 异同 参考 1.序言 var.let 和 const 都是 JavaScript 中 ...

  10. Alpha总结展望——前事不忘后事之师

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Alpha总结展望--前事不忘后事之师 这个作业的目标 Alpha总结展望 作业正文 正文 其他参考文献 无 一.个人感想总结 吴秋悦: 对Alph ...