盡信書不如無書,芯片手冊(cè)也會(huì)讓你哭
四十年波瀾壯闊的改革開放,無數(shù)中華兒女披星戴月,艱苦奮斗,不忘初心,砥礪前行,終于,中國這條古老的東方巨龍?jiān)俣柔绕穑柡鴼v史文明的古韻和現(xiàn)代科技的自信,熠熠地閃耀在世界舞臺(tái)的中央。
本文引用地址:http://butianyuan.cn/article/201906/401364.htm眼睜睜地看著民窮國弱的中華民族帶著不可阻擋的豪情和碾壓一切的豪邁沖出亞洲,走向世界,美國佬終于按捺不住了。
山姆大叔揮舞著大棒,伸著長長的臂膀,把屠刀伸到華為、海康威視、大疆這些中國頂尖的科技公司頭上。
盡管任正非先生氣度非凡,在這種至暗時(shí)刻依然力挺美國公司,呼吁廣大國人把“有良心的”美國公司和無良的美國政客分開看待,但是,當(dāng)我被來自美帝的芯片手冊(cè)耽誤了好長一段時(shí)間時(shí),我依然克制不住壓在嗓子眼中的那三個(gè)字:耍我呢!
1
這顆芯片上面的ADC模塊,我熟悉地不能再熟悉了,可是現(xiàn)在,它竟然像薛定諤先生的貓那樣——測(cè)不準(zhǔn)了!
我怔怔地盯著測(cè)試工裝電路板上這顆芯片——飛思卡爾的MPC5604B,這顆在過去的兩年中我無數(shù)次在它編碼、調(diào)試,與之建立了深厚的革命友誼的芯片,在我眼前輕輕拉起了朦朧的面紗。
一切都來得猝不及防,恍惚間,時(shí)間倒轉(zhuǎn),我仿佛回到了兩年前。
當(dāng)時(shí),用過一年微芯的芯片后,新產(chǎn)品上終于又用回了飛思卡爾的MCU。
當(dāng)飛思卡爾的斜三角標(biāo)識(shí)和‘MPC’的字眼剛剛映入眼簾時(shí),一種自然而然的親近感淺淺地在我心底漾起。
你好,飛思卡爾!再見,微芯!
每家公司的產(chǎn)品都有自己特殊的基因,芯片手冊(cè)、技術(shù)資料、例程源碼也各有一套體系,帶有濃濃的個(gè)體色彩。
所以,盡管之前用過的飛思卡爾MCU都是16位,這個(gè)MPC是32位,但是讀起來芯片手冊(cè),看起來技術(shù)資料,還是有一種久違的熟悉感。
就這樣,我和MPC的磨合開始了。
在芯片手冊(cè)和例程的幫助下,我慢慢地熟悉了這顆芯片的CLK、SWT、STM、IO、PIT、ADC、FlexCAN、LINFlex、eMIOS、Data Flash等模塊,按部就班地在它上面編程、調(diào)試,耐心地找bug,不厭其煩地清理、重構(gòu)代碼,優(yōu)化產(chǎn)品性能。
一兩年下來,產(chǎn)品開發(fā)結(jié)束,順利量產(chǎn)供貨。
我看著MPC5604B這顆芯片,一種感激之情油然而生。
這芯片性能不錯(cuò),價(jià)格不貴,開發(fā)趁手,實(shí)在應(yīng)該給它“打電話”!
本著這種好感,在做另一款產(chǎn)品的測(cè)試工裝時(shí),我很自然地就向硬件工程師推薦了這顆芯片。
2
一張一弛,文武之道,亦是工程師之道。
前期緊張而忙碌的PEPS產(chǎn)品開發(fā)工作結(jié)束了,隨后開啟的測(cè)試工裝開發(fā),正是松弛下來休養(yǎng)生息的好時(shí)候。
測(cè)試工裝用于對(duì)產(chǎn)品的功能進(jìn)行測(cè)試,主要是驗(yàn)證生產(chǎn)下線后的產(chǎn)品的有效性。既不用考慮性能,也不用考慮效率,所以開發(fā)難度不高。
再加上我們特意選用了之前產(chǎn)品上用過的MCU,正好可以移花接木。
把上面的代碼照搬過來,根據(jù)測(cè)試工裝的功能需求稍加修改,調(diào)試運(yùn)行一番,能實(shí)現(xiàn)對(duì)產(chǎn)品的測(cè)試功能,就到此結(jié)束了。
抱著這種拿來主義的放松心態(tài),我一邊玩一邊寫測(cè)試工裝的代碼,直到有一天......
那一天,正進(jìn)行到對(duì)PEPS的ACC/IGN1/IGN2繼電器輸出電路的測(cè)試上。拿ACC為例,測(cè)試邏輯如下:
?通過ISO14229診斷協(xié)議中的IO輸入輸出控制服務(wù),令PEPS輸出有效的ACC;
?在測(cè)試工裝上用ADC檢測(cè)ACC繼電器輸出的電壓水平。
這里有兩個(gè)問題需要跟大家說明。
第一,之所以通過診斷協(xié)議的IO控制這種貌似復(fù)雜的方式令待測(cè)產(chǎn)品在指定的IO端口上輸出,而不是根據(jù)待測(cè)產(chǎn)品的某項(xiàng)功能讓該IO端口在執(zhí)行這項(xiàng)功能時(shí)輸出,是因?yàn)檫@種方式可以“消解”掉待測(cè)產(chǎn)品的功能。
換句話說,“功能”輸出的方式取決于待測(cè)產(chǎn)品,當(dāng)測(cè)試另一種功能的待測(cè)產(chǎn)品時(shí),需要修改測(cè)試邏輯中令I(lǐng)O輸出有效的實(shí)現(xiàn)方式。
“診斷”輸出則不然,即使更換了待測(cè)產(chǎn)品的功能,也可以通過同樣的“診斷-IO控制”方式令I(lǐng)O輸出。
第二,之所以使用ADC檢測(cè)模擬電壓,而不是以“IO”的方式檢測(cè)數(shù)字電壓,是因?yàn)檫@里的ACC輸出電壓和被測(cè)產(chǎn)品PEPS的輸入電壓相關(guān)。
PEPS供電輸入電壓范圍介于8-16v之間,相應(yīng)地ACC輸出電壓介于7.7-15.7v之間(兩者相差了一個(gè)二極管的壓降)。ADC模擬電壓方式顯然可以更好地應(yīng)對(duì)被測(cè)產(chǎn)品輸入電壓變化時(shí)指定IO口電壓隨之變化的情況。
聰明的讀者可能想到了,假設(shè)被測(cè)產(chǎn)品的供電輸入電壓為16v時(shí),假設(shè)經(jīng)過分壓后,接入MCU的ACC端口上電平為4V,當(dāng)輸入電壓為8v時(shí),MCU ACC端口上的電平便下降到了2v。
一個(gè)5V的MCU,數(shù)字IO上輸入4V可以讀取為‘1’,當(dāng)數(shù)字IO上輸入2v時(shí),你說,MCU會(huì)讀取出‘0’來還是‘1’來?
3
那一天,風(fēng)平浪靜,萬里無云,我按部就班地碼字,敲代碼,不疾不徐。
在時(shí)間的長河中,未來早已存在,而過去永不消逝。所以,著急什么呢?
帶著時(shí)間虛無主義,我漫不經(jīng)心地看了看采集上來的ACC端口電壓,一種不安的直覺從心底漫起。
征戰(zhàn)多年,灑家的直覺一直很準(zhǔn)的。
我的目光久久地停在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進(jìn)入到ADC的端口電壓大概在3v左右,在5V MCU的10位ADC下,對(duì)應(yīng)的ADC值應(yīng)該是:
這里的1023是端口電壓為5V時(shí)滿量程數(shù)值。
結(jié)果,我得到的數(shù)字僅為460!
當(dāng)時(shí),對(duì)于美帝芯片的一絲不恭敬之心,我都是不敢生起的。于是,我自然而然地懷疑到測(cè)試工裝的采集電路和自己的程序問題。
順著這種思路,我反復(fù)試驗(yàn)了好幾種供電電壓,用示波器測(cè)量了ACC進(jìn)入測(cè)試工裝入口處的電壓,以及ACC進(jìn)入MCU ADC端口處的電壓。
結(jié)果,我更加疑惑了——ADC測(cè)不準(zhǔn)了!
日出扶桑一丈高,人間萬事細(xì)如毛。面對(duì)著半路殺出的程咬金,想著剩下的并不寬裕的時(shí)間,我突然發(fā)現(xiàn),
未來已來,而過去揮霍掉的時(shí)間,永不再來。
4
看著這個(gè)無比熟悉的MCU,看著這個(gè)剛剛在測(cè)試工裝其它功能上用過的ADC,我依然不敢相信自己的眼睛。
于是,我再一次對(duì)IGN1和IGN2這兩個(gè)端口展開了測(cè)試,出乎我意料的是,結(jié)果竟然是一樣的。
看得到,或者看不到,bug都在那里,不來也不去。
調(diào)皮的風(fēng)兒在房間里跑過來又跑過去,懷疑和篤定的思緒在我腦袋里轉(zhuǎn)過來又轉(zhuǎn)過去,悠悠蕩蕩,跌跌撞撞。
看來,這幾個(gè)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
一念至此,我立馬打開了之前產(chǎn)品的原理圖,果然,那個(gè)產(chǎn)品里“恰好”沒有用到這幾個(gè)ADC通道。
真是奇了怪了,當(dāng)時(shí)的產(chǎn)品上恰恰沒有用到這幾個(gè)ADC通道上的ADC功能,這里的PEPS測(cè)試工裝原本也可以不用這幾個(gè)ADC通道的(ADC有40個(gè)通道)。
真是巧了,但是,人生的際遇不就是一個(gè)又一個(gè)巧合嗎?
既然如此,對(duì)美帝芯片手冊(cè)的心理障礙就可以放下了。我用多次采集確認(rèn)了這幾個(gè)通道,最終發(fā)現(xiàn),它們采集到的值正好是“預(yù)計(jì)值”的75%左右。
好吧,事已至此,姑且只能認(rèn)為,對(duì)同一顆MCU,不同ADC通道的參考電壓不一樣吧。
本著這種思路,我修改了程序里對(duì)這幾路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
改完之后,在各種電壓水平下,測(cè)試通過,一切又回到了正軌。我也果斷地把這種“靈異”事件拋到了腦后。
既然想不通,那就不想了吧。
5
魯迅先生說,“我向來是不憚以最壞的惡意,來推測(cè)人心的。”
魯迅先生是世間少有的“鋼鐵直男”,灑家自然學(xué)不來。事實(shí)上,出了問題,我都會(huì)自覺不自覺地把錯(cuò)誤向自己身上攬。推功攬過,這也頗合修行之義。
至于飛思卡爾MPC5604B的ADC模塊中居然有幾路通道的采集不以VCC-5V為供電電壓,灑家也總覺得是我司買物料時(shí)出了什么問題,不愿意把這鍋甩到芯片公司頭上。
不過,吃一塹,總會(huì)長一智。經(jīng)此教訓(xùn),我也算是有了一定的收獲,至少現(xiàn)在,我認(rèn)為:盡信書不如無書,芯片手冊(cè)有時(shí)也會(huì)讓你哭!
評(píng)論