這樣理解單片機(jī)通信時(shí)序分析就對(duì)了!
所謂“時(shí)序”從字面意義上來(lái)理解,一是“時(shí)間問(wèn)題”;二是“順序問(wèn)題”。
先說(shuō)一下“順序問(wèn)題”,這個(gè)相對(duì)簡(jiǎn)單一些。我們?cè)趯W(xué)UART串口通信的時(shí)候,先1位起始位,再8位數(shù)據(jù)位,最后1位停止位,這個(gè)先后順序不能錯(cuò)。我們?cè)趯W(xué)1602液晶的時(shí)候,比如寫指令,RS=L,R/W=L,D0~D7=指令碼,這三者的順序是無(wú)所謂的,但是最終的E=高脈沖,必須是在這三條程序之后,這個(gè)順序一旦錯(cuò)誤,寫的數(shù)據(jù)也可會(huì)出錯(cuò)。
而“時(shí)間問(wèn)題”內(nèi)容相對(duì)復(fù)雜,比如UART通信,每一位的時(shí)間寬度是1/baud。我們初中就學(xué)過(guò)一個(gè)概念,世界上沒(méi)有絕對(duì)的準(zhǔn)確。那么每一位的時(shí)間寬度1/baud要求精確到什么范圍內(nèi)呢?
單片機(jī)讀取UART的RXD引腳數(shù)據(jù)的時(shí)候,一位數(shù)據(jù),單片機(jī)平均分成了16份,取其中的7、8、9三次讀到的結(jié)果,這三次中有2次是高電平那這一位就是1,有2次是低電平,那這一次就是0。如果我們的波特率稍微有些偏差,只要累計(jì)下來(lái)到最后一位停止位,這7、8、9還在范圍內(nèi)即可。如下圖所示:
UART信號(hào)采集時(shí)序圖
我們用三個(gè)箭頭來(lái)表示7、8、9這三次的采集位置,大家可以看到,當(dāng)采集到 D7的時(shí)候,已經(jīng)有一次采集偏出去了,但我們采集到的數(shù)據(jù)還是不會(huì)錯(cuò),因?yàn)橛?次采集正確。至于這個(gè)偏差允許多大,大家自己可以詳細(xì)算一下。實(shí)際上UART通信的波特率是允許一定范圍內(nèi)誤差存在的,但不能過(guò)大,否則就會(huì)采集錯(cuò)誤。
大家在計(jì)算波特率的時(shí)候,發(fā)現(xiàn)沒(méi)有整除,有小數(shù)部分的時(shí)候,就要特別小心了,因?yàn)樾?shù)部分是一概被舍掉的,于是計(jì)算誤差就產(chǎn)生了。我們用11.0592M晶振計(jì)算的過(guò)程中,11059200/12/32/9600得到的是一個(gè)整數(shù),如果用12M晶振計(jì)算12000000/12/32/9600就會(huì)得到一個(gè)小數(shù),大家可以算一下誤差多少,是否在誤差范圍內(nèi)。
1602的時(shí)序問(wèn)題,大家要學(xué)會(huì)通過(guò)LCD1602的數(shù)據(jù)手冊(cè)提供的時(shí)序圖和時(shí)序參數(shù)表格來(lái)進(jìn)行研究,而且看懂時(shí)序圖是學(xué)習(xí)單片機(jī)所必須掌握的一項(xiàng)技能,如下圖所示:
1602時(shí)序圖
大家看到這種圖的時(shí)候不要感覺害怕,說(shuō)句不過(guò)分的話,單片機(jī)這些邏輯上的問(wèn)題,只要小學(xué)畢業(yè)就可以理解的,很多時(shí)候是因?yàn)榇蠹野褑?wèn)題想象的太難才學(xué)不下去的。
我們先來(lái)看一下讀操作時(shí)序的RS引腳和R/W引腳,這兩個(gè)引腳先進(jìn)行變化,因?yàn)槭亲x操作,所以R/W引腳首先要置為高電平,而不管它原來(lái)是什么。讀指令還是讀數(shù)據(jù),都是讀操作,而且都有可能,所以RS引腳既有可能是置為高電平,也有可能是置為低電平,大家注意上圖的畫法。而RS和R/W變化了經(jīng)過(guò)Tsp1這么長(zhǎng)時(shí)間后,使能引腳E才能從低電平到高電平發(fā)生變化。
而使能引腳E拉高經(jīng)過(guò)了tD這么長(zhǎng)時(shí)間后,LCD1602輸出DB的數(shù)據(jù)就是有效數(shù)據(jù)了,我們就可以來(lái)讀取DB的數(shù)據(jù)了。讀完了之后,我們要先把使能E拉低,經(jīng)過(guò)一段時(shí)間后RS、R/W和DB才可以變化繼續(xù)為下一次讀寫做準(zhǔn)備了。
而寫操作時(shí)序和讀操作時(shí)序的差別,就是寫操作時(shí)序中,DB的改變是由單片機(jī)來(lái)完成的,因此要放到使能引腳E的變化之前進(jìn)行操作,其它區(qū)別大家可以自行對(duì)比一下。
細(xì)心的話就會(huì)發(fā)現(xiàn),這個(gè)時(shí)序圖上還有很多時(shí)間標(biāo)簽。比如E的上升時(shí)間tR,下降時(shí)間時(shí)間tF,使能引腳E從一個(gè)上升沿到下一個(gè)上升沿之間的長(zhǎng)度周期tC,使能E下降沿后,R/W和RS變化時(shí)間間隔tHD1等等很多時(shí)間要求,這些要求怎么看呢?放心,只要是正規(guī)的數(shù)據(jù)手冊(cè),都會(huì)把這些時(shí)間要求給大家標(biāo)記出來(lái)的。
大家要善于把手冊(cè)中的這個(gè)表格和時(shí)序圖結(jié)合起來(lái)看,上面表中的數(shù)據(jù)都是時(shí)序參數(shù),大家務(wù)必要學(xué)會(huì)自己看時(shí)序圖,這個(gè)很重要。此外,看以下解釋也需要結(jié)合時(shí)序圖來(lái)看。
tC: 指的是使能引腳E從本次上升沿到下次上升沿的最短時(shí)間是400ns,而我們單片機(jī)因?yàn)樗俣容^慢,一個(gè)機(jī)器周期就是1us多,而一條C語(yǔ)言指令肯定是一個(gè)或者幾個(gè)機(jī)器周期的,所以這個(gè)條件完全滿足。
tPW: 指的是使能引腳E高電平的持續(xù)時(shí)間最短是150ns,同樣由于我們的單片機(jī)比較慢,這個(gè)條件也完全滿足。
tR,tF: 指的是使能引腳E的上升沿時(shí)間和下降沿時(shí)間,不能超過(guò)25ns,別看這個(gè)數(shù)很小,其實(shí)這個(gè)時(shí)間限值是很寬裕的,我們實(shí)際用示波器測(cè)了一下開發(fā)板的這個(gè)引腳上升沿和下降沿時(shí)間大概是10ns到15ns之間,完全滿足。
tSP1: 指的是RS和R/W引腳使能后至少保持30ns,使能引腳E才可以變成高電平,這個(gè)條件同樣也完全滿足。
tHD1: 指的是使能引腳E變成低電平后,至少保持10ns之后,RS和R/W才能進(jìn)行變化,這個(gè)條件也完全滿足。
tD: 指的是使能引腳E變成高電平后,最多100ns后,1602就把數(shù)據(jù)送出來(lái)了,那么我們就可以正常去讀取狀態(tài)或者數(shù)據(jù)了。
tHD2: 指的是讀操作過(guò)程中,使能引腳E變成低電平后,至少保持20ns,DB數(shù)據(jù)總線才可以進(jìn)行變化,這個(gè)條件也完全滿足。
tSP2: 指的是DB數(shù)據(jù)總線準(zhǔn)備好后,至少保持40ns,使能引腳E才可以從低到高進(jìn)行使能變化,這個(gè)條件也完全滿足。
tHD2: 指的是寫操作過(guò)程中,要引腳E變成低電平后,至少保持10ns,DB數(shù)據(jù)總線才可以變化,這個(gè)條件也完全滿足。
好了,LCD1602的時(shí)序參數(shù)表已經(jīng)解析完成了,看完之后,是不是感覺比你想象的要簡(jiǎn)單,沒(méi)有你想的那么困難。大家自己也得慢慢學(xué)會(huì)看這種時(shí)序圖和表格,在今后的學(xué)習(xí)中,這方面的能力尤為重要。如果以后換用了其它型號(hào)的單片機(jī),那么就根據(jù)單片機(jī)的執(zhí)行速度來(lái)評(píng)估你的程序是否滿足時(shí)序要求。整體來(lái)說(shuō),器件都是有一個(gè)最快速度的限制,而沒(méi)有最慢限制,所以當(dāng)換用高速的單片機(jī)后,通常都是靠在各步驟間插入軟件延時(shí)來(lái)滿足較慢的時(shí)序要求。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!