特权同学

NIOS2下的SDHC调试

0
阅读(13818)

本想自己做个简单易用的SPI控制器IPcore挂在NIOS2处理器上,整理半天却发现组件库里有3wire SPI外设,看看软件说明书配置一下也是很easy的,于是放弃了自己DIY组件的打算。

 这两天调试了一下,之前用SF-EP1C板调试过2G以下的SD卡。这下面对SDHC卡,由于之前的经验,配合官方又臭又长的2.0的规格书(话说回来, 最终帮大忙的还是这个spec,还是很享受那句话“忠于原文”),今天把SDHC的底层驱动函数稍微都整理好了,过阵子可以交给同事继续软件开发工作了。

 这个SDHC的调试过程还有那么些讲究,这里特权同学也啰嗦一下,也许能给读者您带来一点灵感。

1.  通常在调试情况下,如果发给SDHC卡发送CMD0命令 ,SDHC一般都会回到IDLE。但是特权发现有些时候不可以,那么这时候要是不重新上下电,很可能你会耗费大量时间郁闷在某阶段调试程序怎么老是不通。 所以特权同学刚开始调试时的做法很简单,给FPGA的配置芯片(同时烧录FPGA配置数据和软件程序的存储器)烧录软件调试对应的硬件FPGA配置文件以 及一个对与SDHC接口的SPI总线不做任何处理(初始化为高电平)的软件程序。然后每次运行调试软件时重新上一次电。这样保证万无一失,绝不会死在 SDHC不回IDLE的窘境下。

2.  说点实在的,上电初始化的过程依次需要发送以下指令和回复:

CMD0—R1                 sdhc_write_cmd(0,0);—0x01

CMD8—R7                 sdhc_write_cmd(8,0x1aa);—0x01000001aa

CMD58—R3               sdhc_write_cmd(58,0);—0x0100ff8000

ACMD41—R1            sdhc_write_cmd(55,0);--0x01

                                       sdhc_write_cmd(41,0x40000000);--0x00

CMD58—R3               sdhc_write_cmd(58,0);—0x01c0ff8000

其中,例如sdhc_write_cmd(58,0,0x95); 58表示index,0表示argument。具体涵义准备深究的人肯定都明白了。

 

 最后,发两个图片作证,哈哈!

读取DBR扇区数据:

 

往某一扇区写入数据:

 

说实话,特权同学并不愿意很深入去做软件。不过做一些底层的驱动工作,完成一些基本的时序接口的设计也算是硬件工程师分内的工作。一点不懂软件的硬件工程 师不是一个合格的硬件工程师,至少他将来很难成为一个称职的系统工程师。所以,在年轻的时候,苦活脏活累活都是应该好好去做的……