背景
C6678外挂了一片SPI接口的Nor Flash,型号为Micron N25Q128A13BSF404F,其容量为128Mbit,由于电平匹配问题中间使用了一片EPLD作电平转换,将6678的1.8V电平逻辑转换为3.3V。
问题描述
开发和调试很顺利,在完成软件概要设计后约一周内就完成了所有编码和部分测试工作。但是在测试过程中发现当SPI的时钟配高一些(50MHz)的时候,就会出现Flash初始化不通过,具体现象是读取ID不正确,与正确的ID总是移位1个比特。当把SPI时钟调低到20MHz后又恢复正常,而在30~40MHz左右时又总是一会儿正常一会儿错误。
分析排查
这时先怀疑芯片不支持这么高时钟速率,然而查手册发现其中明确提到最高支持时钟速率为108MHz。然后又询问硬件设计人员物料来源,得知通过正常途径采购,芯片本身应该没有什么问题。最后问题应该还是归结到软件问题上。
先查SPI驱动中对分频的配置,仔细对比手册没有找到问题。然后用示波器测量时钟引脚频率,仍然正常。测量读ID时主机发送的命令信号,依然正常。再测量不同频率下6678的接收引脚信号,在频率逐渐提高过程中时钟采样沿居然逐渐接近了数据波形的边沿处!最终40MHz时完全采在了前一个bit的后部,结果当然会移位1个比特。
根据这个测量结果仔细分析,终于找到了其中的原因。原来是中间的EPLD在捣鬼,信号经过它时除了电平转换,还会有一定的时延效应,正是这个时延导致了数据错误。详细分析如下。
理论分析
SPI总线由SPICS、SPICLK、SPISIMO和SPISOMI组成,其中前三根由6678驱动,后一根由N