管腳兼容是謊話 總有一點小偏差
備受廣大人民群眾喜愛的四大名著之一《西游記》以法相宗開山祖師玄奘大師西行求法的偉大事跡為藍(lán)本,演義成唐僧師徒四人經(jīng)歷九九八十一難,歷盡艱辛西天取經(jīng)的神話故事,其中真假美猴王一節(jié),六耳獼猴和孫悟空相貌無二無別,本領(lǐng)神通也與孫大圣一般無二,讓人真假難辨,正所謂唐僧緊箍疼不出,天王鏡子照不出,觀音我也看不出,還是我佛如來慧眼識人,道出六耳獼猴真身并用金缽盂罩住被孫悟空一棍子打死了事。
本文引用地址:http://www.ex-cimer.com/article/201810/393461.htm被老謀子炒作為16年來真正想拍的電影“影”則講述了一個關(guān)于替身的故事。替身,人稱“影子”,與真身互為一體,令旁人真假難辨,如同孿生,在危急關(guān)頭挺身而出,替主人博回一命。這種題材貌似很受大家歡迎,雖然不曾看過,但是吳宇森的《變臉》據(jù)說也是這種以假換真的故事。
后來,這種以假亂真、雌雄難辨的手法被上海交通大學(xué)微電子學(xué)院院長陳進(jìn)教授發(fā)揚光大,這位海歸科學(xué)家創(chuàng)造性地以打磨更換標(biāo)簽的方式發(fā)明了“漢芯一號”,“騙”過了多位評審專家,套取了高達(dá)上億元的科研基金,在國人亟待在高科技領(lǐng)域有所突破之際,以一種荒誕離奇的方式制造了轟動一時的重大科研造假事件。
雄兔腳撲朔,雌兔眼迷離;雙兔傍地走,安能辨我是雄雌?
時值當(dāng)下,嵌入式領(lǐng)域的MCU“管腳兼容”不僅可以在軟件開發(fā)上做到代碼復(fù)用和開發(fā)工具的通用,還能夠在硬件設(shè)計上直接拿來主義,更能在生產(chǎn)上實施物料替換,以應(yīng)對芯片斷供或供貨周期長的難題,因為備受廣大嵌入式系統(tǒng)廠商青睞,可是,這些“管腳兼容”的芯片真的沒有任何差別嗎?
1
嵌入式軟件工程師實在是一群相當(dāng)苦逼的群體,這不,都快到半夜十二點了,兩位難兄難友還在那里調(diào)著程序,有一搭沒一搭地交流著,更多的時間都陷入深深的思索中。
黑夜伸開它那巨大的翅膀,籠罩著漸漸入睡的大地。窗外,細(xì)雨唏噓如歌,落葉曼妙如舞。室內(nèi),安靜并非無聲,兩位精疲力竭的碼農(nóng)竊竊私語。
“三昧道人,你說這兩顆芯片到底有什么差別呢?”同事一只手支著肥胖的腦袋,聲音有氣無力,猶如夢囈。
夜色漸濃,睡意猶如驚濤拍岸,一股股向我襲來。我強打精神,看了看他那張結(jié)婚后逐漸發(fā)胖的臉蛋,瞄了瞄他那日益隆起就要藏不住的肚腩,定了定神,字斟句酌地說道,“也許是生產(chǎn)工藝不同吧。根據(jù)芯片介紹,意法半導(dǎo)體的這顆SPC560B40和飛思卡爾的MPC5604B采用的是飛思卡爾的PowerPC內(nèi)核和意法半導(dǎo)體的Flash技術(shù),管腳兼容,設(shè)計一致,軟件通用。他們的唯一區(qū)別應(yīng)該是SPC560B40是意法半導(dǎo)體生產(chǎn)的,MPC5604B是飛思卡爾生產(chǎn)的,兩家的制造工藝不同,所以導(dǎo)致了這個差異?!痹掚m至此,我心里卻犯起了嘀咕,“制造工藝不同,最多有些性能上的差異,也不應(yīng)該在功能上有所差別呀!”
兩個電路板接著各自的測試盒,靜靜地躺在工作臺上,不悲不喜,全然不理會我們的對話。這兩塊板子,一塊上面焊的是SPC560B40,一塊上面焊的是MPC5604B,其它完全一致,燒了同一套程序后發(fā)現(xiàn),采用SPC這顆MCU的電路板能夠通過遙控鑰匙喚醒,采用MPC這顆MCU的電路板卻死活都喚不醒。
2
長夜清寂,微風(fēng)習(xí)習(xí),細(xì)雨漸歇,在月色的沐浴中,窗外的草地上翻滾著銀閃閃、綠油油的波浪。站在窗前,仰望蒼穹,天上的星星一眨一眨,像極了小孩子的眼睛。
我伸了伸懶腰,把礙事又礙眼的同事打發(fā)回去,泡了一杯深茶,驅(qū)趕一下睡意,沉下心來,準(zhǔn)備再捋一捋程序。
遙控喚醒程序說來也很簡單,MCU睡眠40ms,自動臨時喚醒后初始化遙控接收驅(qū)動,如果2ms內(nèi)沒有收到達(dá)到閾值數(shù)量的有效射頻位,就再次進(jìn)入休眠,40ms后再次臨時喚醒。。。如果再這2ms內(nèi)收到了若干有效射頻位,則繼續(xù)接收2ms,倘若仍能接收到若干有效射頻位,則按照遙控報文時長的2倍設(shè)置接收時間,倘若接收到有效的報文,則退出休眠,即所謂被遙控鑰匙喚醒。
方案很簡單,既能保證沒有有效信號時安心睡眠,實現(xiàn)較低的休眠電流,又能夠在有干擾時通過“三級過濾”濾除干擾,還能在存在有效鑰匙時及時喚醒。這段程序一直以來跑得挺好,直到這次,因為物料緊張,沒有足夠的SPC,用了一些MPC來救急,才發(fā)現(xiàn)用了MPC的這些板子喚不醒了。顯然,這兩顆所謂管腳兼容、軟件通用的MCU肯定有一些不為人知的不同!
3
程序員喜歡夜晚,主要是貪戀它的安靜。四周一片沉默,陷入沉睡之中的偌大的辦公室寂靜無聲,此時此刻,無絲竹之亂耳,唯有案牘之勞形。面對Bug,心底越靜,就越是有Bug馬上就要躍出水面的期待。其實,Bug對于我具有符咒般的魔力,它雖然讓人茶飯不思,廢寢忘食,但它不僅不讓人覺得害怕,甚至還有一些欣喜之情混雜其中。也許,正如逆境讓人堅強,苦難讓人成長一樣,Bug就是將程序員百煉成鋼的鐵石,不磨不足以成器!
不消說,MPC喚不醒,問題就出在自動臨時喚醒后的遙控接收上。自動喚醒期間的遙控接收也很簡單,先讓MCU進(jìn)入一個以內(nèi)部時鐘為系統(tǒng)時鐘的模式,然后設(shè)置一個輸入捕捉模塊和計時器,上升沿觸發(fā)中斷,通過計時器統(tǒng)計兩次中斷間的時間間隔,判斷上升沿之間的位寬,進(jìn)一步判斷位寬是否滿足遙控協(xié)議規(guī)格。在2ms內(nèi)判斷是否存在若干滿足規(guī)格的位寬,以確定是否通過第一級濾波,之后還有兩級濾波,保證既可以被有效鑰匙及時喚醒,又不會被外界干擾錯誤喚醒。
為了定位問題究竟出在這三級濾波的哪一級上,我添加了一點測試程序,通過第一級濾波就點亮一個led燈。
雖然led燈提供不了多少信息,但是它就像前進(jìn)之路上的明燈,可以明明白白地告訴我們:系統(tǒng)還活著!
結(jié)果發(fā)現(xiàn),第一級濾波都能沒過去,這說明這個2ms內(nèi)輸入捕捉模塊似乎沒有工作起來。
輸入捕捉模塊以系統(tǒng)時鐘分頻出的1MHz為時鐘源,臨時喚醒模式下,為了保證休眠電流滿足產(chǎn)品規(guī)范要求,選擇了內(nèi)部時鐘(16MHz)為系統(tǒng)時鐘,正常模式下是以外部晶振+PLL做為系統(tǒng)時鐘的,一念至此,我試探性地將臨時喚醒模式下的系統(tǒng)時鐘源改為外部晶振,下載程序之后一看,居然喚醒了,同樣的程序燒錄到SPC的板子上,也可以正常喚醒!
一股欣喜之情直沖腦門,濃濃的喜悅在心底蕩漾不已,我如釋重負(fù)地站起身來,外面的月色更加皎潔了,夜色愈加地深沉,它帶走了一切喧囂,將寧靜和空曠播撒在這塊大地上。
我伸了個懶腰,正準(zhǔn)備走人之際,倒霉催地忽然想看看改過時鐘源之后的休眠電流如何,話不多說,我設(shè)置好休眠條件,摒心靜氣地等著產(chǎn)品進(jìn)入休眠,滴答,滴答,我仿佛聽得到墻上的時鐘走動的聲音,決定命運的時刻越來越近了,我仿佛又聽到了自己心跳的聲音,‘砰’,‘砰,‘砰’,‘梆’,我的一顆心掉到了地上,休眠電流上來1.5mA左右,比產(chǎn)品規(guī)范要求多出來0.5mA左右。
4
今夜注定無眠!誰讓自己高興太早來著!
電流怎么上來的?我敏銳地意識到是外部晶振的起振時間問題,內(nèi)部時鐘就是個RC電路,啟動時間很快,但是外部石英晶體形式的晶振就不同了,我查了查數(shù)據(jù)手冊,手冊中給出的外部晶振最大起振時間6ms,沒有給出典型值,我又翻到同樣是飛思卡爾MCU芯片的S32K1xx上,上面給出的起振時間是2.5ms。
答案已經(jīng)呼之欲出了,起振穩(wěn)定時間2.5ms,再加上第一級濾波的2ms,臨時喚醒時間從之前的2ms多一點一下子提高到了4.5ms以上,電流不上去才怪!
既然休眠電流是睡眠時間和臨時喚醒時間的比例決定,如今臨時喚醒時間翻倍,只需要將睡眠時間翻倍就可以了,看了看遙控報文發(fā)送機制,每次至少發(fā)三條報文,每條100ms,睡眠時間從40ms調(diào)高到80ms,也不會出現(xiàn)漏掉檢測機會的情況,按照這種思路,如此這般改了改,休眠電流終于下來了。
看來MPC的內(nèi)部時鐘和SPC的內(nèi)部時鐘還是多少有點區(qū)別,外部晶振上倒是一致。但是這種區(qū)別是怎么產(chǎn)生的呢?我抱著試試看的心情,改回采用內(nèi)部時鐘的方式,同時將第一級濾波喚醒時間從2ms改成4ms,并修改了有效位數(shù)的判定閾值,結(jié)果發(fā)現(xiàn),使用MPC芯片的板子也能喚醒了!
奇哉怪哉!之前有效位數(shù)是按照2ms設(shè)定的,MPC一個也捕捉不到,現(xiàn)在按照4ms設(shè)定了,MPC全都能捕捉到了,好像這4ms中的頭2ms也能正常接收一樣。以我淺顯的認(rèn)識,唯一的解釋就是MPC的輸入捕捉模塊在“40ms睡眠-2ms喚醒-40ms睡眠-2ms喚醒。。。?!边@種內(nèi)部時鐘快節(jié)奏關(guān)閉和開啟下的power on和power down有點問題,不過它可以接受“80ms睡眠-4ms喚醒-80ms睡眠-4ms喚醒。。。?!边@樣的節(jié)奏。那么,這種“現(xiàn)象”背后的機制是什么呢?
是不是兩家的處理器內(nèi)部設(shè)計也不一樣?時鐘樹、供電網(wǎng)絡(luò)都有差別,內(nèi)部IR壓降、電磁耦合等問題造成即便通過了制造工藝的簽核步驟,也會在芯片生產(chǎn)出來后出現(xiàn)問題?當(dāng)然這種解釋過于淺顯、隨意,這種表現(xiàn)應(yīng)該有著更加深層的背景和原因,但是再往深了分析,就絕非我的能力所能窺見的了。在此仰拜高手作答!
后記
嵌入式產(chǎn)品要求嚴(yán)格,換芯片茲事體大,萬萬不要相信管腳兼容這種廣告式的營銷用語,經(jīng)此教訓(xùn),我深刻地體會到:管腳兼容是謊話,總有一點小偏差。
評論