IO短路帶來的思考
按照常理來說,對(duì)于IO腳來說VH遇到VL,那么一般人一定會(huì)想當(dāng)然的以為結(jié)果是VL。事實(shí)是這樣的嗎?特權(quán)同學(xué)就遇上了這么個(gè)很讓人郁悶的問題。
本文引用地址:http://m.butianyuan.cn/article/270306.htm當(dāng)時(shí)在調(diào)一個(gè)液晶控制板,板子是新做的,自己動(dòng)手焊接(水平有限,給后來的故事埋下了伏筆)。一切OK,就把早就寫好仿真過的代碼燒進(jìn)去,然后接口部分是一個(gè)51的單片機(jī),同樣燒進(jìn)備好的代碼。本來就是先做一個(gè)很簡單的指令測(cè)試,控制板部分是一個(gè)CPLD,一方面做MCU接口,接收指令(各種傳送數(shù)據(jù)方式)和數(shù)據(jù)(緩存到RAM中);另一方面事實(shí)掃描LCD顯示驅(qū)動(dòng)。奇怪的是測(cè)試一條寫數(shù)據(jù)指令,讓LCD現(xiàn)實(shí)上半屏幕全紅色下半屏幕全白色。指令控制方面MCU先是使用了內(nèi)部的一個(gè)清屏指令,將LCD全清白色,然后使用一條寫入一個(gè)數(shù)據(jù)后X坐標(biāo)自增,如下做了一個(gè)簡單的遍歷處理。
for(m=0;m<136;m++) //上半屏幕顯示紅色
{
WR_XLADDR = 0;
WR_XHADDR = 0;
WR_YLADDR = m%256;
WR_YHADDR = 0;
for(n=0;n<480;n++)
WR_DATA = 0xe0; //單點(diǎn)紅色}
}
而結(jié)果比較怪異,背景白色都沒有問題,而上半屏幕的全紅色卻是第1行紅色,第2、3行白色、第4、5行紅色,第6、7行白色……如此下去。再測(cè)了一下Y自增方式,問題也類似,本來是要寫左半屏幕綠色,右半屏幕黑色(也是先清屏黑色,再寫綠色),出現(xiàn)了第1列紅色,第2、3列白色、第4、5列紅色,第6、7列白色……。他們都有共性,所以一直很納悶,開始的時(shí)候總以為是出在CPLD代碼部分,因?yàn)檫@次的緩沖SDRAM的控制是新設(shè)計(jì),可能是這個(gè)控制時(shí)序的問題,再回頭仿真測(cè)試結(jié)果沒有改觀。最后靜下心來好好分析了下,而且特別在每次寫入紅色數(shù)據(jù)時(shí)加了很大的延時(shí)進(jìn)行觀察,發(fā)現(xiàn)第1行顯示完紅色立即跳到第4行顯示紅色,然后停了大約2行的時(shí)間再進(jìn)行第3行的顯示,緊接著是第6行的顯示。于是就想到是不是最低兩個(gè)地址線出現(xiàn)短路或者其中一個(gè)短路到GND或者VCC。而出現(xiàn)的地址是先2’b00,緊接著2’b11,先得很乖,如果是其中一個(gè)接GND了,那么地址出現(xiàn)順序應(yīng)該是00,00,10,10或者00,01,00,01;如果是一個(gè)接VCC了,那么地址順序應(yīng)該是01,01,11,11或者10,11,10,11。所以排除了地址腳和VCC或者GND短路的可能。還有就是,即便是地址短路了,如果出現(xiàn)在SDRAM的地址腳上,那么讀寫都一樣,即所謂的負(fù)負(fù)得正,也不會(huì)出現(xiàn)這樣的現(xiàn)象。
那么到底是出現(xiàn)了什么問題了呢?冒失每次遍歷都會(huì)進(jìn)行一次Y地址的重新寫入(通過MCU與CPLD的接口),而清屏指令只要發(fā)一條指令,CPLD內(nèi)部處理地址的運(yùn)算。所以問題被定位到了MCU與CPLD得接口部分,它們之間接了4245進(jìn)行電平轉(zhuǎn)換,地址的低2位是不是短路了?那么如果是4245輸入端短路了會(huì)怎樣?是4245的輸出端短路了又會(huì)怎樣?
按照常理,IO口的VH和VL短路,在沒有動(dòng)手測(cè)試前,我覺得應(yīng)該是輸出VL。所以這個(gè)認(rèn)識(shí)也會(huì)否決了問題發(fā)現(xiàn)的原因出在這兩個(gè)IO口上,因?yàn)榈刂肪€正常輸入00,01,10,11,那么短路后輸出也應(yīng)該是00,00,00,11,而不會(huì)一下00,11的跳變。但是,事實(shí)證明我錯(cuò)了。萬用表一測(cè),確實(shí)兩個(gè)IO口短路了(4245的輸出端短路),為了驗(yàn)證我的判斷,先燒了一個(gè)把兩個(gè)地址線一個(gè)拉高一個(gè)拉低的代碼,再次上電測(cè)量,電平大約在1.65V,這個(gè)1.65V是要輸入CPLD的(3.3V LVTTL電平)。查看了芯片資料,發(fā)現(xiàn)>1.7V判斷為VIH,而這個(gè)基本屬于邊界值的1.65V都在輸入CPLD時(shí)被判定為VIH了。所以就出現(xiàn)了最后的現(xiàn)象。
感覺問題一點(diǎn)點(diǎn)解開了,于是扯開兩條短路線,重新上電測(cè)試,一切步入正軌??磥韱栴}果然如此,兩個(gè)IO短路的的確確不會(huì)只輸出一個(gè)簡單的VL,這個(gè)4245就給了一個(gè)1.65V,而別的器件若出現(xiàn)這個(gè)情況會(huì)怎樣呢?我不知道,但是有一點(diǎn)現(xiàn)在是可以肯定的,兩個(gè)IO短路的輸出結(jié)果需要根據(jù)這兩個(gè)IO的電路本身進(jìn)行判斷。
任何問題都不可以想當(dāng)然。
評(píng)論