新闻中心

EEPW首页 > 牛人业话 > 管脚兼容是谎话 总有一点小偏差

管脚兼容是谎话 总有一点小偏差

作者:三昧道人时间:2018-10-26来源:电子产品世界收藏

备受广大人民群众喜爱的四大名著之一《西游记》以法相宗开山祖师玄奘大师西行求法的伟大事迹为蓝本,演义成唐僧师徒四人经历九九八十一难,历尽艰辛西天取经的神话故事,其中真假美猴王一节,六耳猕猴和孙悟空相貌无二无别,本领神通也与孙大圣一般无二,让人真假难辨,正所谓唐僧紧箍疼不出,天王镜子照不出,观音我也看不出,还是我佛如来慧眼识人,道出六耳猕猴真身并用金钵盂罩住被孙悟空一棍子打死了事。

本文引用地址:http://www.eepw.com.cn/article/201810/393461.htm

被老谋子炒作为16年来真正想拍的电影“影”则讲述了一个关于替身的故事。替身,人称“影子”,与真身互为一体,令旁人真假难辨,如同孪生,在危急关头挺身而出,替主人博回一命。这种题材貌似很受大家欢迎,虽然不曾看过,但是吴宇森的《变脸》据说也是这种以假换真的故事。

后来,这种以假乱真、雌雄难辨的手法被上海交通大学微电子学院院长陈进教授发扬光大,这位海归科学家创造性地以打磨更换标签的方式发明了“汉芯一号”,“骗”过了多位评审专家,套取了高达上亿元的科研基金,在国人亟待在高科技领域有所突破之际,以一种荒诞离奇的方式制造了轰动一时的重大科研造假事件。

雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?

时值当下,嵌入式领域的MCU“管脚兼容”不仅可以在软件开发上做到代码复用和开发工具的通用,还能够在硬件设计上直接拿来主义,更能在生产上实施物料替换,以应对芯片断供或供货周期长的难题,因为备受广大嵌入式系统厂商青睐,可是,这些“管脚兼容”的芯片真的没有任何差别吗?

1

嵌入式软件工程师实在是一群相当苦逼的群体,这不,都快到半夜十二点了,两位难兄难友还在那里调着程序,有一搭没一搭地交流着,更多的时间都陷入深深的思索中。

黑夜伸开它那巨大的翅膀,笼罩着渐渐入睡的大地。窗外,细雨唏嘘如歌,落叶曼妙如舞。室内,安静并非无声,两位精疲力竭的码农窃窃私语。

“三昧道人,你说这两颗芯片到底有什么差别呢?”同事一只手支着肥胖的脑袋,声音有气无力,犹如梦呓。

夜色渐浓,睡意犹如惊涛拍岸,一股股向我袭来。我强打精神,看了看他那张结婚后逐渐发胖的脸蛋,瞄了瞄他那日益隆起就要藏不住的肚腩,定了定神,字斟句酌地说道,“也许是生产工艺不同吧。根据芯片介绍,意法半导体的这颗SPC560B40和飞思卡尔的MPC5604B采用的是飞思卡尔的PowerPC内核和意法半导体的Flash技术,管脚兼容,设计一致,软件通用。他们的唯一区别应该是SPC560B40是意法半导体生产的,MPC5604B是飞思卡尔生产的,两家的制造工艺不同,所以导致了这个差异。”话虽至此,我心里却犯起了嘀咕,“制造工艺不同,最多有些性能上的差异,也不应该在功能上有所差别呀!”

两个电路板接着各自的测试盒,静静地躺在工作台上,不悲不喜,全然不理会我们的对话。这两块板子,一块上面焊的是SPC560B40,一块上面焊的是MPC5604B,其它完全一致,烧了同一套程序后发现,采用SPC这颗MCU的电路板能够通过遥控钥匙唤醒,采用MPC这颗MCU的电路板却死活都唤不醒。

2

长夜清寂,微风习习,细雨渐歇,在月色的沐浴中,窗外的草地上翻滚着银闪闪、绿油油的波浪。站在窗前,仰望苍穹,天上的星星一眨一眨,像极了小孩子的眼睛。

我伸了伸懒腰,把碍事又碍眼的同事打发回去,泡了一杯深茶,驱赶一下睡意,沉下心来,准备再捋一捋程序。

遥控唤醒程序说来也很简单,MCU睡眠40ms,自动临时唤醒后初始化遥控接收驱动,如果2ms内没有收到达到阈值数量的有效射频位,就再次进入休眠,40ms后再次临时唤醒。。。如果再这2ms内收到了若干有效射频位,则继续接收2ms,倘若仍能接收到若干有效射频位,则按照遥控报文时长的2倍设置接收时间,倘若接收到有效的报文,则退出休眠,即所谓被遥控钥匙唤醒。

方案很简单,既能保证没有有效信号时安心睡眠,实现较低的休眠电流,又能够在有干扰时通过“三级过滤”滤除干扰,还能在存在有效钥匙时及时唤醒。这段程序一直以来跑得挺好,直到这次,因为物料紧张,没有足够的SPC,用了一些MPC来救急,才发现用了MPC的这些板子唤不醒了。显然,这两颗所谓管脚兼容、软件通用的MCU肯定有一些不为人知的不同!

3

程序员喜欢夜晚,主要是贪恋它的安静。四周一片沉默,陷入沉睡之中的偌大的办公室寂静无声,此时此刻,无丝竹之乱耳,唯有案牍之劳形。面对Bug,心底越静,就越是有Bug马上就要跃出水面的期待。其实,Bug对于我具有符咒般的魔力,它虽然让人茶饭不思,废寝忘食,但它不仅不让人觉得害怕,甚至还有一些欣喜之情混杂其中。也许,正如逆境让人坚强,苦难让人成长一样,Bug就是将程序员百炼成钢的铁石,不磨不足以成器!

不消说,MPC唤不醒,问题就出在自动临时唤醒后的遥控接收上。自动唤醒期间的遥控接收也很简单,先让MCU进入一个以内部时钟为系统时钟的模式,然后设置一个输入捕捉模块和计时器,上升沿触发中断,通过计时器统计两次中断间的时间间隔,判断上升沿之间的位宽,进一步判断位宽是否满足遥控协议规格。在2ms内判断是否存在若干满足规格的位宽,以确定是否通过第一级滤波,之后还有两级滤波,保证既可以被有效钥匙及时唤醒,又不会被外界干扰错误唤醒。

为了定位问题究竟出在这三级滤波的哪一级上,我添加了一点测试程序,通过第一级滤波就点亮一个led灯。

虽然led灯提供不了多少信息,但是它就像前进之路上的明灯,可以明明白白地告诉我们:系统还活着!

结果发现,第一级滤波都能没过去,这说明这个2ms内输入捕捉模块似乎没有工作起来。

输入捕捉模块以系统时钟分频出的1MHz为时钟源,临时唤醒模式下,为了保证休眠电流满足产品规范要求,选择了内部时钟(16MHz)为系统时钟,正常模式下是以外部晶振+PLL做为系统时钟的,一念至此,我试探性地将临时唤醒模式下的系统时钟源改为外部晶振,下载程序之后一看,居然唤醒了,同样的程序烧录到SPC的板子上,也可以正常唤醒!

一股欣喜之情直冲脑门,浓浓的喜悦在心底荡漾不已,我如释重负地站起身来,外面的月色更加皎洁了,夜色愈加地深沉,它带走了一切喧嚣,将宁静和空旷播撒在这块大地上。

我伸了个懒腰,正准备走人之际,倒霉催地忽然想看看改过时钟源之后的休眠电流如何,话不多说,我设置好休眠条件,摒心静气地等着产品进入休眠,滴答,滴答,我仿佛听得到墙上的时钟走动的声音,决定命运的时刻越来越近了,我仿佛又听到了自己心跳的声音,‘砰’,‘砰,‘砰’,‘梆’,我的一颗心掉到了地上,休眠电流上来1.5mA左右,比产品规范要求多出来0.5mA左右。

4

今夜注定无眠!谁让自己高兴太早来着!

电流怎么上来的?我敏锐地意识到是外部晶振的起振时间问题,内部时钟就是个RC电路,启动时间很快,但是外部石英晶体形式的晶振就不同了,我查了查数据手册,手册中给出的外部晶振最大起振时间6ms,没有给出典型值,我又翻到同样是飞思卡尔MCU芯片的S32K1xx上,上面给出的起振时间是2.5ms。

答案已经呼之欲出了,起振稳定时间2.5ms,再加上第一级滤波的2ms,临时唤醒时间从之前的2ms多一点一下子提高到了4.5ms以上,电流不上去才怪!

既然休眠电流是睡眠时间和临时唤醒时间的比例决定,如今临时唤醒时间翻倍,只需要将睡眠时间翻倍就可以了,看了看遥控报文发送机制,每次至少发三条报文,每条100ms,睡眠时间从40ms调高到80ms,也不会出现漏掉检测机会的情况,按照这种思路,如此这般改了改,休眠电流终于下来了。

看来MPC的内部时钟和SPC的内部时钟还是多少有点区别,外部晶振上倒是一致。但是这种区别是怎么产生的呢?我抱着试试看的心情,改回采用内部时钟的方式,同时将第一级滤波唤醒时间从2ms改成4ms,并修改了有效位数的判定阈值,结果发现,使用MPC芯片的板子也能唤醒了!

奇哉怪哉!之前有效位数是按照2ms设定的,MPC一个也捕捉不到,现在按照4ms设定了,MPC全都能捕捉到了,好像这4ms中的头2ms也能正常接收一样。以我浅显的认识,唯一的解释就是MPC的输入捕捉模块在“40ms睡眠-2ms唤醒-40ms睡眠-2ms唤醒。。。。”这种内部时钟快节奏关闭和开启下的power on和power down有点问题,不过它可以接受“80ms睡眠-4ms唤醒-80ms睡眠-4ms唤醒。。。。”这样的节奏。那么,这种“现象”背后的机制是什么呢?

是不是两家的处理器内部设计也不一样?时钟树、供电网络都有差别,内部IR压降、电磁耦合等问题造成即便通过了制造工艺的签核步骤,也会在芯片生产出来后出现问题?当然这种解释过于浅显、随意,这种表现应该有着更加深层的背景和原因,但是再往深了分析,就绝非我的能力所能窥见的了。在此仰拜高手作答!

后记

嵌入式产品要求严格,换芯片兹事体大,万万不要相信管脚兼容这种广告式的营销用语,经此教训,我深刻地体会到:管脚兼容是谎话,总有一点小偏差。



关键词:

推荐阅读

评论

技术专区

关闭