这个故事要讲的是一个模拟工程师与一个数位工程师携手合作,利用各自的专长技术,出人意料地解决了他们完全不熟悉的一套系统的问题。
话说我们公司的业务部门曾经代表工程部门接下一个挑战:他们承诺某个客户,表示我们能够修理好一套电信产品,但其实那种东西我们以前从没见过,所以也没有测试工具、更别说它的架构图(而原厂也已经停止支持该产品)。
这时候工程部门只好再一次使出浑身解数,力求达成使命;于是我的办公室出现了大约15片可热插入背板的板子,准备进行初步评估以及探索其内部运作。这些板子有专属的SIMM直插式内存模块,其中有几个竟然已经坏了;暂时用其他板卡上、有明显烟熏损伤的内存模块来替代,我们让它们平躺在工作台上并接上电源,成功让它们起死回生(但是我们没有测试机箱可用!),然后开机并能透过RS232端口沟通。
那些内存模块内含4颗SRAM以及4颗闪存,每颗内存芯片分享一个8位带宽的数据总线,每一对SRAM能与所选择的相同芯片一起运作。我跟老板说,我们可以为待测内存模块打造小型测试夹具,进行SRAM测试,或是在有必要时重新编程闪存。
于是坐在我距离我三格座位的一个数字/软件工程师同事,被指派跟我一起执行这个案子;他之前设计过一款使用表面黏着 PIC微控制器的PCB,能用以作为我们目前或未来所需测试夹具的通用I/O。想不到它刚好有足够的I/O线路能处理待测内存模块的位置与数据总线,而且只要我将4个独立的待测数据总线在夹具上绑成两两成对,就还会有两道备用线路,因此我们决定就使用它了。
我订购了必要的SIMM连接器,一片电镀通孔面包板(plated-through-hole protoboard),还有一些扁平电缆(ribbon cable)以及IDC插座以链接PIC电路板;间距为.05吋的72接脚SIMM连接器有点恼人,因为面包板就必须拥有相同的间距;其微小的.025吋直径孔洞无法容纳.025吋平方的针脚,所以无法进行绕线(现在我知道英语谚语“Can't fit a square peg into a round hole--格格不入”的由来了!)。
我必须直接把扁平电缆焊在面包板上,并串连一条短的30AWG线到SIMM连接器;只要绞缠的扁平电缆没有镀锡过度(overly tinned,镀锡是为了让线路能绞在一起),它们实际上能刚好穿过面包板的孔洞。
另一个恼人的状况是SIMM连接器有塑料做的固定片(retaining tab),会因为将内存模块重复插入而快速穿出;制造商的用意可能是因为通常SIMM只会在产品生命周期中替换一次,但我们是为了要测试内存模块、得重复插拔。
幸运的是,因为预料到最后会需要方便替换,我为SIMM连接器在面包板上使用了插座式接脚条(socket pin strips);随后我发现一种连接器有金属的固定片,这种特殊规格并没有显示在供货商的在线零件说明中,我得从众多机构图片中自己去找。
夹具的第一次测试很顺利,我同事编写了一套walking-ones内存测试程序,能立即在数个待测电路板上发现损坏的SRAM芯片;我们将之替换然后重新启动,但一直出现令人不安的「RAM损坏」讯息。因为可用性,我们用12nec的SRAM取代原本20 nsec规格SRAM,速度应该不是问题….嗯…所以可能我们需要改善测试算法。
然后我们鼓起勇气从良好内存模块的闪存上,复制了大约五个不同版本的韧体,并尝试把新韧体重写入模块中;一开始完成了半开机(semi-booted),却显示「缺少应用程序仔入器」的讯息。而重载韧体之后,我们甚至无法透过RS232端口与之沟通;不知为何,应是「已知为良好」的韧体搞砸了一切。而且我同事确认过,在良好与损坏模块中的韧体是一模一样的,那为何一个能开机一个不能?是速度问题吗?
我同事继续写他的程序,并进行了walking-zeros测试;但另一件奇怪的事发生了,在数个已知良好的内存模块上,数据总线绑在一起的两颗SRAM因为同样情况发生故障──当写入7F代码,回读出来的却是FF;而且只有一对SRAM发生这种故障,另外一对SRAM一直都是正常运作。
难道我连错了夹具上的线吗?我们用示波器测试的结果证实还真的是这样,当我同事写入7F代码,待测SRAM与夹具传回的讯息也是一样;显然他的PIC微控制器把明确的逻辑0读成了逻辑1,但只在该数据总线的位7上。不过walking one测试成功了,位7在测试中被正确读取为逻辑0。
因为我对我同事的PCB布线以及PIC芯片不熟,我请他把他的KiCAD板布线图档寄给我;我已经知道那里没有电源/接地平面(power/ground plane),但我也没料到看见部分接地接脚的接点(connections),在它们应该要被全部集结在PIC芯片之下时,是用蜿蜒的绕行路线输入以及输出。
他部分的Vdd接点甚至没有与Vdd的铜联机,但是依赖芯片内的接点;他的耦合电容距离1吋远,添加2吋的走线电感(trace inductance);我在这里嗅到模拟问题,可能是源自于电源绕线。要找出导致某个问题的「元凶」,有个方法就是消灭它,于是我用了一个以前成功过的方法,就是添加电源平面以及更多的去耦,以下的图片是我们找一位焊接专家所完成的作品:
两个方块是单面包铜的迷你电源平面,排列在其末端的去耦0805芯片电容尺寸与以AC耦合的电源平面相当;PIC微控制器这下子不能抱怨微弱的电力侵蚀绕线,所有的电源与接地脚位现在都绑一起了
很遗憾,我的方法没有成功,不过也去除了电源的嫌疑;我仍觉得是模拟问题。在我们执行一些测试,想看看是否是其他字节模式(byte patterns)导致位7在实际上是0时被错误读取为1时,我的怀疑被进一步证实了。
原来确实有很多位模式会这样,如果仅有3个低阶位(lower-order bit)是代表1,PIC芯片会在位7实际上是0的时候把它读成1。这对低阶位来说似乎无关紧要,只会让3个以上的集(set)变成1;但如果累积足够数量,它们似乎会渗入位7。这岂不是模拟电压总和(analog voltagesummation)?
这让我茅塞顿开;我同事的PIC微控制器以3.3V运作,我的内存模块则是以5V电源启动;我同事之前跟我保证过,他的PIC输入电压可达5V耐受度(tolerant),规格表上也是这么写的。我仔细阅读了规格表,第一页就写着「5.5V输入容忍度(仅数字接脚)」,因此如果输入是被配置为数字,应该就是5V耐受度,没错吧?
而在规格表中的某一页又写得更详细:所有输入能被配置为模拟或数字,并非可达5V耐受度;它们有最高到3.3V Vdd的箝位二极管(clamp diode)。所有问题数据总线的8个位,以及其他数据总线中的1个位都是这种输出;因此没错,这是个模拟问题,5V是过度驱动输入电压以及规格表上的缀饰….搞清楚之后我发明了很多新的脏话。
这也解释了我们覆写的闪存不再启动的原因,所有我们拷贝的韧体映像都变成垃圾;我得把焊*再次加热,进攻测试夹具,小心翼翼切断扁平电缆加入几个具备5V耐受度的74LVC245总线收发器。而我的PIC微控制器知识以及骂脏话的功力也在过程中精进不少。
解决问题之后,我们就能辨识损坏的SRAM组件并重写损坏的闪存;在记忆体重写之后,「RAM损坏」的讯息被「RAM良好」取代,先前可能是闪存登录了过去的SRAM故障状态。两个工程师,一个专长数字一个专长模拟,我们最后成功地达成了任务!
本文由深圳市科易威电子设备有限公司公司为您分享: 我们的官方网站为 http://www.vavsz.com
文章评论(0条评论)
登录后参与讨论