• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

sd卡读写控制设计Verilog代码Quartus AX301开发板

10/09 14:36
468
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-2411121Z111K2.docx

共1个文件

名称:sd卡读写控制设计Verilog代码Quartus  AX301开发板

软件:Quartus

语言:Verilog

代码功能:

SD 卡是现在嵌入式设备重要的存储模块,内部集成了 nand flash 控制器,方便了主机的的管理。本实验主要是练习对 sd 卡的扇区进行读写,通常 sd 卡都有文件系统,可以按照文件名和目录路径来读写文件,但文件系统非常复杂,本实验不做讲解,在后续的实验中我们通过搜索特定的文件头来读特殊的文件,完成音频播放、图片读取显示等。

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

本代码已在AX301开发板验证,AX301开发板如下,其他开发板可以修改管脚适配:

AX301开发板.png

设计文档:

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

  • 2-2411121Z111K2.docx
    下载

相关推荐