查看:
320
|
回复:
0
|
Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写
|
![]() ![]() |
1#
电梯直达
![]() 在此介绍的是使用FPGA实现SD NAND FLASH的读写操作,以雷龙发展提供的CS创世SD NAND FLASH样品为例,分别讲解电路连接、读写时序与仿真和实验结果。 目录 1 视频讲解 2 SD NAND FLASH背景介绍 3 样品申请 4 电路结构与接口协议 4.1 SD NAND 4.2 SD NAND测试板 4.3 FPGA开发板 5 SD卡协议与时序流程 5.1 SD卡协议 5.2 SD卡2.0版本初始化步骤 5.3 SD卡的读步骤 5.4 SD卡的写步骤 6 模块代码 6.1 sd_card_top 6.2 sd_card_cmd 6.3 sd_card_sec_read_write 6.4 spi_master 6.5 其余代码 6.5.1 sd_card_test 6.5.2 ax_debounce 6.5.3 seg_decoder 6.5.4 seg_scan 7 实验结果 8 参考资料 使用FPGA讲解SD NAND FLASH的文章网上也有很多比较详实的内容,本文的部分思路也是参考了其他博主的博客思路。 1 视频讲解 为了便于更加清晰地讲解内容,本文也将文章的对应部分以视频的形式进行了录制: (后期正在紧锣密鼓制作ing) 2 SD NAND FLASH背景介绍 目前市面上主流的存储芯片,分为了EEPROM、NOR FLASH、NAND FLASH三种,其中后两种是市面上主要的非易失闪存技术,他们分别具有不同的特点: 1.EEPROM EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用设备中。 相较于EEPROM计数,下文提到的FLASH技术,具有更快的速度,工艺上可以分为NOR FLASH和NAND FLASH两种 2.NOR FLASH NOR FLASH是一种非易失闪存技术。其特点是芯片内执行 (XIP),应用程序可以直接在存储芯片内运行,不必再把代码读到系统 RAM 中。其传输效率较高高,在 1~4MB 的小容量时具有很高的成本效益。 3.NAND FLASH NAND FLASH内部采用非线性宏单元模式,这种结构能提供极高的单元密度,并且写入和擦除的速度很快。作为当前最热门的存储芯片,目前生活中常见的电子产品都会使用到这种存储芯片,例如数码相机、U盘等等。 由于NAND FLASH在大容量应用中的便利性,因此作为今天介绍的主角~ 什么是SD NAND呢(以下省略FLASH)?下面的内容是从雷龙发展官网的介绍中得到: SD NAND俗称贴片式TF卡,尽管与TF卡名称类似,但是有较大的区别:编辑 相比常见的TF卡,SD NAND是专门为内置存储进行设计,焊接在PCB板上以供工业级产品的应用。因此对品质稳定性、一致性、以及尺寸都有较高的要求。 下图中左侧即为SD NAND、右侧是常见的TF卡。编辑 3 样品申请 本文所使用的CS创世SD NAND是从深圳雷龙发展申请获得,可以在官网中最上面找到申请样品的入口:编辑 深圳市雷龙发展有限公司创立于2008年,专注NAND Flash设计研发13年。创始人均为步步高/华为技术背景出身。是一家专注于存储元器件代理分销商。 如果有一些技术问题也可以和其公司人员进行沟通,相关的工作人员非常专业和热心。 下图是我收到的测试样品:编辑 4 电路结构与接口协议 4.1 SD NAND 本文所使用的产品是CSNP4GCR01-AMW,是雷龙的第二代产品,产品如下图所示:编辑 数据手册可以在立创商城进行下载,其封装与连接的电路原理参考图如下图所示:编辑编辑 芯片共包含8个引脚,包括4根数据线(6、7、1、2);2根电源线(4、8);1根时钟线(3);1根命令控制线(5) 手册中提供了SD NAND的两种使用模式,分别为SD MODE 以及 SPI MODE。他们所对应的引脚定义,如下图所示:编辑 对于两种模式的切换,官方给出了初始化的方式。下文在代码的时序部分也会涉及到相关内容。 在对SD卡数据读写速度要求不高的情况下,选用SPI通信模式可以说是一种最佳方案。因为在该模式下,同只需要通过四根线就是可以完成所有的数据交换,可以为我们节省出宝贵的FPGA I/O资源。下图给出了SPI一对一通信时,主设备与从设备之间的连接关系。 (注:SPI协议详解传送门)编辑 因此本文主要介绍SPI MODE下各个引脚的功能:编辑 确定了通讯模式后,也就便于我们后文中,利用这种通讯模式按照SD卡的读写时序进行读写操作。 4.2 SD NAND测试板 单独的SD NAND不便于我们使用FPGA进行读写测试,好在官方提供了测试板,如下图所示:编辑 有了它就可以轻松实现SD NAND与我们常见的FPGA开发板上的Micro SD插槽进行连接与测试了。 适用产品:LGA8,6x8mm 封装的SD NAND产品。 测试板尺寸:长度6.22厘米,宽度2.49厘米,接口长度2.53厘米。 使用方法:将芯片焊接至测试板上,可在原有的Micro SD卡座上直接调试和测试。 准备工具:热风枪,锡膏,镊子。温度要求:将热风枪温度调至300摄氏度℃即可焊接。 4.3 FPGA开发板 本文所使用的是黑金的AX301开发板,上面装有一个 Micro SD 卡座, FPGA 通过 SPI 数据总线访问 Micro SD 卡,SD 卡座和 FPGA 的硬件电路连接如下:编辑 借由硬件电路的连接,FPGA可以直接与我们的SD NAND进行通信了。 至此,我们已经实现了SD NANDSPI通信方式方案的确定以及基于此的硬件电路连接,下一步就是根据SD卡的读写时序讲通信方式初始化为SPI模式,并按照SD卡协议进行读写操作。 5 SD卡协议与时序流程 5.1 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 NAND的SPI模式读写操作时,主要使用到了以下几种SD卡命令,下面的表格进行简单介绍,这里可以找到完整版:编辑 5.2 SD卡2.0版本初始化步骤 上电后延时至少 74clock,等待 SD 卡内部操作完成 片选 CS 低电平选中 SD 卡 发送 CMD0,需要返回 0x01,进入 Idle 状态 为了区别 SD 卡是 2.0 还是 1.0,或是 MMC 卡,这里根据协议向上兼容的,首先发送只有SD2.0 才有的命令 CMD8,如果 CMD8 返回无错误,则初步判断为 2.0 卡,进一步循环发送命令 CMD55+ACMD41,直到返回 0x00,确定 SD2.0 卡 如果 CMD8 返回错误则判断为 1.0 卡还是 MMC 卡,循环发送 CMD55+ACMD41,返回无错误,则为 SD1.0 卡,到此 SD1.0 卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发送 CMD1 进行初始化,如果返回无错误,则确定为 MMC 卡,如果在一定的次数下,返回为错误,则不能识别该卡,初始化结束。 (通过 CMD16 可以改变 SD 卡一次性读写的长度) CS 拉高 5.3 SD卡的读步骤 发送 CMD17(单块)或 CMD18(多块)读命令,返回 0X00 接收数据开始令牌 fe(或 fc) +正式数据 512Bytes + CRC 校验 2Bytes(默认正式传输的数据长度是 512Bytes) 5.4 SD卡的写步骤 发送 CMD24(单块)或 CMD25(多块)写命令,返回 0X00 发送数据开始令牌 fe(或 fc) +正式数据 512Bytes + CRC 校验 2Bytes 6 模块代码 本代码所实现的功能,是基于黑金AX301B,实现对SD NAND FLASH的数据写入与读取,并显示在开发板的数码管上。当按下开发板上的按键时,会自动将数据加一操作,并进行同步显示。 前文介绍的是SD NAND的协议以及初始化、读写操作的流程,下面介绍代码的组成部分,整个工程主要由以下部分模块构成: sd_card_test(top模块) ax_debounce:ax_debounce_m0(按键消抖模块) sd_card_top:sd_card_top_m0(SD卡top模块) sd_card_cmd:sd_card_cmd_m0(SD卡指令) sd_card_sec_read_write:sd_card_sec_read_write_m0(SD卡读写) spi_master:spi_master_m0(SPI一个字节读写) seg_decoder:seg_decoder_m0(数码管控制) seg_decoder:seg_decoder_m1(数码管控制) seg_scan:seg_scan_m0(数码管控制) 下面主要介绍上述四个加粗的模块以及其功能 6.1 sd_card_top 本模块是SD card的top模块,用来实现不同子模块之间的连接。 7 实验结果 下载实验程序后,可以看到数码管显示一个数字,这个数字是存储在 sd 卡中第一扇区的第一 个数据,数据是随机的,这个时候按键 KEY1 按下,数字加一,并写入了 sd 卡,再次下载程序, 可以看到直接显示更新后的数据。编辑 |
|