这几天在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. Spring全家桶之spring boot(四)

    spring boot拦截器.过滤器.servlet和健康检查机制  spring boot拦截器 spring boot配置拦截器与原来大致相同,只是需要在拦截器的配置类上添加@Configurat ...

  2. mybatis开发,你用 xml 还是注解?我 pick ...

    最近在看公司项目时发现有的项目mybatis是基于注解开发的,而我个人的习惯是基于xml文件开发. 对于mybatis注解开发的原理理解不够,于是翻阅了部分源码,写下此文.主要介绍了mybatis开发 ...

  3. dokcer入门

    背景: 由于最近在做基于Headless chrome + Robotframework + Docker +Jenkins架构的web自动化测试的预研工作,其中涉及到web自动化持续集成,需要搭建自 ...

  4. python之PyCharm下载和安装教程

    PyCharm 是 JetBrains 公司(www.jetbrains.com)研发,用于开发 Python 的 IDE 开发工具.图 1 所示为 JetBrains 公司开发的多款开发工具,其中很 ...

  5. c++实现lower_bound和upper_bound

    #include <bits/stdc++.h> using namespace std; int a[] = {0,1,3,3,5,6,7,8,9,20,21,21,21,30,41,4 ...

  6. 我的excel是2003版本的,里边有sheet1、sheet2两个工作表,当使用GetOleDbSchemaTable获取表Schema时,结果是4个,分别为: sheet1 sheet1$ sheet2 sheet2$

    原帖地址:http://bbs.csdn.net/topics/310230098 ---------------------------------------------------------- ...

  7. 如何分析和提高(C/C++)程序的编译速度?

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/129354 ...

  8. 一文带你学会基于SpringAop实现操作日志的记录

    前言 大家好,这里是经典鸡翅,今天给大家带来一篇基于SpringAop实现的操作日志记录的解决的方案.大家可能会说,切,操作日志记录这么简单的东西,老生常谈了.不! 网上的操作日志一般就是记录操作人, ...

  9. ngnix随笔三

    1.location模块 在server中也可以嵌套location 例 server{ listen 80; server_name www.a.com; root   /data/vhosts/; ...

  10. python3.7 64bit安装pygame1.9.3

    https://blog.csdn.net/xiaolixi199311/article/details/79209506/