名称:sd卡读写控制设计Verilog代码Quartus AX301开发板
软件:Quartus
语言:Verilog
代码功能:
SD 卡是现在嵌入式设备重要的存储模块,内部集成了 nand flash 控制器,方便了主机的的管理。本实验主要是练习对 sd 卡的扇区进行读写,通常 sd 卡都有文件系统,可以按照文件名和目录路径来读写文件,但文件系统非常复杂,本实验不做讲解,在后续的实验中我们通过搜索特定的文件头来读特殊的文件,完成音频播放、图片读取显示等。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在AX301开发板验证,AX301开发板如下,其他开发板可以修改管脚适配:
设计文档:
sd 卡读写实验
1 实验简介
SD 卡是现在嵌入式设备重要的存储模块,内部集成了 nand flash 控制器,方便了主机的的管理。本实验主要是练习对 sd 卡的扇区进行读写,通常 sd 卡都有文件系统,可以按照文件名和目录路径来读写文件,但文件系统非常复杂,本实验不做讲解,在后续的实验中我们通过搜索特定的文件头来读特殊的文件,完成音频播放、图片读取显示等。
2 实验原理
2.1 硬件描述
AX301/AX4010 开发板上装有一个 Micro SD 卡座,FPGA 通过 SPI 数据总线访问 Micro SD 卡,SD 卡座和 FPGA 的硬件电路连接如下:
AX301、AX4010 SD 卡
在 SD 卡数据读写速度要求不高的情况下,选用 SPI 通信模式可以说是一种最佳的解决方案。 因为在 SPI 模式下,通过四条线就可以完成所有的数据交换。本实验将为大家介绍 FPGA 通过 SPI 总线读写 SD 卡。要完成 SD 卡的 FPGA 读写,用户需要理解 SD 卡的命令协议。
2.2 SD 卡协议简介
SD 卡的协议是一种简单的命令/响应的协议。全部命令由主机发起,SD 卡接收到命令后并返 回响应数据。根据命令的不同,返回的数据内容和长度也不同。SD 卡命令是一个 6 字节组成的命 令包,其中第一个字节为命令号, 命令号高位 bit7 和 bit6 为固定的“01“,其它 6 个 bit 为具体 的命令号。第 2 个字节到第 5 个字节为命令参数。第 6 个字节为 7 个 bit 的 CRC 校验加 1 个 bit 的 结束位。如果在SPI 模式的时候,CRC 校验位为可选。如下图所示,Command 表示命令,通常使 用十进制表示名称,例如 CMD17,这个时候 Command 就是十进制的 17。SD 卡具体的协议本实 验不讲解,可自行找相关资料学习。
SD 卡对每个命令会返回一个响应,每个命令有一定的响应格式。响应的格式跟给它的命令号 有关。在 SPI 模式中,有三种响应格式:R1,R2,R3。
2.2.1 SD 卡 2.0 版的初始化步骤
1.上电后延时至少 74clock,等待 SD 卡内部操作完成
2.片选 CS 低电平选中 SD 卡
3.发送 CMD0,需要返回 0x01,进入 Idle 状态
4.为了区别 SD 卡是 2.0 还是 1.0,或是 MMC 卡,这里根据协议向上兼容的,首先发送只有 SD2.0 才有的命令 CMD8,如果 CMD8 返回无错误,则初步判断为 2.0 卡,进一步循环发送命 令 CMD55+ACMD41,直到返回 0x00,确定 SD2.0 卡
5.如果 CMD8 返回错误则判断为 1.0 卡还是 MMC 卡,循环发送 CMD55+ACMD41,返回无错误, 则为 SD1.0 卡,到此 SD1.0 卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发 送 CMD1 进行初始化,如果返回无错误,则确定为 MMC 卡,如果在一定的次数下,返回为错 误,则不能识别该卡,初始化结束。(通过 CMD16 可以改变 SD 卡一次性读写的长度)
6.CS 拉高
2.2.2 SD 卡的读步骤
1 发送 CMD17(单块)或 CMD18(多块)读命令,返回 0X00
2 接收数据开始令牌 fe(或 fc)+正式数据 512Bytes + CRC 校验 2Bytes 默认正式传输的数据长度是 512Bytes
2.2.3 SD 卡的写步骤
1发送 CMD24(单块)或 CMD25(多块)写命令,返回 0X00
2发送数据开始令牌 fe(或 fc)+正式数据 512Bytes + CRC 校验 2Bytes
3连续读直到读到 8’bxxx00101 表示写成功
4继续读进行忙检测,读到 0x00 表示正忙,0xff 表示写操作完成
3 程序设计
程序中主要使用 spi_master 模块,这个模块完成 SPI 一个字节的读写,在其他实验中已经讲解。
sd_card_cmd 模块主要实验 sd 卡基本命令操作,还有上电初始化的 88 个周期的时钟,数据 块的读写,状态机如下。
如果搜寻其他 SD 卡的资料会看到 SD 卡的命令号和例程中的有区别,其实只是写法不同而已, 从主控设备写命令到 SD 卡的实质都是将十六进制命令号的高八位与十六进制 0x40 做或操作得到的结果再写入。
部分代码展示:
////////////////////////////////////////////////////////////////////////////////// // // // // // Author: meisq // // msq@qq.com // // ALINX(shanghai) Technology Co.,Ltd // // heijin // // WEB: http://www.alinx.cn/ // // BBS: http://www.heijin.org/ // // // ////////////////////////////////////////////////////////////////////////////////// // // // Copyright (c) 2017,ALINX(shanghai) Technology Co.,Ltd // // All rights reserved // //
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1348
468