DM9000CEP问题线索汇总

一、uboot下的打印信息分析发生了什么错误、出错的位置和出错的时序条件

相关打印信息为:

rx index error f3

...

rx index error e7
...
rx point error 2dce 05ee 33c0 30f6 
...

rx point error 353c 05ee 3b2e 38e8

...

rx point error 0c84 05ee 1276 0f30

...

rx point error 237e 05ee 2970 278a  

其中,rx index error相关代码部分为:

此前,DM9000_IO寄存器的值已被修改为0xf2,相关代码如下:

其中,宏DM9000_MRCMD即0xf2。

不过,当DM9000CEP到9G10传送数据过程中,DM9000_IO的值被改为0xf3。需要说明的是,0xf2是读取接收内存并移动位置指令,正因为此,才判断DM9000_IO已经被误写为0xf3而非读取成0xf3。辅助判据为,rx point error打印错误。

rx point error的四个参数依次为save_mrr, RxLen, calc_mrr, check_mrr,关系是:save_mrr+ RxLen=calc_mrr=check_mrr,现在结果为check_mrr<calc_mrr,既DM9000_IO寄存器误写入0xf2将正常数据传输打断。

那么,写DM9000_IO的时序条件是:CMD=0,CS=0,IOW上升沿有效。且DM9000_IO被修改发生在9G10从DM9000CEP的内存中读取数据的过程中,这个过程CMD=1,CS=0,IOW=1,IOR上升沿有效,即CMD和IOW都是写DM9000_IO无效信号。所以,应该注意读取数据时CMD=0从何而来。这里牵扯出一个问题:只有地址线A2和数据线D0-D15是SDRAM和DM9000CEP复用的,那是如何实现调度的呢?异常的CMD=0如何捕捉呢?问题是出在CS上还是CMD上呢?

二、对于出错原因的推测和验证方法

这里需要指出,CS信号线加33pf电容后通信质量得到改善,可以做两点推断:1、当数据总线做SDRAM操作使A2为0时(误写DM9000_IO发生的时间),CS发生低电平误触发,IOW产生上升沿误触发(如果是同时误触发,那33pf加在IOW上同样会改善通信(通过实验验证),之后再用示波器脉宽触发捕捉异常信号);2、写DM9000_IO时CMD信号忽然变低(IOW上升沿可能对A2产生串扰,但却无法解释CS信号线修正的原因),尝试33pf修正,效果不明显。

阶段性成果:33pf电容可以改善CS和IOW端质量,可以揣测9G10读写SDRAM或者nandflash过程中,CS和IOW产生了错误的有效信号,此信号属于窄脉冲,所以33pf电容可以给予很好的改善。那么通过示波器脉宽触发功能查找窄脉冲信号,确定之。实验结果:并没有捕捉到CS和IOW上的窄脉冲;A2所能引发的CS或IOW相关串扰低电平在2.5V左右。

二、寻找误写DM9000_IO波形的新方法——GPIO配合法:

在程序中,dm9000_inblk_16bit函数每次读DM9000_DATA后,读一次DM9000_IO,若DM9000_IO不等于0xf2,通过gpio触发示波器,然后再从示波器回溯CS和IOW发生的变化,那误触发波形基本就在变化中。代码如下:

另外,dm9000x.c需要增加两个头文件#include <asm/arch/at91sam9261.h>和#include <asm/arch/gpio.h>。关于PA31功能设置的介绍在《【原创】基于9G10上U-Boot的gpio控…》中。

2012-3-1

实验:通过上述程序中gpio制造的低电平触发EXT TRIG



第二幅图像比较奇怪,为何与DM9000_inb(DM9000_IO)对应的A2是高电平,而DM9000_inw(DM9000_DATA)是低电平呢?为了解答疑惑,将程序做如下修改:

(二啦二啦!示波器是“左先右后”哎!!!FUCK!!!重做!!此处犯了二,你懂得)



还是没看出什么,继续加大M。

M增加到10us,但是依旧没有发现触发前一帧数据cs信号的位置,而CMD有所记录,说明不像是示波器存储问题。我怀疑是printf指令消耗了不少时间,程序做如下修改。

bingo!答对了!

再次用“gpio配合法”将发生错误前后波形挖掘出来!

这次实验虽然没有发现误写DM9000_IO的存在,但是误写是发生在SDRAM的相关操作时没有问题的(推论:快速的总线操作容易引发如CS或IOW的不可忽略噪音)!

2012-3-2

读出不为0xf2的DM9000_IO值和前一次DM9000_IO读时序间没有发现明显的写DM9000_IO时序,做如下判断:

1、CS和IOW突变脉宽太窄,没有被示波器捕捉到。

2、读出不为0xf2的DM9000_IO值和前一次DM9000_IO读时序间,发生了SDRAM相关操作,是不是影响到VCC从而搅坏了DM9000CEP中的数据。

3、DM9000CEP本身有问题。

4、在核心板上测量而不是底板上,会不会有问题。

对于疑惑1,可以采用DPO4034示波器再次进行波形采集观察。对于疑惑2,首先可以换一个比较干净的电源,用飞线的方式引一下,特别注意和核心板的位置关系。对疑惑4,就是更改测试点。其次就是CS或IOW带上电容之后再观察相关信号波形。如何判断SDRAM相关操作时电源噪音是不是引发DM9000_IO误操作的元凶,考虑方法!

实验结果:

此图说明:DM9000_IO中的数据确实被修改过了(两点推论:误写时序肯定发生过;DM9000_IO无故变化)

IOW端接示波器探头后,通信质量改善明显!CS端有同样的效果(推论:判断的天平向“误写时序发生过,总线受到干扰”倾斜)。

2012-3-6

部署:

1、用总线串小额电阻的方法改善噪音水平,并学习EMC相关知识。

2、尝试用cadence绘制四层板,做好回流路径,验证串扰改良效果。

永不止步步 发表于12-30 11:03 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:305817个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号