FPGA之SPI SD卡读操作
这几天在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卡读操作的更多相关文章
- Android入门开发之SD卡读写操作(转)
SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getE ...
- 关于2440的裸跑程序中SD卡读后不能成功写入问题的讨论
问题描述: TQ2440的官方裸跑程序中,对SD卡先进行读操作,然后再写,发现不能程序卡死.倘若对SD卡先写后读,程序可以正常运行,奇哉怪哉? 写数据的关键代码--> while(i < ...
- [SD卡] FPGA笔记之SD卡
1.数据怎么存进去的? 其中的sd_miso就是接收的1位数据,n个时钟下就收到n个数据,比如n=21. 2.如何做到先发送高位?
- SPI模式下MCU对SD卡的控制及操作命令
一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...
- SPI模式下MCU对SD卡的控制及操作命令(转)
源:SPI模式下MCU对SD卡的控制及操作命令 一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控 ...
- SD卡 模拟SPI总线控制流程
SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...
- [FatFs 学习] SD卡总结-SPI模式
SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...
- Android 常见SD卡操作
目录 Android 常见SD卡操作 Android 常见SD卡操作 参考 https://blog.csdn.net/mad1989/article/details/37568667. [0.] E ...
- STM32之SD卡
目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...
随机推荐
- java ->大的数据运算(BigInteger)
大数据运算 BigInteger java中long型为最大整数类型,对于超过long型的数据如何去表示呢.在Java的世界中,超过long型的整数已经不能被称为整数了,它们被封装成BigIntege ...
- QQ恢复解散后的群聊或删除后的好友的方法
今天有一个群被一个管理员乱踢人,之后将群解散. 事后几分钟我在想有没有什么方法可以重新恢复的方法,之后进入了QQ的官网进行查找. 本来以为没希望了,但是奇迹发生了. 原来真的可以恢复! 恢复的详情: ...
- pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named
参考了这个解决办法:https://blog.csdn.net/qq_36829091/article/details/82180866 我的是Windows,linux的和Windows的解决办法有 ...
- 「雕爷学编程」Arduino动手做(23)——矩形脉冲发生器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- express.static设置缓存
之前因为服务器端脚本不大,都是直接手写,按请求文件后缀名设置cache-control的max-age. 今天决定还是改成express,发现原来express.static()方法设置缓存,直接在参 ...
- JetBrains PyCharm 2018.2.4 x64 工具里如何安装bs4
第一步:点击File->Settings 第二步:选择Project:workplace-->Project Interpreter,然后再点击右上角的"+"按钮进入下 ...
- Flutter仿掘金点赞效果
老孟导读:今天分享一下如何实现掘金点赞效果,这不仅仅是一篇技术文章,还是一篇解决问题思路的文章,遇到一个需求时,如何拆分需求,然后一步一步实现,这个过程比单纯的技术(此文)更有含金量. 先来看一下掘金 ...
- 3.4 Go字符型
1. Go字符型 Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存. 普通字符串就是一串固定长度的字符连接起来的字符序列. Go 的字符串是由单个字节连接起来 ...
- day09作业01用户登录与验证
import timeLoginTime = time.asctime( time.localtime(time.time()) )print ("time %s" % Login ...
- 为什么我不建议你通过 Python 去找工作?
二哥,你好,我是一名大专生,学校把 Python 做为主语言教给我们,但是我也去了解过,其实 Python 门槛挺高的,所以我在自学 Java,但是我现在并不清楚到底要不要全心的去学 Java,学校里 ...