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

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

软件:Quartus

语言:Verilog

代码功能:

SD 卡是现在嵌入式设备重要的存储模块,内部集成了 nand flash 控制器,方便了主机的的管

理。本实验主要是练习对 sd 卡的扇区进行读写,通常 sd 卡都有文件系统,可以按照文件名和目

录路径来读写文件,但件系统非常复杂,本实不做讲解,在后续的实中我们通过搜索特定

的文件头来读特殊的文,完成音频播放、图片取显示等


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

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


设计文档:

sd卡读写控制.docx

sd 卡读写实验




1 实验简介

SD 卡是现在嵌入式设备重要的存储模块,内部集成了 nand flash 控制器,方便了主机的的管

理。本实验主要是练习对 sd 卡的扇区进行读写,通常 sd 卡都有文件系统,可以按照文件名和目

录路径来读写文件,但件系统非常复杂,本实不做讲解,在后续的实中我们通过搜索特定

的文件头来读特殊的文,完成音频播放、图片取显示等


2 实验原理


2.1 件描述


AX301/AX4010 开发板上装有一个 Micro SD 卡座,FPGA 通过 SPI 数据总线访问 Micro SD ,

SD 卡座和 FPGA 的硬件电路连接如下:
















AX301AX4010 SD 


 SD 卡数据读写速度要求不高的情况下,选用 SP通信模式可以说是一种最佳的解决方案。 因为在 SPI 模式下,通过四条线就可以完成所有的数据交换。本实验将为大家介绍 FPGA 通过 SPI 总线读写 SD 卡。要完成 SD 卡的 FPGA 读写,用户需要理解 SD 卡的命令协议。




FPGA 版权所有 8



2.2 SD 卡协议简介


SD 卡的协议是一种简单的命令/响应的协议。全部命令由主机发起,SD 卡接收到命令后并返 回响应数据。根据命令的不同,返回的数据内容和长度也不同。SD 卡命令是一个 6 字节组成的命 令包,其中第一个字节为命令号, 命令号高位 bit7  bit6 为固定的“01“,其它 6  bit 为具体 的命令号。第 2 个字节到第 5 个字节为命令参数。第 6 个字节为 7  bit  CRC 校验加 1  bit  结束位。如果在SP模式的时候,CRC 校验位为可选。如下图所示,Command 表示命令,通常使 用十进制表示名称,例如 CMD17,这个时候 Command 就是十进制的 17SD 卡具体的协议本实 验不讲解,可自行找相关资料学习。










SD 卡对每个命令会返回一个响应,每个命令有一定的响应格式。响应的格式跟给它的命令号 有关。在 SPI 模式中,有三种响应格式:R1R2R3





























8








































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 卡一次性读写的长度)

6CS 拉高

8


2.2.2 SD 卡的读步骤


1 发送 CMD17(单块)或 CMD18(多块)读命令,返回 0X00

2 接收数据开始令牌 fe(或 fc+正式数据 512Byte+ CRC 校验 2Bytes 默认正式传输的数据长度是 512Bytes


2.2.3 SD 卡的写步骤


1发送 CMD24(单块)或 CMD25(多块)写命令,返回 0X00

2发送数据开始令牌 fe(或 fc+正式数据 512Byte+ 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                                       //
//

代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » sd卡读写控制设计Verilog代码Quartus AX301开发板

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员