基于FPGA的SD卡的数据读写实现(SD NAND FLASH)

文章目录

目录

1、存储芯片分类 

2、NOR Flash 与 NAND Flash的区别

3、什么是SD卡?

4、什么是SD NAND?

5、SD NAND的控制时序

6、FPGA实现SD NAND读写


1、存储芯片分类 

        目前市面上的存储芯片,大致可以将其分为3大类:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

① EEPROM

        EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器,是一种掉电后数据不丢失的存储芯片。EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。

        这类产品容量小,读取速度慢,且无法在应用过程中写入数据,十分不便。目前多存在于一些MCU内部,如遥控器,电风扇等各类低端、低速消费类产品。相信你读大学如果玩单片机的话,那么应该是不陌生。

② NOR Flash

        NOR Flash由Intel在1988年发明,是市场上两种主要的非易失闪存技术之一。NOR Flash 技术的出现,彻底改变了原先由EPROM和EEPROM一统天下的局面。

        NOR Flash可能是目前应用领域最广泛的一种存储芯片了,基本上主流的电子产品里都有使用,比如手机摄像头内部,或者屏幕驱动电路板。主要用来存储代码和一些比较小的数据文件。NOR Flash架构决定了它的容量不能做大,而且读取速度比较慢。好处在于简单易用,其接口可以实现地址寻址,也就意味着可以做到直接对某个地址直接操作,而不需要建立额外的文件系统。

③ NAND Flash

        虽然很多人平常说的Flash 存储器一半默认其就是NOR Flash ,但这无疑是不严谨的。FLASH产品可以分为两个大类:NOR Flash 和 NAND Flash 。

        NAND Flash 是市场上两种主要的非易失闪存技术之一,由东芝公司在1989年发明。其强调降低每比特的成本,并拥有更高的性能,可以像磁盘一样可以通过接口轻松升级。

        NAND Flash应该是目前最热门的存储芯片了。因为我们生活中经常使用的电子产品都会涉及到它。比如你买手机,肯定会考虑64GB,还是256GB?买笔记本是买256GB,还是512GB容量的硬盘呢?(目前电脑大部分采用了基于NAND Flash产品的固态硬盘)

2、NOR Flash 与 NAND Flash的区别

        Flash 闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何Flash 器件的写入操作都只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

        执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,用户必须权衡以下因素:

NOR Flash支持随机访问,所以支持XIP(execute In Place),NAND Flash需要按块进行读取,所以不支持XIP 

NAND FLASH理论读取速度与NOR Flash相近,实际情况会根据接口不同有些差异

NOR 与 NAND 写入前都需要先擦除,NOR在擦除时以64~128KB的块进行,执行一个写入/擦除操作的时间约5s,NAND在擦除时以8~32KB的块进行,执行一个写入/擦除操作的时间约4ms

NAND 理论最大擦除次数比NOR多

NOR 驱动比NAND简单,NAND FLASH需要通过专门的NFI(NAND FLASH Interface)与Host端进行通信,驱动相对复杂

所有Flash 都会有位反转的问题,NAND 位反转概率要比NOR高,NAND Flash 必须要使用ECC

NAND的单元尺寸几乎是NOR器件的一半,所以NAND成本更低

NOR 与 NAND 各有特点

 

        NOR 与 NAND 各有特点,应用场景与应用难度也不同,一般来讲,NOR适用于小容量、略低速且需要直接对地址块进行操作的应用,而NADN则适用于大容量的高速应用。SD NAND 在保留了NAND架构优质特性的同时改进了不足之处,内置的控制器能自行管理NAND Flash,无需在外部处理ECC和进行坏块管理,免去了MTD层,不需要写繁琐的驱动代码。

3、什么是SD卡?

①概述

        SD卡的英文全称是Secure Digital Card,即安全数字卡(又叫安全数码卡),是在MMC 卡(Multimedia Card,多媒体卡)的基础上发展而来,主要增加了两个特色:更高的安全性和更快的读写速度。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

 ②容量标准和速度等级

        若按照容量 对 SD 卡进行等级划分,SD 卡可分为 4 个等级,SD(Secure Digital Card,安全数字卡) 卡、SDHC 卡(Secure Digital High Capacity,高容量安全数字卡)、SDXC 卡( SD eXtended Capacity,容量扩大化的安全数字卡)和 SDUC(Secure Digital Ultra Capacity,超 容量安全数字卡)。现今,市场的主流 SD 产品是 SDHC 和 SDXC 这两种较大容量的存储 卡,SD 卡因容量过小,已逐渐被市场淘汰,SDUC 则是容量太大,预计会出现在未来市 场。SD 卡的四种容量标准,具体见下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        不同品牌和厂商生产的 SD 卡在对存取速度上的定义标准不同,这会使用户在选择 SD卡时产生困扰。所以 SD 协会根据视频匀速写入到 SD 卡的最低持续速度来划分不同等级, 每个等级的速率是以每秒传输多少 MB 来衡量的,单位为 MB/S。

         SD 协会定义了三种速度等级:速度等级、UHS 速度等级与视频速度等级。三种速度等级的具体传输速度如下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

4、什么是SD NAND?

        上文中提到的SD卡其实更应该叫做TF卡,在日常生活中最常见的应用就是数码相机的存储卡。因为它是可拆卸的,所以这类SD卡最大的优点就是便携方便,但同时也有容易丢失和接触不良等毛病,所以多用于消费类产品。

        在工业级应用中,更多见的是一类贴片式的SD NAND产品,俗称贴片式T卡或贴片式SD卡。虽然SD NAND 和TF卡称呼上有些类似,但是SD NAND和TF卡有着本质上的区别:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        为什么SD NAND和 TF卡 之间有这么大区别呢?因为 SD NAND是为内置存储而生,是焊接在PCB板上的,是针对工业级应用的产品,所以品质稳定、一致性高、使用稳定性高、同时尺寸也小。而TF卡主要是针对普通消费者,品质和一致性、使用稳定性等相对要求不高,再加上国内鱼龙混杂的市场环境,导致内置存储用TF卡的品质风险高。

  NAND Flash产品的一个特质就是它的品质并不是0和1这么简单,有些品质隐患是使用一段时间之后才被发现,如果这个产品已经销往海外,处理起来会变得异常麻烦。使用SD NAND可以为客户产品带来整体品质的提升,提供确定性,是客户产品良好品牌和口碑的稳定基石。而使用TF卡时,产品整机不可控因素会增高,比如常见的卡座老化松动、TF触点氧化、TF卡遗失、抗震性能减退等等。综上所述,虽然SD NAND与TF卡使用的协议相同,但从外观到内在都有区别。正在使用TF卡的客户需要提升产品稳定性及耐用性时,SD NAND 是绝佳选择。

        尽管 SD NAND和 TF卡之间有着这么大的区别,但具体到实际应用,其对外接口和驱动程序都是一样了,这说明可移植性非常好。

① 物理结构

        SD NAND从物理结构看包括 5 个部分,分别为存储单元、存储单元接口、电源检测、卡及接口控制器和对外接口,具体见下图。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输

存储单元接口是接口控制器与存储单元的数据交互通道

电源检测单元保证 SD NAND工作在合适的电压下,如出现掉电或上电状态时,它会使控制单元和存储单元接口复位

卡及接口控制单元控制 SDNAND的运行状态,它包括 8 个寄存器

对外接口单元控制 SD NAND引脚的输入输出,一般包含SDIO接口和SPI接口

② 对外接口

        SD NAND共有 9 个引脚,其中包括 3 根电源线、1 根时钟线、1 根命令线和 4根数据线。如下:

CLK:同步时钟线,由主机产生,即由主控制器(FPGA)输出; 使用 SPI 模式 时,该引脚与 SPI 总线的 SCK 时钟信号相连

CMD:命令控制线, SDIO 主机通过该线发送命令控制 SD NAND,如果命令要求 SD NAND 提供应答(响应), SD NAND也是通过该线传输应答信息; 使用 SPI 模式时,该引脚与 SPI总线的 MOSI 信号相连, SPI 主机通过它向 SD NAND发送命令及数据,但因为 SPI 总线 的 MOSI 仅用于主机向从机输出信号,所以 SD NAND返回应答信息时不使用该信号线;

DAT0-3:在 SDIO 模式下,它们均为数据线,传输读写数据, SD NAND可将 D0 拉低表 示忙状态; 在 SPI 模式下, DAT0 与 SPI 总线的 MISO 信号相连, SD NAND通过该信号线向主机发送数据或响应, DAT3 与总线的 CS 信号相连, SPI 主机通过该信号线选择要通讯的 SD NAND。

VDD、VSS1、VSS2:电源和地信号。

③ 工作模式

        SD NAND有两种工作模式:SDIO 模式与SPI模式

        在 SDIO 模式下,SD NAND共使用到 CLK、CMD、DAT[3:0] 6根信号线;SDIO 总线与多个 SD NAND连接时,可以共用 CLK 时钟信号线,对于 CMD、DAT[3:0]信号线,每个 SD NAND都要独立连接。SDIO 总线与 SD 卡连接方式,具体见下图。此模式使用IO引脚多,但传输速度高。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        在 SPI 模式下,SD NAND共使用到 CS(DAT[3])、CLK、MISO(DAT[0])、MOSI(CMD) 4根信号线;SPI 总线与多个 SD NAND连接时,除 CS 片选信号线不可共用外,其他信号均可公用。SPI 总线与 SD NAND连方式,具体见下图。此模式使用IO引脚少,但传输速度慢。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

④ 内部寄存器

        SD NAND总共有 8 个寄存器,用于设定或表示 SD NAND信息,寄存器描述具体见下图。 这些寄存器只能通过对应的命令访问,对 SD NAND的控制操作是通过命令来执行的, SD NAND定义了 64 个命令(部分命令不支持 SPI 模式) ,每个命令都有特殊意义,可以实现某一特定功能, SD NAND接收到命令后,根据命令要求对 SD NAND内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD NAND的控制以及读写操作。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        内部寄存器就不展开讲了,我们用FPGA实现读写测试也不需要了解那么多寄存器。

5、SD NAND的控制时序

① 命令与读写时序

        SD NAND的通信是基于命令和数据传输的。通讯由一个起始位(“0”)开始,由一个停止位(“1”)终止。SD NAND通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。SD NAND的基本交互是命令与响应交互, 见下图:

         

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        SD NAND数据是以块(Block)形式传输的,SDHC 规格数据块长度一般为 512 字节,数据可以从主机到芯片,也可以是从芯片到主机。数据块需要 CRC 位来保证数据传输成功,CRC 位由 SD NAND系统硬件生成。单个数据块的读、写时序分别见下2图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        读写操作都是由主机发起的,主机发送不同的命令表示读或写, SD NAND接收到命令后先针对命令返回响应。在读操作中, SD NAND返回一个数据块,数据块中包含 CRC校验码;在写操作中,主机接收到命令响应后需要先发送一个标志(TOKEN)然后紧跟一个要写入的数据块,SD NAND接收完数据块后会返回一个数据响应及忙碌标志,当 SD NAND把接收到的数据写入到内部存储单元完成后,会停止发送忙碌标志,主机确认 SD NAND空闲后,才可以发送下一个命令。

        SD NAND数据传输支持单块和多块读写,它们分别对应不同的操作命令, 结束多块读写时需要使用命令来停止操作。

② 命令格式

        SD NAND命令由主机发出,命令格式固定为 48bit,通过 CMD 信号线连续传输。SD NAND命令格式,具体见下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。

传输标志:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD NAND,该位为 0 时表示响应,方向为 SD NAND传输到主机。命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。

命令号:它固定占用 6bit,所以总共有 64 个命令,每个命令都有特定的用途,部分命令不适用于 SPI 总线,或不适用于 SD NAND操作,只是专门用于 MMC 卡或者 SD I/O卡。

地址/参数:每个命令有 32bit 地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit 用于指定参数,而寻址命令这 32bit 用于指定目标 SD NAND的地址, 当使用 SDIO 驱动多个 SD NAND时,通过地址信息区分控制不同的SD NAND,使用 SPI 总线驱动时,通过片选引脚来选择不同的SD NAND,所以使用这些命令时地址可填充任意值。

CRC7 校验:长度为 7bit 的校验位用于验证命令传输内容正确性,如果发生外部干扰 导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败, SD NAND不执行命令。 使用 SDIO 驱动时,命令中必须包含正确的 CRC7 校验值;而使用 SPI 驱动时,命令中的 CRC7 校验默认是关闭的,即这 CRC7 校验位中可以写入任意值而不影响通讯,仅在发送 CMD0 命令时需要强制带标准的 CRC7 校验。

③ 命令内容

        SD NAND命令可分为标准命令 (如 CMD0)和特殊应用命令 (如 ACMD41),其中特殊应用命令只有在先写入 CMD55 命令后才能被识别。按照指令类型又可将 SD NAND命令分为基本命令、数据块写命令、数据块读命令、擦除命令等 12 种(class0 ~ class11)。

        本次实验将会使用 SPI 模式实现 SD NAND的数据读写操作,所以接下来只列举 SPI 模式下常用的 SD 卡命令,具体见下表:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        SPI 模式下,上述各命令中,命令 CMD0 的 CRC7 校验为固定的 1001_010;命令CMD8 的 CRC7 校验为固定的 1000_011;其他命令的 CRC7 校验在 SPI 模式下无作用,赋值为 1111_111 即可。

④ 响应格式

        当 SD NAND接收到命令时,会向 SD NAND回传命令响应。SD NAND有 5 种类型的命令响应:R1、R1b、R2、R3、R7;SDIO NAND还支持另外两种命令响应:R4、R5。下文只对部分响应做介绍。    

        R1 响应格式,具体见下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

in idle state:当该位为 1 时,表示 SD NAND处于空闲状态

erase reset:因为接收到无需擦除操作的命令,擦除操作被复位

illegal command:接收到一个无效的命令代码 

com crc error:接收到的上一个命令的 CRC 校验错误

erase sequence error:擦除命令的控制顺序错误

address error:读写的数据地址不对齐(数据地址需要按块大小对齐)

parameter error:命令的参数错误

        R3 响应格式,具体见下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

         R3 响应包括 5 个字节,首先返回的第 1 个字节内容为 R1,剩下的其余字节为 OCR( Operation Conditions Register, 操作条件寄存器)寄存器的内容。

        R7 响应格式,具体见下图:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        R7 响应包括 5 个字节,首先返回的第 1 个字节内容为 R1,R7 [31:28]位为命令版本,R7[27:12]为保留位,R7[11:8]为反馈的电压范围,最后 1 个字节为检查模式。

6、FPGA实现SD NAND读写

        接下来编写FPGA的Verilog代码实现向SD NAND的指定扇区中写入512个字节的数据,写完后将数据读出,并通过指示灯的方式验证数据是否被正确读写。需要说明的是,后文的读写操作均采用SPI模式。

6.1、设计思路

① 上电时序

        SD NAND同其他的许多芯片一样上电后需要保持一定的时间以便维持电压稳定,这个时间通常是74+个时钟周期,一般实际应用中可设置参数为74~100。只有经过这个过渡时间后,才可以执行后续的SD NAND初始化操作。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

② 初始化时序

        SD NAND在正常读写操作之前,必须先对SD NAND进行初始化,使其工作在预期的工作模式。初始化流程如下:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

1.SD NAND完成上电后,主机FPGA先对从机SD NAND发送至少74个以上的同步时钟,在上电同步期间,片选CS引脚和MOSI引脚必须为高电平(MOSI引脚除发送命令或数据外,其余时刻都为高电平);

2.拉低片选CS引脚,发送命令CMD0(0x40)复位SD NAND,命令发送完成后等待SD NAND返回响应数据;

3.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为复位完成信号0x01,在接收返回信息期间片选CS为低电平, 此时SD NAND进入SPI模式,并开始进行下一步,如果返回的值为其它值,则重新执行第2步;

4.拉低片选CS引脚,发送命令CMD8(0x48)查询SD NAND的版本号,只有SD2.0版本才支持此命令,命令发送完成后等待SD NAND返回响应数据;

5.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的电压范围为4’b0001即2.7V~3.6V,说明2.0版本,进行下一步,否则重新执行第4步;

6.拉低片选CS引脚,发送命令CMD55(0x77)告诉SD NAND下一次发送的命令是应用相关命令,命令发送完成后等待SD NAND返回响应数据;

7.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为空闲信号0x01,开始进行下一步,否则重新执行第6步。

8.拉低片选CS引脚,发送命令ACMD41(0x69)查询SD NAND是否初始化完成,命令发送完成后等待SD NAND返回响应数据;

9.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为0x00,此时初始化完成,否则重新执行第6步。

③ 写操作时序

        至此,SD NAND完成了复位以及初始化操作,进入到SPI模式的读写操作。SD NAND读写一次的数据量必须为512字节的整数倍,即对SD NAND读写操作的最少数据量为512 个字节。我们可以通过命令CMD16来配置单次读写操作的数据长度,以使每次读写的数据量为 (n*512)个字节(n≥1),本次SD NAND的读写操作使用默认配置,即单次读写操作的数据量为512个字节。

        SD NAND的写操作时序图如下图所示:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

拉低片选信号 CS_N,向 SD NAND写入命令 CMD24,命令号为 0x58,携带参数为 4字节的 SD NAND写扇区地址,CRC 校验字节未使用直接写入 0xFF,命令发送完成后 等待 SD NAND返回响应数据

若 SD NAND返回正确响应数据 R1 为 0x00,等待 8 个时钟周期,向 SD NAND写入令牌0xFE,紧随其后写入 512 个字节的数据

数据发送完成后,再向 SD NAND写入 2 个字节的 CRC 校验字节。SPI 模式下不对数据进行 CRC 校验,直接写入两个字节的 0xFF 

校验数据发送完成后, SD NAND会有响应数据返回,随后 SD NAND将 Miso 信号拉低进入写忙状态 

MISO 信号再次拉高后 SD NAND退出写忙状态,等待 8 个时钟周期后拉高片选信号,SD NAND数据写操作完成,可以执行其它操作

④ 读操作时序

        SD NAND的读操作时序图如下图所示:

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

1.拉低片选信号 CS_N, 向 SD NAND写入命令 CMD17,命令号为 0x51,携带参数为 4字节的 SD NAND读扇区地址,CRC 校验字节未使用直接写入 0xFF,命令发送完成后 等待 SD NAND返回响应数据

2.若 SD NAND返回正确响应数据 R1 为 0x00,以 SD NAND返回的数据头 0xFE 为标志,接收自 SD NAND读出的 512 字节数据和 2 字节的 CRC 校验字节

3.解析到数据头 0xFE 后,接下来接收 SD NAND返回的 512 个字节的数据

4.数据解析完成后,接下来接收2个字节的 CRC 校验值。 由于 SPI 模式下不对数据进行 CRC 校验,可直接忽略这两个字节

5.CRC 校验字节接收完毕,等待 8 个时钟周期,拉高片选信号 CS_N,一次数据读操作完成

⑤ 程序设计

        通过前面介绍的SD NAND初始化、写操作以及读操作可知,SD NAND的这3个操作是相互独立且不能同时进行的,因此我们可以将SD NAND的初始化、写操作以及读操作分别划分为3个独立的模块,最后将这三个模块例化在SD NAND的控制器模块中,便于在其它工程项目中使用。

        下图是系统框图,PLL时钟模块(PLL)为各个模块提供驱动时钟,SD NAND测试数据产生模块产生测试数据写入SD NAND,写完后从SD NAND中读出数据,最终读写测试结果由LED显示模块通过控制LED灯的显示状态来指示。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        顶层模块:顶层模块完成了对其它四个模块的例化,SD NAND测试数据产生模块产生的开始写入信号及数据连接至SD NAND控制器模块,数据写完后从SD NAND控制器中读出数据, 并验证数据的正确性,将验证的结果连接至LED显示模块。

        PLL时钟模块:PLL时钟模块通过调用锁相环(PLL)IP核来实现,总共输出2个时钟,频率都是50Mhz,但两个时钟相位相差180度。我们知道,SD卡的SPI通信模式为CPOL=1, CPHA=1;即SPI_CLK在空闲时为高电平,数据发送是在时钟的第一个边沿,也就是SPI_CLK由高 电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。为了在程序代码中统 一使用上升沿,我们使用两个相位相差180度的时钟来对SD NAND进行操作。

        SD NAND测试数据产生模块:SD NAND测试数据产生模块产生的开始写入信号和数据写入SD NAND控制器模块中,数据写完后从SD NAND控制器中读出数据,并验证数据的正确性,将验证的结果发送给LED显示模块。

        SD NAND控制器模块:SD NAND控制器模块例化了SD NAND初始化模块、 SD NAND写数据模块和SD NAND读数据模块。SD NAND初始化模块完成对SD NAND的上电初始化操作;SD NAND写数据模块完成对SD NAND的写操作;SD NAND读数据模块完成对SD NAND的读操作。 由于这三个模块都操作了SD NAND的引脚信号,且这三个模块在同一时间内不会同时操作,所以此模块实现了对其它三个模块的例化以及选择SD NAND的引脚连接至其中某一个模块。

        LED显示模块:LED显示模块将SD NAND测试数据产生模块输出的验证结果值, 通过控制LED灯的显示状态来指示。

        

       SD NAND控制器部分代码如下:

module sd_ctrl_top(input                clk_ref       ,  //时钟信号input                clk_ref_180deg,  //时钟信号,与clk_ref相位相差180度input                rst_n         ,  //复位信号,低电平有效//SD卡接口input                sd_miso       ,  //SD卡SPI串行输入数据信号output               sd_clk        ,  //SD卡SPI时钟信号    output  reg          sd_cs         ,  //SD卡SPI片选信号output  reg          sd_mosi       ,  //SD卡SPI串行输出数据信号//用户写SD卡接口input                wr_start_en   ,  //开始写SD卡数据信号input        [31:0]  wr_sec_addr   ,  //写数据扇区地址input        [15:0]  wr_data       ,  //写数据                  output               wr_busy       ,  //写数据忙信号output               wr_req        ,  //写数据请求信号    //用户读SD卡接口input                rd_start_en   ,  //开始读SD卡数据信号input        [31:0]  rd_sec_addr   ,  //读数据扇区地址output               rd_busy       ,  //读数据忙信号output               rd_val_en     ,  //读数据有效信号output       [15:0]  rd_val_data   ,  //读数据        output               sd_init_done     //SD卡初始化完成信号);//wire definewire                init_sd_clk   ;       //初始化SD卡时的低速时钟wire                init_sd_cs    ;       //初始化模块SD片选信号wire                init_sd_mosi  ;       //初始化模块SD数据输出信号wire                wr_sd_cs      ;       //写数据模块SD片选信号     wire                wr_sd_mosi    ;       //写数据模块SD数据输出信号 wire                rd_sd_cs      ;       //读数据模块SD片选信号     wire                rd_sd_mosi    ;       //读数据模块SD数据输出信号 //*****************************************************//**                    main code//*****************************************************//SD卡的SPI_CLK  assign  sd_clk = (sd_init_done==1'b0)  ?  init_sd_clk  :  clk_ref_180deg;//SD卡接口信号选择always @(*) begin//SD卡初始化完成之前,端口信号和初始化模块信号相连if(sd_init_done == 1'b0) begin     sd_cs = init_sd_cs;sd_mosi = init_sd_mosi;end    else if(wr_busy) beginsd_cs = wr_sd_cs;sd_mosi = wr_sd_mosi;   end    else if(rd_busy) beginsd_cs = rd_sd_cs;sd_mosi = rd_sd_mosi;       end    else beginsd_cs = 1'b1;sd_mosi = 1'b1;end    end    //SD卡初始化sd_init u_sd_init(.clk_ref            (clk_ref),.rst_n              (rst_n),.sd_miso            (sd_miso),.sd_clk             (init_sd_clk),.sd_cs              (init_sd_cs),.sd_mosi            (init_sd_mosi),.sd_init_done       (sd_init_done));//SD卡写数据sd_write u_sd_write(.clk_ref            (clk_ref),.clk_ref_180deg     (clk_ref_180deg),.rst_n              (rst_n),.sd_miso            (sd_miso),.sd_cs              (wr_sd_cs),.sd_mosi            (wr_sd_mosi),//SD卡初始化完成之后响应写操作    .wr_start_en        (wr_start_en & sd_init_done),  .wr_sec_addr        (wr_sec_addr),.wr_data            (wr_data),.wr_busy            (wr_busy),.wr_req             (wr_req));//SD卡读数据sd_read u_sd_read(.clk_ref            (clk_ref),.clk_ref_180deg     (clk_ref_180deg),.rst_n              (rst_n),.sd_miso            (sd_miso),.sd_cs              (rd_sd_cs),.sd_mosi            (rd_sd_mosi),    //SD卡初始化完成之后响应读操作.rd_start_en        (rd_start_en & sd_init_done),  .rd_sec_addr        (rd_sec_addr),.rd_busy            (rd_busy),.rd_val_en          (rd_val_en),.rd_val_data        (rd_val_data));endmodule

       SD NAND控制器模块输出的sd_init_done(SD NAND初始化完成信号)连接至SD NAND测试数据产生模块,只有在SD NAND初始化完成之后(sd_init_done为高电平),才能对SD NAND进行读写测试。SD NAND控制器模块将SD NAND的初始化以及读写操作封装成方便用户调用的接口,SD NAND测试数据产生模块只需对SD NAND控制器模块的用户接口进行操作即可完成对SD NAND的读写操作。 

6.2、仿真结果

        一般的测试中,我们都需要先进行仿真来观察时序等测试行为。此次实验由于找不到好的SD NAND的Verilog模型,所以仿真测试略。

6.3、实验结果

        上文已经说了常用的相机中的TF卡与工业级的SD NAND(贴片式T卡)的区别,所以本次实验我选用的是深圳雷龙公司的一款SD NAND产品----CSNP32GCR01-AOW。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

        这是一家专业做存储产品的公司,NAND Flash是其主要产品。 该公司专注NAND Flash设计研发13年,在这一块可以说是相当专业。如果你对NAND Flash仍有疑惑的问题,或者你想在你的设计中使用NAND Flash产品,都可以直接联系:深圳市雷龙发展有限公司

        实验结果其实没什么好看的,LED灯常量表明说明从SD NAND读出的512个字节(256个16位数据) 与写入的数据相同,SD NAND读写测试程序下载验证成功。

        PS:有个小细节可以说下,雷龙公司的SD NAND开发板还是蛮用心的,封装都是标准的Micro SD的封装,只要你的FPGA开发板上有SD卡座,就可以直接插上使用了,即插即用十分方便,有心了。

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小尺寸emmc,大容量SLC Nand,语音芯片,语音识别,语音控制,语音模块,离线语音

 亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【回眸】QAC软件指南——错误分析篇(完整版)

前言 近期需要再次测一下代码,相比以前测试更有经验,也做了比较多的记录,正好将经验通过博客保留下来,为以后可能的QAC测试做准备。 安装导入分析代码 这部分在上一篇中已经详细介绍,具体请见,如有疑问可…

百元蓝牙耳机什么牌子的好?四大宝藏机型真实推荐,快速收藏!

作为一位蓝牙耳机爱好者,无论是上班、娱乐、学习我都离不开蓝牙耳机。通勤时候能听听音乐,是最好的享受,可以让我更加放松,尽情享受音乐带来的乐趣。但市面上的大多数蓝牙耳机都是货不对板的,不是音质一般、就是续航时…

谷歌发布 3 款 Gemini 新模型;字节开源 FLUX Dev Hyper SD Lora,8 步生图丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Seata执行原理分析-AT、XA、TCC、SAGA比较

分布式事务简介 1.1 本地事务 大多数场景下,我们的应用都只需要操作单一的数据库,这种情况下的事务称之为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持。本地事务应用架构如下所示: 在JDBC编程中,我们…

priority_queue模拟

一、什么是priority_queue? priority_queue是C标准库中的一个容器适配器,用于实现优先队列(priority queue)的数据结构。优先队列是一种特殊的队列,其中的元素按照一定的优先级进行排序,每次取出的元素都是优先级最高…

从零开始掌握Vue实例

从零开始掌握Vue实例:深入理解数据绑定与生命周期的核心秘诀 引言 简要介绍主题: 在学习Vue.js的过程中,Vue实例是最基础也是最关键的部分。Vue实例是Vue应用的核心,它是数据、DOM元素和Vue组件之间的桥梁。掌握Vue实例的使用对于…

文件上传面板中限制需要的文件格式,并且隐藏“所有文件”选项

直接说需求:需要实现在文件上传面板中限制需要的文件格式,并且不想展示“所有文件”这个选项,应该怎么做嘞?效果如下图: 这里用到了 window.showOpenFilePicker 方法实现,首先定义接受的格式及限制&#xf…

格行“信号增强技术”引领行业创新,格行随身WiFi带你感受不一样的速度与激情,行业第一的随身WiFi并非浪得虚名!

近年来,随着市场保有量的不断提升与相关技术的不断扩展,我国随身WiFi市场已经到了发展质量更高的“2.0”阶段,消费者对随身WiFi的需求变得多元且“高级”。与之对应的供给端,品牌之间的竞争也从未停止,有的品牌选择卷价…

如何使用ssm实现实验室仪器设备管理系统

TOC ssm354实验室仪器设备管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化…

快来尝尝,食家巷荞面甜甜圈超赞

当荞面与甜甜圈相遇,便诞生了食家巷荞面甜甜圈,一种独具特色的美食体验。 食家巷荞面甜甜圈,外形圆润可爱,色泽金黄诱人。那精致的环状造型,仿佛是一个小小的魔法圈,散发着迷人的魅力。 与传统甜甜圈…

计算机网络面试真题总结(七)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 什么是对称加密、非对称加密? 对称加密是一种常用的加…

探索AI智能问答:改变未来交流的新动力

人工智能(AI)是当今科技领域中最具潜力和影响力的技术之一,AI智能问答系统更是这一领域中的一颗璀璨明珠。随着大数据和机器学习的发展,AI智能问答系统已经不仅仅是科幻小说中的幻想,而是正逐步融入我们的日常生活,从客户服务到教…

生成式AI扩散模型-Diffusion Model【李宏毅2023】概念讲解、原理剖析笔记

目录 一、Diffusion的基本概念和运作方法 1.Diffusion Model是如何运作的? 2.Denoise模块内部正在做的事情 如何训练Noise predictor? 1)Forward Process (Diffusion Process) 2)noise predictor 3.Text-to-Image 4.两个A…

入门Java第一步—>IDEA的下载与安装与JDK的环境配置(day01)

1.JDK的下载与安装 jdk的安装链接分为不同操作系统如下,点击链接跳转下载页面: windows操作系统JDK下载链接(按住键盘ctrl键单击链接即可): 链接7天有效,有需要的评论区找我哈 通过网盘分享的文件:jdk-8u271-windows-x64.exe 链…

人工智能如何将人机交互提升到新水平

随着人工智能模型在语音识别和合成、文本处理和多模态性方面的卓越表现,终极语音用户界面可能很快就会无处不在。欢迎来到雲闪世界。 添加图片注释,不超过 140 字(可选) 那是一个典型的星期五下午,我们刚刚结束了一个…

如何用wireshark分析找出url接口和param参数???

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

Linux 内核源码分析---IPv6 数据包

IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。 由于IPv4最大的…

Tapd敏捷开发平台的使用心得

Tapd敏捷开发平台的使用心得 一、Tapd 简介 TAPD(Tencent Agile Product Development),腾讯敏捷产品研发平台行业领先的敏捷协作方案,贯穿敏捷产品研发生命周期的一站式服务,了解敏捷如下图 二、几个核心模块概念 需求迭代缺陷故事墙前期项目需求的管理,可以按类别建…

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

22AP10 是针对多路高清/超高清(1080p/4M/5M/4K)DVR 产品应用开发的新一代专 业 SoC 芯片。22AP10 集成了 ARM Cortex-A7 四核处理器和性能强大的图像分析工具 推理引擎,支持多种智能算法应用。同时,22AP10 还集成了多路 MIPI …

【可兼容的】protobuf、streamlit、transformers、icetk、cpm_kernels版本号

搞大模型训练的工作不可避免地需要很多库,但是非常讨厌的事情是这些库动不动就不兼容。最近在做文本分类训练的时候又遇到了这个问题,为了避免后面再安装包的时候把我之前的环境破坏了,所以特地来记录一下:protobuf、streamlit、t…