做嵌入式系統(tǒng)開發(fā),經(jīng)常要接觸硬件,需要對數(shù)字電路和模擬電路要有一定的了解,這樣才能深入的研究下去。那些剛剛接觸嵌入式,總覺得很難,其實做什么事情,都要把最基礎的知識掌握牢固,才能最終走上大神的道路。下面我們簡單地介紹一下嵌入式開發(fā)中的一些硬件相關的概念。
電平(Level)
在數(shù)字電路中,分為高電平和低電平,分別用1和0表示。一個數(shù)字電路的管腳,總是存在一個電平的,要么高要么低,或者說要么1要到0(其實,還有另一種狀態(tài),后面會提到)。
總線(Bus)
在嵌入式系統(tǒng)中一定會有一塊處理器芯片,此外,還有其它的芯片作為外部設備(后面簡稱外設),這些芯片與處理器協(xié)作實現(xiàn)產(chǎn)品的功能。復雜的產(chǎn)品往往是由大量的芯片組成的。那么不可避免的是我們需要將所有的外設與處理器進行相連,最為簡單的是將所有的外設都采用獨立(注意是獨立)的信號線連接至處理器。
這樣的好處是容易理解,但問題是:不可行。因為處理器芯片需要引出太多的線了,從芯片的生產(chǎn)和產(chǎn)品的生產(chǎn)角度來看都不實際。加之,處理器(在此我們假設處理器是單核的,而不是多核的)處理事務在微觀上是串行的,也就是說在某一時刻如果要對外設進行讀寫操作,那只可能是對大量外設中的一個進行,即多個外設不可能在微觀上被處理器同時訪問。需要注意的是,這里提出了微觀這一概念,這是為了區(qū)別于宏觀。
從宏觀上來講,一個處理器中可以有多個任務同時運行,但這些任務在微觀上卻是一個一個運行的(后面會用串行來描述這里所說的“一個一個”),多任務的串行運行實現(xiàn)是由操作系統(tǒng)扮演著重要的角色來實現(xiàn)的?;氐轿覀兊?a href="http://wenjunhu.com/v/tag/" target="_blank">話題,即然將每個外設采用獨立的信號線連到處理器不可行,且處理器在單一時間內(nèi)只會對一個外設進行訪問,那我們能不能采用共享的信號線將所有的芯片連在一起呢?這就是總線概念的由來。
通俗的說,如果我們周圍有十個家庭,為了讓這十個家庭每兩個之間都能往來,我們并不需要為每兩個家庭修一條單獨(注意是單獨)的路(如果這樣,要修45條路),而是可以修一條大路,然后,每個家都與大路相連。
對于總線,我們往往說總線是處理器的,而其它的外設是掛在總線上的。那有一個問題,我們每一時間只能訪問掛在總線上的一個外設,那如何區(qū)分這些外設呢?和我們的路一樣,我們需要用地址來區(qū)分每一個家庭,在總線上,也是采用地址來進行區(qū)分的。這樣,總線就根據(jù)其功能分為兩類了。一類是地址總線,這一總線上的數(shù)據(jù)只會是從處理器向外設“流”,是單向的。
另一類則是數(shù)據(jù)總線,用來將數(shù)據(jù)從處理器傳送到外設(從處理器的角度來說是寫操作)或者是將數(shù)據(jù)從外設傳送到處理器(從處理器的角度來說是讀操作),顯然,數(shù)據(jù)總線是雙向的。也就是說,在我們的嵌入式系統(tǒng)中同時存在地址總線和數(shù)據(jù)總線將所有需要與處理器進行通訊的芯片連在一起的。
總線是有寬度的,正如我們的路分為“三車道”或是“四車道”,我們說32位處理器,是指其數(shù)據(jù)總線寬度是32位,也就是“有32輛車能同時跑”,顯然,寬度越是寬我們的處理器速度就越是快,因為我們從外設芯片存取數(shù)據(jù)的速度會更快,這就是為什么我們的計算機向64位發(fā)展的原因。同樣的,地址總線也是有寬度的,對于32位處理器其最大寬度也就是32位。
總線的概念有了,那接下來的一個問題是,即使是每一個外設都有一個地址,那這一地址記在哪里呢?是放在外設芯片上嗎?如果這樣的話,那就有一個問題,每一類外設的地址必須是不能重疊的,而當一個產(chǎn)品中需要兩塊一樣的芯片的話,兩塊芯片的地址就無法區(qū)分了,看來這樣操作存在問題。還有,如果這樣的話每一個外設也得與(比如,32根)數(shù)據(jù)總線完全相連,并監(jiān)聽數(shù)據(jù)線以了解處理器是不是在“叫”自己,這樣很是復雜。此外,地址也有可能因為外設種類的增多而用光。總的來說地址不能存放在外設芯片,那如何讓外設知道,此時它是被處理器招換從而需要進行讀寫訪問的呢?答案就是芯片的片選(CS, chip select)信號,或者又號使能(ENable)信號。
片選(CS或EN)
片選信號對于外設芯片來講,就是一個(也是一根)通知信號,告訴芯片“嘿,請開門,我要放些東西進來,或是拿些東西走”,這里的東西只能是數(shù)據(jù),不可能是玉米棒什么的。那有個問題,這個信號源從哪里來呢?顯然,只能從處理器來。那是不是也是像總線那樣,每一個芯片都共用一根線連在一起呢?如果這樣,可能處理器“一叫開門”所有的芯片都將“門”打開了。
如果是處理器寫數(shù)據(jù),那可能所有的芯片都被寫入同樣的數(shù)據(jù)。而取數(shù)據(jù)時,每個外設芯片都向外“扔”數(shù)據(jù),這一定會造成數(shù)據(jù)總線沖突,因為有的芯片向總線上“扔”1,有的則“扔”0,這種情況下處理器一定會“發(fā)瘋”的,因為它不知道應當?shù)玫?還是0。
既然這樣,那顯然不能將所有的片選信號連在一起了,只能是各芯片的片選信號獨立。前面提到了地址總線,我們是采用一根地址線連一個外設芯片呢?還是采用其它的方法。如果采用一根地址線連一個外設芯片,那可能最多只能掛接32個芯片了,這顯然不行。其實,在現(xiàn)實中,是采用32位的數(shù)字來表示一個外設芯片的地址的,比如1可以表示芯片A,而6534可以表示另外一個芯片B,等等。
由此看來,理論上我們可以表示2的32次方(4294967296)個設備,之所以說理論上,是因為有的設備要占用大量的地址。即然這樣,那還有一個問題,如果將32位的地址總線轉換成芯片的一根片選信號呢?這需要引入譯碼(器)的概念。
譯碼器(Decoder)
譯碼器將一個數(shù)據(jù)轉換成一根信號線上的信號,比如3/8譯碼器,可以將一個位寬是3位的數(shù)據(jù)轉換成8根(2的3次方)完全獨立的信號線,當向數(shù)據(jù)側寫入二進制的011時,對應的是8根線的第3根,當輸入二進制的111時,對應的是8根線中的最后一根。有了譯碼器,處理器的地址線就簡化了,只要32根地址線加上外面的譯碼器,就可以訪問大量的外設芯片了。外部設備的選擇問題,我們已經(jīng)解決了,現(xiàn)在還得回頭看一看數(shù)據(jù)總線。
圖1 3/8譯碼器
在嵌入式系統(tǒng)中,所有芯片的數(shù)據(jù)總線可以理解成是直接相連的。之所以用了“可以理解”一詞,是因為為了提高總線的負載能力,其中會加入總線驅(qū)動器。為了理解,我們看一看我們生活中的自來水,比如,在北京理論上可能所有的水管是連在一起的,但中間可能為了提高水壓,存在很多小的水站用來增加供水壓力,而不可能全北京所有的自來水自接來自一個水廠。
既然所有的數(shù)據(jù)總線是連在一起的,那就可能會有問題。當向外部設備寫數(shù)據(jù)時,處理器先向地址總線輸送目標外設的地址,地址譯碼器將其轉換成一根信號的片選信號送到了目標外設,目標外設收到這一信號后,將“門”打開。接下來處理器將要傳送到外設的數(shù)據(jù)往數(shù)據(jù)總線上一放,由于只有目標外設芯片打開了“門”,所以數(shù)據(jù)只會進入到目標外設,而其它的外設什么也不會收到。
接下來看一看讀。讀的話,由于數(shù)據(jù)是從外設輸送到處理器的,盡管我們采用和寫一樣的方法打開目標外設的“門”,但此時,其它的外設也在數(shù)據(jù)總線上,它們有可能處于1也可能處于0,是不是會影響處理器讀取目標外設的數(shù)據(jù)呢?結果當然不會,但我們得引入另一個概念:高阻態(tài)。
高阻態(tài)
很顯然,當處理器從目標外設讀數(shù)據(jù)時,我們希望其它沒有被選上的芯片的數(shù)據(jù)總線不會對目標外設所要傳送的數(shù)據(jù)有影響,那怎么辦呢?實際上,當芯片沒有被選中時,其數(shù)據(jù)總線都處于高阻態(tài)。所謂的高阻態(tài),我們可以理解成這一管腳在外設芯片內(nèi)部是斷開的,如此一來,顯然不會對處理器從目標外設讀取數(shù)據(jù)造成任何的影響了。我們說當一個芯片沒有被選中或是沒有被使能時,其數(shù)據(jù)總線一定是處于高阻態(tài)的。前面用了“門”的開和關來打比方,那“門”是指什么呢?是指外設的數(shù)據(jù)總線,片選信號的作用就是控制將外設的數(shù)據(jù)總線與處理器的數(shù)據(jù)總線相連或是斷開。
驅(qū)動
總線上的數(shù)據(jù)是誰放上去的我們就說誰是那一時刻的驅(qū)動者。也就是說,當處理器向外設寫數(shù)據(jù)時,它是在驅(qū)動數(shù)據(jù)總線的,而當處理器從目標外設讀取數(shù)據(jù)時,目標外設是在驅(qū)動數(shù)據(jù)總線的。對于地址總線,因為只可能從處理器向目標外設寫,所以地址總線永遠是由處理器驅(qū)動的。當一個芯片沒有被選中時,我們說它并不驅(qū)動數(shù)據(jù)總線。
三態(tài)門
前面我們說到外設芯片的數(shù)據(jù)總線在沒有被選中時其處于高阻態(tài),當被選中時,其電平可能是高(1)或是低(0)。如此一來,我們說外設的數(shù)據(jù)總線其芯片管腳是屬于三態(tài)門的,即存在高電平、低電平和高阻態(tài),三個狀態(tài)。
電平的有效性
前面我們了解了什么是片選信號,也講到了三態(tài)門,需要指出的是片選信號通常不是三態(tài)門,其只存在兩個狀態(tài),即高電平或是低電平。前面我們也說了,片選信號是用來“開門”的,而片選信號又有高和低電平,那到底是高電平表示“開門”呢?還是低電平?對于這一問題,我們稱如果一個電平對于一個片選信號表示“開門”那么它就是這一信號的有效電平。比如,對于一個片選信號,如果低電平表示“開門”,那么我們說這個片選信號是低電平有效的。雖然,在這里我們用片選信號來解釋電平的有效性,但是很多信號都存在有效性的問題,比如,后面我們將要談的讀信號和寫信號都存在有效性問題。
時序
在前面我們說到當處理器要向外設芯片寫數(shù)據(jù)時,需要先將所需訪問的外設的地址放在地址總線上,然后,由譯碼器將地址總線上的數(shù)據(jù)轉換成片選信號,片選信號則使能目標外設芯片,接下來處理器寫數(shù)據(jù)到數(shù)據(jù)總線上,從而完成一個寫操作。顯然,在處理器將數(shù)據(jù)寫到數(shù)據(jù)總線之前地址線上的數(shù)據(jù)必須一直保留一段時間,否則的話譯碼器不能長時間的使片選信號有效。
當完成了數(shù)據(jù)的寫操作后,處理器就不需要保證地址總線上的地址有效了。我們可以看出,這一系列的操作都有一定嚴格的時間順序的,這稱之為時序。時序描述了處理器與外部設備的交互信號 “規(guī)程”,大家只有按照這一“規(guī)程”來操作,才能保證處理器與外部設備之間能正常的通訊。這好比,我們的道路上的紅綠燈,如果我們行人和車輛不按照其指示來通行的話,就會出現(xiàn)事故。通常,采用時序圖來描述芯片之間通訊的信號“規(guī)程”。
圖2 讀時序圖
圖3 讀時序圖
從圖中我們可以看出ADDRESS是表示地址總線的,DQ是表示數(shù)據(jù)總線的,CE是片選信號,且是低電平有效,其寬度要保證在進行讀操作時總是有效的。學會看時序圖對于做嵌入式系統(tǒng)開發(fā)非常有幫助,因為我們不可避免的要與芯片打交道。在時序圖中,通常會標識很多的時間需求信息。
在寫啟動代碼時需要初始化各地址空間的片選地址寄存器和讀寫時序,時序的配置依據(jù)就是來自于外設芯片的時間需求,這是芯片手冊很重要的一部分內(nèi)容。當一個地址空間中存在多個外設芯片時,我們需要考慮到其中最慢的外設芯片的時間需求,否則的話有的芯片就不能正常工作。
評論
查看更多