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