特权同学

SDHC控制器代码移植日记一(SD_CRC_7)

0
阅读(2290) 评论(1)

题记:opencores是个不可多得的开源好网站,虽然很多时候并不是download下来的代码就直接能用,但是能够多参考前人的努力成果,并且消化后转化为自己的东西能很大程度上加速工程项目的开发。从他人的代码里也能够学到很多设计的精髓,也很有助于自身水平的提高,并且这个提高是立竿见影的。特权同学最近在移植一个SDHC卡控制器,解读他人代码的过程是很痛苦的,但是从这几天解读的过程中感觉收获颇丰,能够在这个过程中提升自己,就凭这一点就足以让我鼓起勇气坚持下去。

         未来一段时间的博文里会慢慢的来分析这些代码,可能不会上传整理过的源码(大家可以到opencores下载源码),但是会从整体功能、接口时序等方面入手来分析这份代码。感兴趣的朋友可以从今天这篇最简单的SD_CRC_7模块解读开始,和特权同学一起进入SDHC控制器的代码移植之旅。

 

2.SD_CRC_7模块

2.1 功能原理图

 


图1

2.2 接口定义与说明:

     //系统信号,时钟和复位

input CLK;    //输入时钟信号

input RST;     //CRC7模块复位信号,高有效                      

     //功能实现信号              

input BITVAL;       //CRC7下一个输入bit

input Enable;        //CRC7校验功能使能信号

output reg [6:0] CRC;  //输出的校验结果

2.3 接口功能描述

         BITVAL为图2的data_in信号,CRC为图2的data_out信号。当Enable信号有效(高电平)后,每个时钟的上升沿锁存一次BITVAL数据,40个时钟周期后,Enable信号撤销(低电平),此时的CRC[6:0]值即40bit数据对应的CRC7校验值。

  1. parameter SDINIT_RST = 4'd0,//复位等待状态,复位期间保持CD/DAT3信号线高电平
    SDINIT_CLK = 4'd1,//74+时钟产生状态
    SDINIT_CMD0 = 4'd2,//发送CMD0命令状态,使SD卡进入idle转态,SD模式下此命令无响应
    SDINIT_CMD8 = 4'd3,//发送CMD8命令状态,电压检测、版本检测,有相应为SD2.0版本开启扩展命令功能
    SDINIT_CMD55 = 4'd4,//发送CMD55命令状态,告知SDHC卡下一条命令为应用命令
    SDINIT_ACMD41 = 4'd5,//发送ACMD41命令状态,查询SD卡是否支持SDHC以及让卡返回工作电压参数
    SDINIT_CMD2 = 4'd6,//发送CMD2命令状态,获得CID寄存器信息
    SDINIT_CMD3 = 4'd7,//发送CMD3命令状态,让SDHC卡建立一个相对地址RCA
    SD_CMD7 = 4'd8,//发送CMD7命令状态,连接卡,使卡进入transfer的状态
    SD_CMD16 = 4'd15,//发送CMD7命令状态,设置读写块大小为512字节
    SD_CMD55 = 4'd9,//发送CMD55命令状态,告知SDHC卡下一条命令为应用命令
    SD_ACMD6 = 4'd10,//发送ACMD6命令状态,设置位宽
    SD_IDLE = 4'd11,//sd初始化完成正常工作状态
    SD_CMD24 = 4'd12,//发送CMD24命令状态,包含写入的逻辑扇区地址32位
    SD_WR_ST       = 4'd13,
    SD_DELAY = 4'd14;//sd操作完毕延时等待状态

    如上 我依次发送了上述命令 得到的响应都正确 最后写完成等待到"010"的响应 接着也等待到dat0信号线有低变高 但是用winhex看不到写入的数据 请求楼主和好心人指点!!