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