NIOS2下的SDHC调试
本想自己做个简单易用的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扇区数据:
往某一扇区写入数据:
说实话,特权同学并不愿意很深入去做软件。不过做一些底层的驱动工作,完成一些基本的时序接口的设计也算是硬件工程师分内的工作。一点不懂软件的硬件工程师不是一个合格的硬件工程师,至少他将来很难成为一个称职的系统工程师。所以,在年轻的时候,苦活脏活累活都是应该好好去做的……
文章评论(0条评论)
登录后参与讨论