0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【紫光同创国产FPGA教程】【第八章】SD卡读写实验

FPGA技术专栏 来源:芯驿电子科技 作者:芯驿电子科技 2021-02-05 11:35 次阅读

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(alinx.com)。

适用于板卡型号:

PGL22G/PGL12G

1. 实验简介

SD卡是现在嵌入式设备重要的存储模块,内部集成了nand flash控制器,方便了主机的的管理。本实验主要是练习对sd卡的扇区进行读写,通常sd卡都有文件系统,可以按照文件名和目录路径来读写文件,但文件系统非常复杂,本实验不做讲解,在后续的实验中我们通过搜索特定的文件头来读特殊的文件,完成音频播放、图片读取显示等。

2. 实验原理

2.1 硬件描述

开发板上装有一个Micro SD卡座,FPGA通过SPI数据总线访问Micro SD卡, SD卡座和FPGA的硬件电路连接如下:

o4YBAGAY4mqAbUHfAABWzEWrkVo638.jpg

开发板SD卡

在SD卡数据读写速度要求不高的情况下,选用SPI通信模式可以说是一种最佳的解决方案。因为在SPI模式下,通过四条线就可以完成所有的数据交换。本实验将为大家介绍FPGA通过SPI总线读写SD卡。要完成SD卡的FPGA读写,用户需要理解SD卡的命令协议。

2.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卡具体的协议本实验不讲解,可自行找相关资料学习。

pIYBAGAY4muASrLYAAARHey4MfE633.jpg

SD卡对每个命令会返回一个响应,每个命令有一定的响应格式。响应的格式跟给它的命令号有关。在SPI模式中,有三种响应格式:R1,R2,R3。

o4YBAGAY4myAfoO6AAAc9mT4vdw144.jpgpIYBAGAY4myAK98UAAA4RuZDQWQ935.jpgo4YBAGAY4m2AN2L4AAAj6HNl44o945.jpg

2.2 SD卡2.0版的初始化步骤

  1. 上电后延时至少74clock,等待SD卡内部操作完成

  2. 片选CS低电平选中SD卡

  3. 发送CMD0,需要返回0x01,进入Idle状态

  4. 为了区别SD卡是2.0还是1.0,或是MMC卡,这里根据协议向上兼容的,首先发送只有SD2.0才有的命令CMD8,如果CMD8返回无错误,则初步判断为2.0卡,进一步循环发送命令CMD55+ACMD41,直到返回0x00,确定SD2.0卡

  5. 如果CMD8返回错误则判断为1.0卡还是MMC卡,循环发送CMD55+ACMD41,返回无错误,则为SD1.0卡,到此SD1.0卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发送CMD1进行初始化,如果返回无错误,则确定为MMC卡,如果在一定的次数下,返回为错误,则不能识别该卡,初始化结束。(通过CMD16可以改变SD卡一次性读写的长度)

6. CS拉高

2.3 SD卡的读步骤

  1. 发送CMD17(单块)或CMD18(多块)读命令,返回0X00

  2. 接收数据开始令牌fe(或fc)+正式数据512Bytes + CRC校验2Bytes

默认正式传输的数据长度是512Bytes

pIYBAGAY4m6AZiYDAABpVVo-5qY959.jpg

2.4 SD卡的写步骤

  1. 发送CMD24(单块)或CMD25(多块)写命令,返回0X00

  2. 发送数据开始令牌fe(或fc)+正式数据512Bytes + CRC校验2Bytes

o4YBAGAY4m6Aal7xAACMCFJMmjQ757.jpg

3. 程序设计

下面主要对sd_card_top及其子程序进行介绍和说明。sd_card_top包含3个子程序,分别为sd_card_sec_read_write.v,sd_card_cmd.v和spi_master.v文件。它们的逻辑关系如下图所示:

pIYBAGAY4m-AOD1eAAAtgxcTeXc488.jpg

3.1 sd_card_sec_read_write

以下为sd_card_sec_read_write模块端口说明:

信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
sd_init_done out sd卡初始化完成
sd_sec_read in sd卡扇区读请求
sd_sec_read_addr in sd卡扇区读地址
sd_sec_read_data out sd卡扇区读出的数据
sd_sec_read_data_valid out sd卡扇区读出的数据有效
sd_sec_read_end out sd卡扇区读完成
sd_sec_write in sd卡扇区写请求
sd_sec_write_addr in sd卡扇区写请求应答
sd_sec_write_data in sd卡扇区写请求数据
sd_sec_write_data_req out sd卡扇区写请求数据读取,提前sd_sec_write_data一个时钟周期
sd_sec_write_end out sd卡扇区写请求完成
spi_clk_div in SPI时钟分频,SPI时钟频率=系统时钟/(( spi_clk_div + 2)*2)
cmd_req in sd卡命令请求
cmd_req_ack out sd卡命令请求应答
cmd_req_error out sd卡命令请求错误
cmd in sd卡命令,命令+参数+CRC,一共48bit
cmd_r1 in sd卡命令期待的R1响应
cmd_data_len in sd卡命令后读取的数据长度,大部分命令没有读取数据
block_read_req in 块数据读取请求
block_read_valid out 块数据读取数据有效
block_read_data out 块数据读取数据
block_read_req_ack out 块数据读取请求应答
block_write_req in 块数据写请求
block_write_data in 块数据写数据
block_write_data_rd out 块数据写数据请求,提前block_write_data一个时钟周期
block_write_req_ack out 块数据写请求应答

sd_card_sec_read_write模块有一个状态机,首先完成SD卡初始化,下图为模块的初始化状态机转换图,首先发送CMD0命令,然后发送CMD8命令,再发送CMD55,接着发送ACMD41和CMD16。如果应答正常,sd卡初始化完成,等待SD卡扇区的读写命令。

o4YBAGAY4nCAe83lAAAVPdqqWPQ999.jpg

然后等待扇区读写指令,并完成扇区的读写操作,下图为模块的读写状态机转换图。

pIYBAGAY4nCAQqsyAAAf_e76vM4254.jpg

在此模块中定义了两个参数,SD卡的初始化过程是需要先用慢时钟来发送命令和配置,等待初始化成功后再用快时钟来进行数据读写。

parameter SPI_LOW_SPEED_DIV = 248
parameter SPI_HIGH_SPEED_DIV = 0

3.2 sd_card_cmd

sd_card_cmd模块端口的说明如下:

信号名称 方向 说明
sys_clk in 时钟输入
rst in 异步复位输入,高复位
spi_clk_div in SPI时钟分频,SPI时钟频率=系统时钟/(( spi_clk_div + 2)*2)
cmd_req in sd卡命令请求
cmd_req_ack out sd卡命令请求应答
cmd_req_error out sd卡命令请求错误
cmd in sd卡命令,命令+参数+CRC,一共48bit
cmd_r1 in sd卡命令期待的R1响应
cmd_data_len in sd卡命令后读取的数据长度,大部分命令没有读取数据
block_read_req in 块数据读取请求
block_read_valid out 块数据读取数据有效
block_read_data out 块数据读取数据
block_read_req_ack out 块数据读取请求应答
block_write_req in 块数据写请求
block_write_data in 块数据写数据
block_write_data_rd out 块数据写数据请求,提前block_write_data一个时钟周期
block_write_req_ack out 块数据写请求应答
nCS_ctrl out 到SPI master控制器,cs片选控制
clk_div out 到SPI Master控制器,时钟分频参数
spi_wr_req out 到SPI Master控制器,写一个字节请求
spi_wr_ack in 来自SPI Master控制器,写请求应答
spi_data_in out 到SPI Master控制器,写数据
spi_data_out in 来自SPI Master控制器,读数据

sd_card_cmd模块主要实现sd卡基本命令操作,还有上电初始化的88个周期的时钟,数据块的命令和读写的状态机如下。

pIYBAGAY4nGAKAKoAAA2luJZQ60601.jpg

从SD2.0的标准里我们可以看到,从主控设备写命令到SD卡, 最高两位47~46位必须为“01”,代表命令发送开始。

o4YBAGAY4nKAOf8BAACPLg8D3-E193.jpg

所以代码中都是将48位命令的高八位与十六进制0x40做或操作得到的结果再写入,所以才有了如下一段代码:

pIYBAGAY4nKAFbhFAAAIh-42-9s730.jpg

3.3 spi_master

spi_master模块主要完成SPI一个字节的读写,当SPI状态机在idle的时候,检测到wr_req的信号为高,会产生8个DCLK,并把datain的数据从高位依次输出到MOSI信号线上。MOSI在8个DCLK的输出数据为datain的值0x58。

同时spi_master程序也会读取MISO输入的数据,转换成8位的data_out数据输出实现SPI的一个字节的数据读取。

4. 实验现象

下载实验程序后,可以看到LED显示一个二进制数字,这个数字是存储在sd卡中第一扇区的第一个数据,数据是随机的,这个时候按键KEY2按下,数字加一,并写入了sd卡,再次下载程序,可以看到直接显示更新后的数据。

开发板

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

    关注

    1629

    文章

    21742

    浏览量

    603537
  • 嵌入式
    +关注

    关注

    5083

    文章

    19129

    浏览量

    305400
  • SD卡
    +关注

    关注

    2

    文章

    565

    浏览量

    63908
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91615
  • 紫光同创
    +关注

    关注

    5

    文章

    85

    浏览量

    27511
收藏 人收藏

    评论

    相关推荐

    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-SD读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD读写实
    的头像 发表于 05-18 09:36 1395次阅读
    【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>

    国产FPGA介绍-紫光同创

    紫光同创紫光集团旗下紫光国微的子公司,成立于2013年,有十余年可编程逻辑器件研发经历,布局覆盖高中低端FPGA产品。 早在2015年,
    发表于 01-24 10:45

    《测控电路》习题完整参考答案(第八章

    《测控电路》习题完整参考答案(第八章
    发表于 05-07 11:39

    波形的产生与变换电路 第八章PPT

    波形的产生与变换电路 第八章
    发表于 04-20 09:33 19次下载
    波形的产生与变换电路 <b class='flag-5'>第八章</b>PPT

    信号发生电路基础 第八章

    信号发生电路基础 第八章 8.1正弦波振荡电路1、振荡电路:是一种不需要外接输入信号就能将直流能源转换成具有一定频率、一定幅度和一定波形的交流能量
    发表于 04-20 13:58 49次下载

    第八章 线性离散控制系统分析

    第八章 线性离散控制系统分析 数字控制系统是一种以数字计算机为控制器去控制具有连续工作状态的被控对象的闭环控制系统。
    发表于 05-27 15:50 0次下载

    接触式IC读写实验

    接触式IC读写实验 一. 实验目的了解接触式IC 的知识,
    发表于 09-22 17:20 4787次阅读
    接触式IC<b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>

    51单片机第八章素材

    单片机第八章素材练习,主要讲解单片机的初步应用只是,配合protues使用,加强对单片机有关知识的理解。
    发表于 11-16 18:53 1次下载

    电子技术基础模拟部分第五版_第八章习题答案.pdf

    电子技术基础模拟部分第五版_第八章习题答案.pdf,作业题解答!
    发表于 04-11 17:44 0次下载

    《测控电路》习题完整参考答案(第八章

    《测控电路》习题完整参考答案(第八章
    发表于 02-14 17:02 0次下载

    电路《电路原理》邱关源---第八章 相量法

    电路《电路原理》邱关源---第八章 相量法
    发表于 01-18 11:37 0次下载

    【正点原子Linux连载】第八章汇编LED灯试验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    【正点原子Linux连载】第八章汇编LED灯试验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
    发表于 12-01 19:21 10次下载
    【正点原子Linux连载】<b class='flag-5'>第八章</b>汇编LED灯试验--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    【正点原子FPGA连载】第八章LED灯流水实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    第八章LED灯流水实验LED灯流水作为一个经典的入门实验,其地位堪比编程界的“Hello,World!”。对于很多电子工程师来说,LED灯流水都是他们在硬件上观察到的第一个实验现象。本
    发表于 01-17 11:38 1次下载
    【正点原子<b class='flag-5'>FPGA</b>连载】<b class='flag-5'>第八章</b>LED灯流水<b class='flag-5'>实验</b> -摘自【正点原子】新起点之<b class='flag-5'>FPGA</b>开发指南_V2.1

    IC工艺和版图设计第八章Latch-up和GuardRing设计

    IC工艺和版图设计第八章Latch-up和GuardRing设计
    发表于 02-10 18:11 0次下载

    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-SD读写实验

    通过本实验主要学习以下内容: •SDIO操作原理 •SD读写实
    的头像 发表于 06-23 10:49 644次阅读
    【GD32F303红枫派开发板使用手册】第二十三讲 SDIO-<b class='flag-5'>SD</b><b class='flag-5'>卡</b><b class='flag-5'>读写实验</b>