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