【黑金云课堂】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 & GND3.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命令参数(如地址)
CRC77b校验码
结束位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卡扇区读写功能,为更复杂的嵌入式存储应用奠定了坚实基础。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分