名称:TF卡(MicroSD)测试试验设计Verilog代码VIVADO? ARTIX-7开发板
软件:VIVADO
语言:Verilog
代码功能:
TF卡(MicroSD)测试试验
TF卡写入,读出,并通过led显示读出结果
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:
设计文档:
TF卡读写例程
1 实验简介
TF卡,又叫MicroSD卡,由SanDisk(闪迪)公司发明,主要用于移动电话。MicroSD卡是一种极细小的快闪存储器卡,其格式源自SanDisk创造,原本这种记忆卡称为T-Flash,及后改称为TransFlash;而重新命名为MicroSD的原因是因为被SD协会(SDA)采立。另一些被SDA采立的记忆卡包括MiniSD和SD卡。其主要应用于移动电话,但因它的体积微小和储存容量的不断提高,已经使用于GPS设备、便携式音乐播放器和一些快闪存储器盘中。它的体积为15mmx11mmx1mm,差不多相等于手指甲的大小,是现时最细小的记忆卡。它也能通过SD转接卡来接驳于SD卡插槽中使用。现时MicroSD卡提供128MB、256MB、512MB、1G、2G、4G、8G、16G、32G、64G、128G的容量(MWC2014世界移动通信大会期间,SanDisk打破了储存卡最高64GB容量的传统,正式发布了一款容量高达128GB的MicroSDXC储存卡。
本实验主要是练习对SD卡的扇区进行读写,通常TF卡都有文件系统,可以按照文件名和目录路径来读写文件,但文件系统非常复杂,本实验不做讲解。
2 实验过程
2.1硬件描述
开发板上装有一个MicroSD卡座,FPGA通过SPI数据总线访问MicroSD卡,SD卡座和FPGA的硬件电路连接如下:
在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。
SD卡2.0版的初始化步骤
a.上电后延时至少74clock,等待SD卡内部操作完成
b.片选CS低电平选中SD卡
c.发送CMD0,需要返回0x01,进入Idle状态
d.为了区别SD卡是2.0还是1.0,或是MMC卡,这里根据协议向上兼容的,首先发送只有SD2.0才有的命令CMD8,如果CMD8返回无错误,则初步判断为2.0卡,进一步循环发送命令CMD55+ACMD41,直到返回0x00,确定SD2.0卡
e.如果CMD8返回错误则判断为1.0卡还是MMC卡,循环发送CMD55+ACMD41,返回无错误,则为SD1.0卡,到此SD1.0卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发送CMD1进行初始化,如果返回无错误,则确定为MMC卡,如果在一定的次数下,返回为错误,则不能识别该卡,初始化结束。(通过CMD16可以改变SD卡一次性读写的长度)
f. CS拉高
2.2.2 SD卡的读步骤
①发送CMD17(单块)或CMD18(多块)读命令,返回0X00
②接收数据开始令牌fe(或fc)+正式数据512Bytes+CRC校验2Bytes
默认正式传输的数据长度是512Bytes
2.2.3 SD卡的写步骤
①发送CMD24(单块)或CMD25(多块)写命令,返回0X00
②发送数据开始令牌fe(或fc)+正式数据512Bytes+CRC校验2Bytes
3 程序设计
下面主要对SD_card_top及其子程序进行介绍和说明。SD_card_top包含3个子程序,分别为SD_card_sec_read_write.v,SD_card_cmd.v和spi_master.v文件。它们的逻辑关系如下图所示:
SD_card_sec_read_write模块有一个状态机,首先完成SD卡初始化,下图为模块的初始化状态机转换图,首先发送CMD0命令,然后发送CMD8命令,再发送CMD55,接着发送ACMD41和CMD16。如果应答正常,SD卡初始化完成,等待SD卡扇区的读写命令。
然后等待扇区读写指令,并完成扇区的读写操作,SD卡的初始化过程是需要先用慢时钟来发送命令和配置,等待初始化成功后再用快时钟来进行数据读写。
SD_card_cmd模块主要实现SD卡基本命令操作,还有上电初始化的88个周期的时钟,数据块的命令和读写的状态机如下。
其管脚定义如下:
信号名 |
方向 |
管脚 |
BANK |
端口说明 |
SD_DATA0 |
output |
B9 |
BANK16 |
TF卡数据信号 |
SD_DATA1 |
output |
D12 |
BANK15 |
TF卡数据信号 |
SD_DATA2 |
output |
C12 |
BANK15 |
TF卡数据信号 |
SD_DATA3 |
output |
C11 |
BANK16 |
TF卡数据信号,可做片选信号 |
SD_CMD |
input |
C10 |
BANK16 |
TF卡数据输入 |
SD_CLK |
output |
A10 |
BANK16 |
TF卡时钟 |
4 实验现象
下载实验程序后,可以看到LED显示一个二进制数字,这个数字是存储在SD卡中第一扇区的第一个数据,数据是随机的,这个时候按键KEY2按下,数字加1,并写入了SD卡,掉电启动程序,可以看到直接显示更新后的数据。
部分代码展示:
//?Copyright?1986-2017?Xilinx,?Inc.?All?Rights?Reserved. //?-------------------------------------------------------------------------------- //?Tool?Version:?Vivado?v.2017.4?(win64)?Build?2086221?Fri?Dec?15?20:55:39?MST?2017 //?Date????????:?Fri?Mar?29?09:53:35?2019 //?Host????????:?LAPTOP-NMQVIF8I?running?64-bit?major?release??(build?9200) //?Command?????:?write_verilog?-force?-mode?synth_stub //???????????????D:/xilinx_work/a7_prj_tst/a7_prj17_tst/07_sd_test/sd_test/sd_test.srcs/sources_1/ip/ila_0/ila_0_stub.v //?Design??????:?ila_0 //?Purpose?????:?Stub?declaration?of?top-level?module?interface //?Device??????:?xc7a50tcsg324-1 //?--------------------------------------------------------------------------------
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1338