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

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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


① 物理结构

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

  • 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输
  • 存储单元接口是接口控制器与存储单元的数据交互通道
  • 电源检测单元保证 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引脚多,但传输速度高。

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

④ 内部寄存器

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

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


5、SD NAND的控制时序

① 命令与读写时序

SD NAND的通信是基于命令和数据传输的。

### FPGA 实现 SD 读写控制器的设计教程 #### 1. 理解SD的工作原理 SD由一个控制器和一个闪存芯片组成。FPGA通过SPI总线与SD通信,发送命令并接收应答以控制操作。当FPGA发出读命令时,SD会从闪存芯片中读取数据并通过SPI总线返回给FPGA;而当FPGA发出写命令时,则将来自FPGA数据写入到闪存芯片中[^1]。 #### 2. 使用Verilog编程实现基本功能 为了在FPGA上完成SD读写操作,可以采用硬件描述语言如Verilog来进行逻辑电路设计。具体来说,在本项目中选择了Xilinx Spartan-6系列器件以及Vivado作为开发环境,并针对读取扇区这一过程进行了详细设计,实现了完整的SD读写能力[^2]。 ```verilog module sd_card_controller ( input wire clk, input wire rst_n, // SPI interface signals to connect with the SD card output reg spi_mosi, // Master Out Slave In (data out from master) input wire spi_miso, // Master In Slave Out (data into master) output reg spi_sck, // Serial Clock line output reg spi_cs_n // Chip Select / Slave Select signal active low ); // Internal registers and wires declaration here... endmodule ``` 这段代码展示了如何定义一个简单的`sd_card_controller`模块用于管理SPI接口信号连接至SD。实际应用中还需要加入更多内部寄存器、状态机以及其他必要的组件来处理具体的协议细节。 #### 3. 测试与验证机制 对于任何嵌入式系统的开发而言,确保所编写的程序能够正常运行至关重要。因此,在此案例里还特别构建了一个名为“SD NAND测试数据产生”的辅助单元。该部分负责生成初始写入请求及其对应的数据流送入NAND型存储介质内核之中;之后再把刚才保存下来的信息重新提取出来做对比分析,最后利用LED指示灯直观展示最终校验结果的好坏情况[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值