新闻中心

EEPW首页 > 牛人业话 > 尽信书不如无书,芯片手册也会让你哭

尽信书不如无书,芯片手册也会让你哭

作者:天雷君时间:2019-06-10来源:电子产品世界收藏

四十年波澜壮阔的改革开放,无数中华儿女披星戴月,艰苦奋斗,不忘初心,砥砺前行,终于,中国这条古老的东方巨龙再度崛起,它饱含着历史文明的古韵和现代科技的自信,熠熠地闪耀在世界舞台的中央。

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

眼睁睁地看着民穷国弱的中华民族带着不可阻挡的豪情和碾压一切的豪迈冲出亚洲,走向世界,美国佬终于按捺不住了。

山姆大叔挥舞着大棒,伸着长长的臂膀,把屠刀伸到华为、海康威视、大疆这些中国顶尖的科技公司头上。

尽管任正非先生气度非凡,在这种至暗时刻依然力挺美国公司,呼吁广大国人把“有良心的”美国公司和无良的美国政客分开看待,但是,当我被来自美帝的耽误了好长一段时间时,我依然克制不住压在嗓子眼中的那三个字:耍我呢

1

这颗芯片上面的,我熟悉地不能再熟悉了,可是现在,它竟然像薛定谔先生的猫那样——测不准了!

1560135895946459.jpg

我怔怔地盯着测试工装电路板上这颗芯片——飞思卡尔的MPC5604B,这颗在过去的两年中我无数次在它编码、调试,与之建立了深厚的革命友谊的芯片,在我眼前轻轻拉起了朦胧的面纱。

一切都来得猝不及防,恍惚间,时间倒转,我仿佛回到了两年前。

当时,用过一年微芯的芯片后,新产品上终于又用回了飞思卡尔的MCU。

当飞思卡尔的斜三角标识和‘MPC’的字眼刚刚映入眼帘时,一种自然而然的亲近感浅浅地在我心底漾起。

你好,飞思卡尔!再见,微芯!

每家公司的产品都有自己特殊的基因,、技术资料、例程源码也各有一套体系,带有浓浓的个体色彩。

所以,尽管之前用过的飞思卡尔MCU都是16位,这个MPC是32位,但是读起来,看起来技术资料,还是有一种久违的熟悉感。

就这样,我和MPC的磨合开始了。

在芯片手册和例程的帮助下,我慢慢地熟悉了这颗芯片的CLK、SWT、STM、IO、PIT、ADC、FlexCAN、LINFlex、eMIOS、Data Flash等模块,按部就班地在它上面编程、调试,耐心地找bug,不厌其烦地清理、重构代码,优化产品性能。

一两年下来,产品开发结束,顺利量产供货。

我看着MPC5604B这颗芯片,一种感激之情油然而生。

这芯片性能不错,价格不贵,开发趁手,实在应该给它“打电话”!

本着这种好感,在做另一款产品的测试工装时,我很自然地就向硬件工程师推荐了这颗芯片。

2

一张一弛,文武之道,亦是工程师之道。

前期紧张而忙碌的PEPS产品开发工作结束了,随后开启的测试工装开发,正是松弛下来休养生息的好时候。

测试工装用于对产品的功能进行测试,主要是验证生产下线后的产品的有效性。既不用考虑性能,也不用考虑效率,所以开发难度不高。

再加上我们特意选用了之前产品上用过的MCU,正好可以移花接木。

把上面的代码照搬过来,根据测试工装的功能需求稍加修改,调试运行一番,能实现对产品的测试功能,就到此结束了。

抱着这种拿来主义的放松心态,我一边玩一边写测试工装的代码,直到有一天......

那一天,正进行到对PEPS的ACC/IGN1/IGN2继电器输出电路的测试上。拿ACC为例,测试逻辑如下:

▶通过ISO14229诊断协议中的IO输入输出控制服务,令PEPS输出有效的ACC;

▶在测试工装上用ADC检测ACC继电器输出的电压水平。

这里有两个问题需要跟大家说明。

第一,之所以通过诊断协议的IO控制这种貌似复杂的方式令待测产品在指定的IO端口上输出,而不是根据待测产品的某项功能让该IO端口在执行这项功能时输出,是因为这种方式可以“消解”掉待测产品的功能。

换句话说,“功能”输出的方式取决于待测产品,当测试另一种功能的待测产品时,需要修改测试逻辑中令IO输出有效的实现方式。

“诊断”输出则不然,即使更换了待测产品的功能,也可以通过同样的“诊断-IO控制”方式令IO输出。

第二,之所以使用ADC检测模拟电压,而不是以“IO”的方式检测数字电压,是因为这里的ACC输出电压和被测产品PEPS的输入电压相关。

PEPS供电输入电压范围介于8-16v之间,相应地ACC输出电压介于7.7-15.7v之间(两者相差了一个二极管的压降)。ADC模拟电压方式显然可以更好地应对被测产品输入电压变化时指定IO口电压随之变化的情况。

聪明的读者可能想到了,假设被测产品的供电输入电压为16v时,假设经过分压后,接入MCU的ACC端口上电平为4V,当输入电压为8v时,MCU ACC端口上的电平便下降到了2v。

一个5V的MCU,数字IO上输入4V可以读取为‘1’,当数字IO上输入2v时,你说,MCU会读取出‘0’来还是‘1’来?

3

那一天,风平浪静,万里无云,我按部就班地码字,敲代码,不疾不徐。

在时间的长河中,未来早已存在,而过去永不消逝。所以,着急什么呢?

带着时间虚无主义,我漫不经心地看了看采集上来的ACC端口电压,一种不安的直觉从心底漫起。

征战多年,洒家的直觉一直很准的。

我的目光久久地停在ADC采集ACC端口电压的那条语句上:

if(1 == ADC0.adc_tagp->CDR[ACC_HS_AD].B.VALID){

ACC_relay_AD = ADC0.adc_tagp->CDR[ACC_HS_AD].B.CDATA;

}

PEPS的供电电压为12v,ACC进入到ADC的端口电压大概在3v左右,在5V MCU的10位ADC下,对应的ADC值应该是:

搜狗截图20190610094723.jpg

这里的1023是端口电压为5V时满量程数值。

结果,我得到的数字仅为460!

当时,对于美帝芯片的一丝不恭敬之心,我都是不敢生起的。于是,我自然而然地怀疑到测试工装的采集电路和自己的程序问题。

顺着这种思路,我反复试验了好几种供电电压,用示波器测量了ACC进入测试工装入口处的电压,以及ACC进入MCU ADC端口处的电压。

结果,我更加疑惑了——ADC测不准了!

日出扶桑一丈高,人间万事细如毛。面对着半路杀出的程咬金,想着剩下的并不宽裕的时间,我突然发现,

未来已来,而过去挥霍掉的时间,永不再来。

4

看着这个无比熟悉的MCU,看着这个刚刚在测试工装其它功能上用过的ADC,我依然不敢相信自己的眼睛。

于是,我再一次对IGN1和IGN2这两个端口展开了测试,出乎我意料的是,结果竟然是一样的。

看得到,或者看不到,bug都在那里,不来也不去。

调皮的风儿在房间里跑过来又跑过去,怀疑和笃定的思绪在我脑袋里转过来又转过去,悠悠荡荡,跌跌撞撞。

看来,这几个ADC通道(6/7/8/9)真的是“与众不同”?

#define ACC_HS_AD                   PADC_9

#define IGN1_HS_AD                  PADC_8

#define IGN2_HS_AD                  PADC_7

#define START_HS_AD                PADC_6

一念至此,我立马打开了之前产品的原理图,果然,那个产品里“恰好”没有用到这几个ADC通道。

真是奇了怪了,当时的产品上恰恰没有用到这几个ADC通道上的ADC功能,这里的PEPS测试工装原本也可以不用这几个ADC通道的(ADC有40个通道)。

真是巧了,但是,人生的际遇不就是一个又一个巧合吗?

既然如此,对美帝芯片手册的心理障碍就可以放下了。我用多次采集确认了这几个通道,最终发现,它们采集到的值正好是“预计值”的75%左右。

好吧,事已至此,姑且只能认为,对同一颗MCU,不同ADC通道的参考电压不一样吧。

本着这种思路,我修改了程序里对这几路ADC通道采集值的判定。

#if 0

#define RELAY_ON_THREHOLD_8V     400

#define RELAY_ON_THREHOLD_12V   600

#define RELAY_ON_THREHOLD_16V   800

#endif

#define RELAY_ON_THREHOLD_8V     300

#define RELAY_ON_THREHOLD_12V   450

#define RELAY_ON_THREHOLD_16V   600

改完之后,在各种电压水平下,测试通过,一切又回到了正轨。我也果断地把这种“灵异”事件抛到了脑后。

既然想不通,那就不想了吧。

5

鲁迅先生说,“我向来是不惮以最坏的恶意,来推测人心的。”

鲁迅先生是世间少有的“钢铁直男”,洒家自然学不来。事实上,出了问题,我都会自觉不自觉地把错误向自己身上揽。推功揽过,这也颇合修行之义。

至于飞思卡尔MPC5604B的中居然有几路通道的采集不以VCC-5V为供电电压,洒家也总觉得是我司买物料时出了什么问题,不愿意把这锅甩到芯片公司头上。

不过,吃一堑,总会长一智。经此教训,我也算是有了一定的收获,至少现在,我认为:尽信书不如无书,芯片手册有时也会让你哭!



关键词: 芯片手册 ADC模块

评论


技术专区

关闭