軟件工程師換一顆芯片后,會(huì)發(fā)生什么?寄生電容來添亂
前言
由于不可抗拒因素,原定性產(chǎn)品替換一顆器件,該器件的目的是防止外界EMI干擾, 位置處于處理器和SD卡之間,器件是為每個(gè)SD卡信號(hào)線連接100Ω電阻。更換后,SD卡探測(cè)正常,從SD卡讀寫幾十KB文件功能正常,?從SD卡數(shù)據(jù)500KB以上的文件永遠(yuǎn)無法讀完,系統(tǒng)其他功能依舊正常,再次插拔SD卡不可識(shí)別,只能關(guān)機(jī)重啟。
問題原因:新舊器件的寄生電容有差異,SD卡時(shí)鐘信號(hào)畸形,處理器SD控制器下面看看整個(gè)曲折排查過程
方向錯(cuò)誤
前天,報(bào)告故障時(shí)同事沒有把事情給我描述清除,僅說“更換EMI器件后,從SD卡里執(zhí)行系統(tǒng)更新時(shí)被卡住了,進(jìn)度條走不完”。我到產(chǎn)線的確每次都能復(fù)現(xiàn)改描述問題。慶幸,容易復(fù)現(xiàn)以前都好辦,可我的排查方向錯(cuò)了,被問題描述誤導(dǎo)而去檢查設(shè)備驅(qū)動(dòng)是否存在問題,比如mmc驅(qū)動(dòng)里某個(gè)核心死鎖、等待信號(hào)量、while循環(huán)、狀態(tài)機(jī)混亂。納悶著產(chǎn)品都量產(chǎn)好幾年了,從SD卡執(zhí)行系統(tǒng)更新功能我還特別關(guān)注過可靠性。生怕好好一臺(tái)設(shè)備升級(jí)變磚。于是一下午在新、老器件上嘗試對(duì)比差異。生產(chǎn)部門的示波器很難用,只用它初略對(duì)比信號(hào)高、低電平范圍,沒能捕獲到實(shí)際頻率響應(yīng)特性,粗略觀測(cè)到兩設(shè)備插入SD卡后某幾個(gè)信號(hào)線邏輯電平不一致,一個(gè)高電平、一個(gè)低電平,至于原因未知。快下班時(shí)同事告知:“設(shè)備可以正常保存數(shù)據(jù)文件到SD卡?!?。What?有這么神奇?設(shè)備業(yè)務(wù)數(shù)據(jù)每個(gè)文件只有200KB以內(nèi),我嘗試著用dd命令在SD卡根目錄創(chuàng)建若干不同大小文件,再telnet到設(shè)備上逐個(gè) hexdump它們,發(fā)現(xiàn)500KB文件大小是個(gè)分水嶺。閱讀手冊(cè)
次日,對(duì)比新老器件的手冊(cè)說明,兩器件的差異僅僅在于寄生電容上,老器件寄生電容8.5pF,新器件36pF。其實(shí)這個(gè)時(shí)候動(dòng)手算算時(shí)間響應(yīng)系數(shù)、SD卡工作頻率、在芯片手冊(cè)時(shí)序特性就能確認(rèn)故障點(diǎn)在這了,本產(chǎn)品的SDIO時(shí)鐘頻率48MHz。SDIO這部分我不是太熟悉,嘗試在群里請(qǐng)求幫助。抱幾臺(tái)設(shè)備去實(shí)驗(yàn)室做對(duì)比實(shí)驗(yàn),用著熟悉的示波器,操作起來游刃有余。老器件的波形勉強(qiáng)還行,至少算是個(gè)正弦波,新器件的波形已經(jīng)被寄生電容展寬成?斜三角波。初步懷疑布線質(zhì)量差勁,波形抖動(dòng),訪問大文件時(shí)時(shí)鐘抖動(dòng)累加影響處理器時(shí)序,狀態(tài)機(jī)混亂。訪問小文件時(shí)任務(wù)小巧。數(shù)個(gè)時(shí)鐘偏差不足以引起單次讀寫任務(wù)執(zhí)行。眼圖
是德科技的這款示波器默認(rèn)沒開放眼圖功能,要使用眼圖也行,1萬RMB購(gòu)買軟件擴(kuò)展功能lisence。我只能退而求其次使用它的?Mask(模板)功能?。這個(gè)功能原理和眼圖類似,下文我還是用眼圖來稱呼它。Mask功能缺少眼圖下移動(dòng)標(biāo)桿測(cè)量的能力, 不能測(cè)量“眼鏡”開口大小,無法得知3dB位置,一拖動(dòng)動(dòng)屏幕任何參數(shù),Mask數(shù)據(jù)都會(huì)丟失。怎么讓處理器保持讀取數(shù)據(jù)內(nèi)容呢?讓處理器反復(fù)地在SD卡上拷貝1MB文件就行了,記得末尾清除文件系統(tǒng)緩存,防止linux在內(nèi)存里緩存SD卡文件。while [ 1 ]
do
cp /mnt/sd/1MB.img /mnt/sd/unuse.img
echo 3 > /proc/sys/vm/drop_caches # 清除緩存
done
每個(gè)眼圖都保持1min測(cè)試時(shí)長(zhǎng)。老器件的波形實(shí)際上也是存在抖動(dòng)的,好在抖動(dòng)不劇烈,抖動(dòng)位置規(guī)則的分布在5個(gè)密集區(qū)域。新器件的眼圖我需要說明一下,文章開頭描述“只要訪問SD卡500KB以上的數(shù)據(jù)無響應(yīng),不再有時(shí)鐘”。于是我對(duì)測(cè)試shell做了小修改,每次僅處理10KB的文件,接著讓總線休息一下,避免shell執(zhí)行太快SD控制器的來不及停止就繼續(xù)執(zhí)行。有了這個(gè)延時(shí),所以新器件1min眼圖效果和老器件是不能直接對(duì)比的,初略看他的抖動(dòng)會(huì)比老器件的強(qiáng)。
- 老器件48MHz持續(xù)運(yùn)行1min,約產(chǎn)生2880M個(gè)時(shí)鐘。
- 新器件48MHz執(zhí)行10KB,停歇1秒循環(huán)1min,約產(chǎn)生600K個(gè)時(shí)鐘
- 所以1min里老器件工作量是新器件的4800倍=2880*10^6/600,約是老器件12.5ms=60s * 1000 / 4800的眼圖效果
while [ 1 ]
do
cp /mnt/sd/10KB.img /mnt/sd/unuse.img
sleep 1 # 等待,否則同樣會(huì)無響應(yīng)
echo 3 > /proc/sys/vm/drop_caches # 清除緩存
done
降頻
人生苦短,姑且假設(shè)問題就是處在頻率太高、寄生電容太大。嘗試粗略修改處理器SDIO時(shí)鐘頻率,如果降低頻率后能正常工作就可以定位故障點(diǎn)了。大筆一揮,直接降低SDIO時(shí)鐘為設(shè)置的一半,SDIO有這點(diǎn)好處,只要在SD卡的工作范圍內(nèi),則可以在0-maxMHz范圍內(nèi)任意頻率工作。再次測(cè)試讀寫1MB文件,嘔吼,兩設(shè)備都正常執(zhí)行。再次測(cè)量眼圖,這回新器件的shell腳本可以和老器件的相同,不需要延時(shí)。可看出他們眼圖1min效果是相同的。
END
來源:寫個(gè)解,作者:吳解君版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。
▍