【黑金云课堂】FPGA技术教程FPGA基础:SD卡读写实验

FPGA 驱动 SD 卡读写实验总结

一、实验概述

本实验基于纯 FPGA 板卡,通过 SPI 接口驱动 SD 卡,实现底层硬件与存储介质的直接交互。SD 卡作为嵌入式系统的核心存储介质,内部集成了 NAND Flash 控制器,可简化主机对存储介质的管理。本实验是音频播放、图片读取、系统日志等高级功能的基础。

核心目标

  • 理解FPGA与SD卡的SPI硬件连接
  • 掌握SD 2.0协议SPI模式规范
  • 运用Verilog HDL构建SD卡SPI控制器驱动
  • 实现SD卡指定扇区的读写操作与数据校验

二、SD卡硬件接口与SPI通信

SD卡分类

分类方式 类型
尺寸 SD卡Micro SD(TF)卡
速度等级 Class 2/4/6/10 UHS-1 U1/U3
容量 SD(≤2GB)、SDHC(≤32GB)、SDXC(≤2TB)

SPI 通信信号定义

信号 功能
SD_CLK (SCLK) FPGA提供的SPI时钟信号
SD_CD_N (CS) 片选信号,低电平有效
SD_CMD (MOSI) 主发从收数据线
SD_DAT0 (MISO) 主收从发数据线
VDD & GND 3.3V供电与信号地

硬件关键特性

  • FPGA IO 口外接 10K 上拉电阻至 3.3V,抑制信号噪声
  • 采用 4 线制 SPI 通信,简化硬件布线复杂度

SPI 协议优势

  • 硬件仅需4线连接,成本低
  • 无复杂帧格式,便于FPGA状态机实现
  • 通信速率可通过SCLK频率灵活适配

三、SD 2.0协议深度解析

命令响应机制

  • SD卡协议为命令/响应(Command/Response) 协议
  • 所有操作由主机主动发起,从机被动响应
    命令格式(48位/6字节)
字段 位数 说明
起始位 1b 固定为0
传输位 1b 固定为1
命令索引 6b 具体命令编号
参数 32b 命令参数(如地址)
CRC7 7b 校验码
结束位 1b 固定为1

代码要点:命令索引需与0x40进行"或"操作,设置正确的起始与传输位。

R1响应格式(1字节)

  • Bit 0:空闲状态标志(1=空闲,0=就绪)
  • Bit 1-7:7个错误标志位
  • 核心判断:上电初始为0x01(空闲),初始化成功变为0x00(就绪)

SD卡初始化流程(SD 2.0)

步骤 操作 说明
1 上电延时 至少等待74个SCLK周期,确保内部电路稳定
2 片选拉低 CS置低,开启通信链路
3 发送CMD0 复位命令,预期R1=0x01
4 发送CMD8 检测电压范围,区分SD 2.0及以上版本
5 循环CMD55+ACMD41 持续发送直到R1=0x00,标志初始化完成
6 发送CMD16 设置块长度为512字节
7 片选拉高 结束初始化,进入就绪状态

单块读操作(CMD17)

步骤 操作
1 发送CMD17 + 扇区地址
2 等待R1响应=0x00
3 检测数据令牌0xFE
4 读取512字节数据
5 接收2字节CRC校验值(可忽略)

单块写操作(CMD24)

步骤 操作
1 发送CMD24 + 目标扇区地址
2 等待R1=0x00,发送数据令牌0xFE
3 发送512字节数据
4 发送2字节CRC校验值
5 等待数据响应令牌(0x05成功/0x0B失败)
6 等待内部忙信号结束(MISO恢复高电平)

四、FPGA 程序设计与实现

模块架构(三层设计)

模块 功能定位
sd_card_sec_read_write 顶层控制模块,负责初始化、状态机管理、读写请求响应
sd_card_cmd 命令与数据交互核心层,构建命令、解析响应、控制读写时序
spi_master 底层物理驱动,实现SPI单字节全双工收发

双速时钟策略

阶段 频率 说明
初始化阶段 ~100kHz 确保上电复位与协议协商稳定可靠
数据传输阶段 25MHz 最大化数据吞吐效率

状态机设计

  • 初始化状态机:CMD0 → CMD8 → CMD55+ACMD41循环 → CMD16
  • 读写状态机:S_WAIT_READ_WRITE状态监听指令,分支处理CMD17(读)/CMD24(写)
    spi_master核心逻辑
  1. 检测wr_req写请求信号有效
  2. 状态机启动
  3. 在8个SPI时钟周期内完成全双工收发:逐位发送data_in至MOSI,同时从MISO采样拼接为data_out

五、实验结果与验证

逻辑分析仪波形验证要点

观测信号 验证内容
SCLK 验证初始化低频(100kHz)与数据传输高频(25MHz)的动态切换
CS 确保命令发送和数据传输全程保持低电平有效
MOSI 抓取CMD0、CMD8、ACMD41等命令波形,校验48位帧格式
MISO 分析R1响应从0x01→0x00的状态跳变

数据传输完整性校验

  • 比对MOSI与MISO总线上的实际数据比特流
  • 验证发送与接收数据的一致性

六、核心数据汇总

项目 说明
通信模式 SPI四线制(CS、SCLK、MOSI、MISO)
命令长度 48位(6字节)
初始化指令 CMD0、CMD8、CMD55、ACMD41、CMD16
就绪标志 R1响应=0x00
读/写指令 CMD17 / CMD24
数据块长度 512字节(默认)
数据起始令牌 0xFE
时钟策略 初始化100kHz / 传输25MHz

总结:本实验系统性地完成了从SD卡协议理解、硬件接口设计到FPGA逻辑代码实现的全流程,通过模块化设计(顶层控制+命令交互+SPI物理层)和双速时钟策略,实现了稳定可靠的SD卡扇区读写功能,为更复杂的嵌入式存储应用奠定了坚实基础。

💡 完整视频讲解可前往 ALINX 视频号进行直播回看

更多细节欢迎关注我们黑金云课堂全年免费直播课

黑金云课堂六月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列 内容定位
Verilog开发 硬件描述语言基础、逻辑设计、仿真调试
Vitis开发 Zynq软硬件协同、外设驱动、网络协议栈
Linux开发 嵌入式Linux系统移植、驱动编写、应用开发