当前页面: 主页 > 本港台开奖结果 >

本港台开奖结果

梦翼师兄分享:SD卡驱动原理以及代码详解(1)
更新时间:2020-01-31

  SD卡是由松下电器、东芝和SanDisk于1999年联合推出,由于它体积小、数据传输速度快、可热插拔等优良的特性,被广泛地于便携式装置上使用,例如数码相机、个人数码助理和多媒体播放器等。

  今天梦翼师兄将和大家一起学习使用FPGA来对SD卡进行简单的读写操作。内容分为四个部分(1.SD卡读写原理、初始化;2.SD卡内部代码详解;3.SD卡写数据模块SD_WR;4.SD卡读数据模块SD_RD)

  下图为SD卡的实物图片,在日常生活中我们也能经常见到,体积较小,很轻薄,非常容易携带。

  下图为开发板上SD卡接口的电路连接图,信号线、SD_CMD、SD_CLK、SD_CD_N连接到FPGA的引脚上。本次实验我们使用的是SPI总线(还有一种SD模式可以对SD卡进行读写,这种模式对于信号线、SD_CMD、SD_CLK都会使用到)来对SD卡进行读写,香港六和开奖现场直播,所以我们只用到SD_DAT0、SD_DAT3、SD_CLK、SD_CMD这几条信号线,其中SD_CLK作为SPI总线的时钟信号线;SD_CMD作为SPI总线的数据输入信号线(数据输入到SD卡,“SD_datain”);SD_DAT0作为SPI总线的数据输出信号线(数据从SD卡中输出,“SD_dataout”);SD_DAT3作为SPI总线的片选信号线(控制是否选通SD卡,低电平为选通,“SD_CS”)。

  下图为本次设计的连接示意图,FPGA芯片通过SPI总线向SD卡发送命令或数据,也可以通过SPI总线从SD卡中读出数据。SPI总线的时钟信号的最高频率为25MHz,SD_CS(SD_DAT3)为片选信号线(电平为低即为选中此SD卡),SD_datain(SD_CMD)与SD_dataout(SD_DAT0)为SD卡的数据输入和数据输出信号线。

  下图为本次设计需要使用的命令,想让SD卡工作必须先对其初始化,然后还要给读或者写命令,之后才能读出数据或写入数据。初始化需要FPGA芯片给SD卡发送CMD0命令对其进行复位,SD卡会返回1个字节的数据,如果为0x01即表示复位成功,如果返回值不为0x01那么就需要重新发送CMD0命令以此来重新复位,直到返回值为0x01为止;发送完CMD0命令后需要还需发送CMD8命令来检测SD卡的版本是否为SD2.0,SD卡的返回值为5个字节我们检测其中的4bit位([11:8])来确定版本是否为SD2.0,如果返回值的这4bit位为4’b0001那么我们就认为SD为2.0版本,如果返回值的这4bit位不是4’b0001则继续发送此命令,直到返回值为4’b0001(现在的SD卡基本上为2.0版本);然后还要先后发送CMD55和CMD41这一组命令来确认检测成功,发送这两个命令后SD卡的正确返回值分别为0x01与0x00,如果发送CMD55或CMD41命令后返回值不正确,那么都需要重新先后发送CMD55和CMD41(这两个命令为一组命令,要发送CMD41就必须先发送CMD55);CMD24和CMD17分别为SD卡写命令与读命令,这两个指令都包含了用于读写数据的地址。

  下图为SPI总线向SD卡发送指令及数据的时序图,由图可知SD_DI(SD_datain)信号是在时钟信号的下降沿到来时变化的,所以当此时钟信号与数据信号传送到SD卡时,SD卡内部就可以使用此时钟信号的上升沿来对数据信号线SD_DI(SD_datain)采样。

  下图为SD卡发送或反馈回数据的时序图,有图可知SD_Dout(SD_dataout)信号是在时钟信号下降沿到来时变化的,数据从SD卡传送到FPGA芯片,在FPGA芯片内部我们可以使用此时钟信号的上升沿来采样,这样就可以采样到比较稳定的数据。

  下图为本次设计的模块架构图,分别为初始化模块(SD_INI)、写数据模块(SD_wr)、读数据模块(SD_rd)和输出选择器。因为不管是初始化模块(SD_INI)、写数据模块(SD_wr)、读数据模块(SD_rd)都需要使用到SPI总线的数据输出信号SD_datain与片选信号SD_cs,它们只有2根信号线,为了避免数据的互相影响,不能将读写数据模块与初始化模块的输出信号都连接到这2根信号上,需要将他们连接到输出选择器中,选择器根据实际情况选择哪个模块的输出信号连接到SPI总线根信号线上。在设计中我们为了简化设计,输出SPI总线的时钟信号将会由top顶层模块一直输出25MHz的时钟,不必要在初始化模块、读写数据模块分别输出时钟到选择器中再由选择器选择哪个模块传送进来的时钟信号作为SPI总线的时钟信号。

  初始化模块将初始化命令(SD_cs_in、SD_datain_in)和初始化完成标志位(init_finish)送到选择器模块并接收SD卡的反馈数据(SD_dataout),选择器将会根据实际情况来判断到底将哪个模块的输出信号作为SPI总线的输出信号。

  下图为SD卡复位的时序简图,在SD卡上电后需要等至少74个时钟周期才能开始后面的操作。之后将SD_cs拉低,开始传送CMD0;传送完后将SD_datain拉高,并且SD_cs低电平不变等待接收SD卡的反馈数据;接收到SD卡的反馈数据后就可以拉高SD_cs(发送操作命令后SD卡的返回值有些为1字节,有些为5字节,那么我们使用一个48位的寄存器来寄存这些数据,再使用一个数据有效使能信号来表示数据接收完成且有效,就可以很好的判断此寄存器哪些bit位是我们需要的数据);SD_cs拉高后还要等待至少8个时钟周期后才能进行别的操作。


香港本期开奖结果| 香港最快开奖结果直播| 最快报码室| 九龙传真| www.444767.com| 曾道人内幕玄机| 心水论坛| 一肖中特免费公开资料| 香港马报开奖结果2017| 马报四不像图片| 二四六天天好彩资料免费大全下载| 天下彩票开奖结果|