四十年汹涌澎湃的改革开放,很多中华儿女夜以继日,艰苦奋斗,不忘初心,砥砺前行,总算,我国这条陈旧的东方巨龙再度兴起,它饱含着前史文明的古韵和现代科技的自傲,熠熠地闪烁在世界舞台的中心。
眼睁睁地看着民穷国弱的中华民族带着不行阻挠的豪情和碾压全部的豪放冲出亚洲,走向世界,美国佬总算按捺不住了。
山姆大叔挥舞着大棒,伸着长长的胳膊,把屠刀伸到华为、海康威视、大疆这些我国顶尖的科技公司头上。
虽然任正非先生气量特别,在这种至暗时刻仍然力挺美国公司,呼吁广阔国人把“有良知的”美国公司和无良的美国政客分隔看待,可是,当我被来自美帝的芯片手册耽误了好长一段时刻时,我仍然克制不住压在喉咙眼中的那三个字:耍我呢!
1
这颗芯片上面的ADC模块,我了解地不能再了解了,可是现在,它居然像薛定谔先生的猫那样——测禁绝了!
我怔怔地盯着测验工装电路板上这颗芯片——飞思卡尔的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值应该是:
这儿的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的ADC模块中居然有几路通道的收集不以VCC-5V为供电电压,洒家也总觉得是我司买物料时出了什么问题,不愿意把这锅甩到芯片公司头上。
不过,吃一堑,总会长一智。经此经验,我也算是有了必定的收成,至少现在,我以为:尽信书不如无书,芯片手册有时也会让你哭!