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

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

4小时前
149
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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
    下载

相关推荐