嵌入式系統(tǒng)的SD控制器設(shè)計實現(xiàn)
系統(tǒng)初始化時,SD_nCD檢測引腳被設(shè)置為上升沿和下降沿觸發(fā),因此引腳電平發(fā)生變化時,都會有中斷產(chǎn)生。當(dāng)硬件產(chǎn)生中斷時,系統(tǒng)進(jìn)入核心ISR,對SD_nCD進(jìn)行檢測,返回相應(yīng)的中斷標(biāo)識碼,對于是SD插入還是拔出,則由驅(qū)動程序的IST來處理。
由于SD卡插槽采用的是機(jī)械式開關(guān),在插拔卡的時候,機(jī)械開關(guān)斷開、閉合時會有抖動,導(dǎo)致SD卡檢測引腳的電平不穩(wěn)定,從而有可能引起對卡的狀態(tài)的誤判。這樣會導(dǎo)致加載上層驅(qū)動,初始化失敗造成系統(tǒng)宕機(jī)。為了使每次插拔只響應(yīng)一次,必須要采用相應(yīng)的方法來防止抖動,避開按鍵按下的抖動時間。
在驅(qū)動程序IST里采用延時采樣的方法來避免抖動,同時也嘗試了多次采樣的檢測方法來避開用戶按鍵的抖動時間。
延時采樣是IST在收到SD卡檢測事件以后,并不是立刻進(jìn)行引腳信號判斷,而是延時一段時間采樣,延遲時間要根據(jù)系統(tǒng)電路特性而定,然后檢測引腳信號,判斷插槽的狀態(tài)是卡插入還是拔出。多次采樣方法是IST在收到SD卡檢測事件以后,要對引腳進(jìn)行多次等間隔采樣,根據(jù)采樣出的多數(shù)電平信號的值來決定插槽卡的狀態(tài)。多次采樣的方法可以有更短的響應(yīng)時間,當(dāng)采樣出的電平信號多數(shù)值不能決定卡的狀態(tài)時,需要進(jìn)行重新采樣判斷。
對于延時采樣的防抖動方法,必須考慮到實現(xiàn)的效率。
ISR運行于系統(tǒng)核心態(tài),它的延時會影響整個系統(tǒng),導(dǎo)致用戶的輸入響應(yīng)時間過長,造成整體性能的下降。而WindowsCE的驅(qū)動程序是用戶態(tài)的DLL,作為用戶進(jìn)程來調(diào)度,因此在SDHost的驅(qū)動程序里實現(xiàn)防抖動,可保證系統(tǒng)整體性能不下降。
對于上述兩種防抖動方法,我們進(jìn)行了連續(xù)插拔的測試,結(jié)果如圖3所示。測試結(jié)果表明,這兩種方法都取得了較好的效果,基本上解決了SD卡檢測的抖動問題。
圖3 SD卡插拔宕機(jī)次數(shù)測試
4 結(jié)語
本文介紹的SDHost控制器已經(jīng)應(yīng)用在工程實踐中,結(jié)果表明設(shè)計是靈活有效的,防抖動設(shè)計對于類似的設(shè)計也具有一定的借鑒意義。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論