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