当前位置:   article > 正文

基于FPGA的SD2.0协议读写SD卡实现_fpga 读sd卡数据

fpga 读sd卡数据

SD卡是一种较大容量的存储器,在硬件上需要较大容量时,我们常常需要用到。基于单片机的SD卡开发历程很多,包括实现文件系统等高级应用网上都有,而基于FPGA的应用相对较少,并且网上现有的基于FPGA的SD卡开发都是用的SPI模式,虽然简单,但是数据速率降低了很多,基于SD2.0协议的开发基本没有,我在业余自己进行了一个开发测试,把思路提供给大家,供大家参考。
SD2.0协议的具体内容可自行网上下载,也可联系作者提供,比较复杂的是初始化过程,我将初始化过程进行了简化,总结起来就是以下几个流程:
1、上电等待一段时间待SD卡内部初始化后,发送SMD0命令,跟随参数为32bit全0,该命令无应答,作用是位设备至 idle 状态;
2、发送CMD8命令,跟随参数为{20’d0,4’d1,8’h99}; //代表支持高电压,大容量,应答为48bit类别,应答要进行命令校验、crc校验,应答参数的第8-11bit需为4’b0001,代表支持高电压,大容量;
3、发送CMD55命令,跟随参数为32bit全0,应答为48bit类别,应答要进行命令校验、crc校验,此命令告诉卡,下个命令是特定应用命令,特定应用命令前都需发送CMD55;
4、发送ACMD41命令,跟随参数为{2’b01,6’d0,9’h1ff,15’d0}; //设置支持电压,应答为48bit类别,应答不进行命令校验、不进行crc校验,返回参数的第31bit需为1,否则用重复3、4步骤;
5、发送CMD2命令,跟随参数为32bit全0,用于返回CID即产品识别信息,应答为128bit类别,应答可以不进行命令校验、不进行crc校验,如果不关心产品识别信息(一般开发来说,如果你自己总是知道用的是什么产品),甚至不用关心应答值,只需给予应答时间就行了;
6、发送CMD3命令,跟随参数为32bit全0,通知卡返回RCA即相对地址值,不能是0,应答为48bit类别,应答要进行命令校验、crc校验。应答参数的[31:16]即RCA值要记录下来,后续的命令要使用这个RCA值;
7、发送CMD7命令,跟随参数为16bit RCA值和16bit全0,切换SD卡到传输模式,应答为48bit类别,应答要进行命令校验、crc校验。此命令应答后,data[0]数据线会拉低以示忙,要等到其拉高后才能发送下一个命令;
8、发送CMD55命令;
9、发送ACMD6命令,跟随参数为{30’d0,2’b10},设置总线宽度为4线制,应答为48bit类别,应答要进行命令校验、crc校验;
10、发送CMD6命令,跟随参数为{1’b1,7’d0,16’hffff,8’d1},切换总线速率为高速模式,即50MHz时钟频率,应答为48bit类别,应答要进行命令校验、crc校验。此命令要应答512bit数据,可以不关心这些应答数据,但要给予时间应答。
至此初始化结束,而后就可以发送读、写和擦除等命令。
需要注意:
初始化过程中,时钟频率不能大于400KHz,第10步后方能将时钟频率切换为50MHz。
此处有一个测试结果分享给大家:
基于xilinx XC7A200T芯片,在ALINX AC7A200板子上验证,
验证的micro SD卡型号为:SanDisk Ultra 32GB
经测试:
1000MB数据连续写入总共耗时约:48秒,平均速度:20.8MB/s;
1000MB数据连续读出总共耗时约:43秒,平均速度:23.3MB/s;

另一块验证的micro SD卡型号未知,是很老的一片上面显示产于2013年
经测试:
1000MB数据连续写入总共耗时约:86秒,平均速度:11.6MB/s;
连续读未能成功,尚未找到原因,待后续更新补充。
源代码恕不免费提供,可提供有偿技术支持,联系邮箱dp2003@qq.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/465489
推荐阅读
相关标签
  

闽ICP备14008679号