Linux嵌入式開發入門(二)——快速看懂原理圖,對接軟體開發
這裡只是為了看懂原理圖,不牽扯具體的計算等內容(比如電路電流多少啊,三極體放大等等)。因為對於嵌入式開發人員來說,只需要明白不同的電平對於開發板的結果即可,不需要知道具體電路的情況。
微機原理:側重於講計算機結構
數位電子技術基礎:側重於閘電路
- GPIO和閘電路
- GPIO類
GPIO:通用的輸入輸出埠,可以通過輸入來測量外界的電平情況;可以通過輸出來控制電路
- GPIO類
只要上面的2440晶片對應的引腳應該為輸出引腳。如果對應的輸出引腳輸出3.3V的高電平LED就會被點亮;如果輸出引腳輸出低電平(0V),那麼LED則不亮
以上的線路很簡單,開關閉合線路接通有電流;開關開啟,線路不導通,無電流。
如果在開關開啟的前提下,A點使用萬用表測量,電壓應該為3.3v,因為,如果此時這裡不為3.3V與之相連的上方為3.3V就會形成電流,與實際不符;如果此時開關閉合,那麼該線路是接通狀態,應該有電流流過,那麼此時,A點的電流應該為0V。
那麼如果把萬用表換成2440晶片會得到。
那麼此時2440對應的引腳應該為輸入引腳,通過讀取該引腳對應的暫存器中的資料,就可以知道該引腳為高電平還是低電平。如果讀到了高電平,說明此處為3.3V電路沒有接通了如果讀到了低電平,說此處為0V,說明電路接通了。以此可以判斷開關的開閉情況。
對於現在的晶片的引腳來說,既可以作為輸入引腳,同樣也可以作為輸出引腳。可以通過配置其中引數的某一位(具體參照手冊)的方法來改變其功能。
輸出引腳,寫值到某個暫存器中
輸入引腳,讀某個暫存器中的值。
實際原理圖
LED處的原理圖
晶片引腳的原理圖
由以上兩幅圖可以看出,LED由某一個引腳引入到晶片中。就可以找到對應的晶片中的引腳。通過該晶片手冊就可以查到該如何操作。
由LED的原理圖可以看出,三個控制LED的引腳的功能都不是為了檢測電壓,那麼都是輸出引腳,也就是如果輸出了低電平,則LED被點亮;輸出高電平,則燈會熄滅。
在晶片手冊中查詢該引腳的資訊
檢視到pin name為EINT3/GPF3 的引腳的pin number為M15
可以看到該引腳既可以作為輸入引腳也可以作為輸出引腳
可以在I/O port章節中看到,這一組引腳的應該如何配置
那麼如果將GPF的暫存器配置為EINT[4]時,則該引腳會成為中斷引腳
中斷引腳舉例
對於假設2440外連線一個DM9000的網絡卡,如果網絡卡收到了資料,如何來通知2440晶片呢?如果定時讓2440去查詢DM9000,是一個非常耗費資源的工作,那麼這時候,如果把對應的引腳設定為中斷引腳,只要DM9000獲得了資料,就把想2440的中斷引腳輸出高電平,2440得到高電平後,向CPU傳送中斷訊號,以執行相應的操作即可。
中斷引腳,有輸入功能,可以中斷CPU(同樣可以通過GPFDAT來獲得資料已得到是否中斷,但是比較耗費資源)
GPFCON就是配置GPF引腳的記憶體地址為0x56000050
參照接下面的表格可以看出,對於GPF4來說,需要操作8、9兩位來控制該引腳的輸入輸出功能。具體的設定情:00 = Input 01 = Output 10 = EINT[4] 11 = Reserved
那麼如何設定該引腳輸出低電平來點亮LED呢?
在GPFDAT中可以看到資料配置資訊的地址為:0x56000054
GPFDAT配置
可以看到,如果配置為輸入引腳,那麼對應的位中的資料就是讀取到的資料,也就是讀到1為高電平,讀到0為低電平。如果配置為輸出引腳,如果寫入1為輸出高電平,如果寫入0則輸出低電平。
在手冊中不難看出,還有一個GPFUP
GPFUP
這個是上拉電阻的意思,至於上拉電阻的問題,還需要看看三極體。
NPN三極體
對於NPN三極體來說,如果此時2440晶片的引腳為輸出引腳,並且輸出的為低電平,那麼此時,三極體處於不導通的狀態。但是對於三極體另外一個管腳來說,狀態未知,所以,在此管腳上接通一個電阻,以方便得到他的狀態。
那麼此時,如果輸出一個低電平,三極體不導通,那麼,此時的輸入管腳會得到一個高電平。而反之,如果輸出為高電平,那麼輸入會得到一個低電平。所以輸出和輸入為反相的情況。
那麼引腳的上拉功能是什麼呢?可以假設在晶片內部存在一個上拉電阻,當暫存器設定為1則該電阻不通電。
假設這樣的電路,其中上拉電阻是位於晶片內部的,對應的引腳是輸入引腳,如果上拉電阻設定為斷開,此時開關也不開啟,對於中間一段電路來說是“懸空的”,無法獲取其中的電路。
如果此時設定了上拉功能,就出現了圖上的情況,是一個完整的電路,也就可以測量出晶片外的電平情況。如果獲取到的資訊為高電平說明開關未被按下;如果獲取低電平,說明此時形成了迴路,開關被按下。
上拉電阻的作用,對於輸入引腳,可以用它來確定電平狀態。
還存在一種下拉電阻的情況
PNP三極體和上拉電阻
對於PNP型別的三極體來說,如果2440晶片輸出低電平,那麼此時三極體處於導通的狀態,此時輸入能夠得到一個高電平;那麼反之,如果輸出是一個高電平,三極體不導通,那麼此時輸入會得到低電平。
上拉電阻和下拉電阻的作用主要是為了,確定“懸空的引腳”的確定的狀態。
- 閘電路
-
非門
非門對於非門來說,如果2440輸出高電平,在B端會得到低電平;反之,2440輸出高電平,在B端會得到低電平
-
與門
與門
-
對於與門是對A1和A2做與運算B = A1 & A2
,如果A1和A2中只要任意一個或者同時輸出了低電平,那麼B會輸出低電平;如果A1、A2同時輸出高電平,在B會得到高電平
- 或門
或門
對於或門來說,就是對A1和A2做或運算,
B = A1 || A2
,當A1、A2中,只要輸出至少一個高電平,對於B來說都會得到高電平。如果A1、A2同時輸出低電平,那麼B會得到低電平
- 與非門
與非門
- 或非門
或非門
-
協議類
協議類遵循的原則:
1.雙方約定的訊號協議(互相可以理解彼此的語言)
2.雙方滿足是時序要求(語速別人可以理解)
開發板和PC串列埠連線示意圖- UART串列埠(Universal Async Receive Transmit )
- UART如何傳輸資料
UART協議傳送8bits的資料的時序圖- 狀態1:空閒。空現階段為高電平
- 狀態2:起始位。2440資料時,讓RxD0為低電平,並保持一段時間T;PC機接收到低電平,就得到了2440即將傳送資訊訊息;需要保持的時間為事先約定好的T,沒辦法自動約定。
- 狀態3:停止位:保持高電平至少一個時間T。
- UART如何傳輸資料
我們不可能手動的傳送電平,來和PC機通訊。那麼在2440上有一個串列埠控制器,我們只需要把串列埠控制器設定好,並且把資料傳送給串列埠控制器即可,它會自動幫我們傳送起始位、停止位、資料以及校驗位的電平。
- UART串列埠(Universal Async Receive Transmit )
2440晶片手冊中的UART暫存器部分
由手冊可以看到,2440晶片具有三個串列埠的暫存器。暫存器中資料的不同位分別表示了資料長度、停止位、校驗位等資訊。
串列埠控制器資料段的暫存器
現在已經知道如何設定串列埠控制器的一些引數,以及資料應該放在哪個暫存器中。但是還有一個關鍵資料沒有設定,那就是傳送資料的速度——波特率
波特率的暫存器設定
硬體上其實相對比較簡單,最少只需要三條線即可完成串列埠,一條傳送、一條接受還有一條參考地線。
- I2C
一款儲存晶片的I2C電路
可以連線多個I2C的晶片
每個I2C裝置中一定有一個地址,只有地址相同的時候,才會響應。
I2C開始傳送資料,開始會先發送7位數的從機地址[可以在晶片手冊裡面獲取](pow(2, 7) 為128,也就是最多可以有128個外接裝置被同一個晶片控制),第8位表示讀寫狀態。地址匹配完成會得到響應訊號(ACK),說明這個裝置是存在的。
I2C開始和停止的時序圖
開始訊號:2440讓時鐘SCL保持高電平,資料SDA由高電平調轉到低電平
停止線號:2440讓式中SCL保持高電平,資料SDA由低電平跳轉到高電平。
I2C的匯流排響應
響應訊號(ACK):接收器在接收到8位資料後,在第9個時鐘週期,拉低SDA為低電平。
也就是在第9個時鐘週期,2440會將SDA設定為接受引腳,有AT24C02來驅動,以檢測是否成功接收資料。
I2C資料的採集
SDA上傳輸的資料必須在SCL為高電平的期間保持穩定,外部裝置會在SCL在高電平的時候讀取資料
SDA上的資料只能在SCL為低電平期間發生變化
不論是何種I2C晶片,start訊號之後,都會發送裝置地址,以及讀寫資訊。之後的資料的含義需要具體檢視對應晶片的手冊上面的規則。
我們也不需要控制I2C的引腳應該如何控制電平,我們只需要控制I2C控制器即可。
- SPI
假設有這樣一款SPI的晶片
SPI和2440的接線
其中片選引腳需要在2440上找一個GPIO引腳,並設定為輸出引腳,以方便可以連線多個SPI裝置。
與SPI的資料通訊需要三條線,分別為時鐘、輸入、輸出。
對於上方圖示的SPI晶片來說,Vcc用於接電源來為SPI晶片供電。Vss接地。W接防寫,如果為低電平則無法對晶片進行寫入。HOLD可以暫停任何操作,低電平有效。
對於硬體的接線,基本上是找到對應的引腳,將其連線在一起即可。資料傳輸,需要檢視對應晶片的協議。
2440晶片關於SPI所支援的四種通訊方式
SPI晶片手冊中的讀取時序
SPI晶片手冊中的寫入時序圖
有晶片手冊可以得到,開始8位被稱為指令,其中包括9位地址的最高位,以及是寫還是讀。第二個八位資料是SPI晶片的地址。之後才是資料的傳輸部分。
- Nand Flash
Nand Flash晶片的接線原理圖
晶片手冊對引腳功能的說明
有說明可以知道,I/O0~I/O7的八個引腳可以用於傳輸資料、地址、命令(讀寫擦除等)。但是晶片如何才能區分這幾個引腳傳入的資料到底是地址、命令還是資料呢?
在晶片上還有CLE引腳,如果為高電平,表示這8個引腳所傳輸的為命令。ALE為高電平表示,8個引腳所傳輸的資料為記憶體地址。兩者都是低電平是,那麼說明這8個引腳上傳輸的是資料資訊。RE為低電平是,說明訊號是從2440到Nand flash,WE為低電平說明,是從Nand Flash讀取資訊。其中WP為防寫引腳,為低電平是為防寫狀態。R/B為狀態引腳,通過該引腳入股哦為高電平說明Nand已經完畢,可以操作,如果為低電平,說晶片還在工作,處於繁忙的狀態
傳送命令操作的時序圖
傳送地址的時序圖
向Nand Flash中寫資料的時序圖
讀取資料的時序圖
2440在傳送脈衝的階段必須有一定的時間要求,否則,可能Nand Flash不能反應過來。需要查詢手冊中的時序要求。
設定2440的Nand Flash控制器中的暫存器,可以使得2440傳送的控制Nand Flash的訊號滿足要求
如何設定時序:
- 看2440手冊,有哪些引數可以設定
看Nand Flash手冊確定取值
-
進行計算,保證傳送的訊號符合Nand Flash的要求。
- LCD
原理圖
協議類的的學習思路
- 看原理圖:2440和外接晶片引腳對接即可
- 弄清楚介面的協議:資料如何傳輸,各引腳如何配合
- 設定時序:2440發出的各個訊號,要讓外接晶片可以反應得過來
- 看2440手冊弄清楚能設定哪些引數以及這些引數的含義(以CLK時鐘為單位)
- 看外設晶片手冊,弄清楚這些引數的取值範圍(以秒為單位)
- 根據之前的兩條,計算2440暫存器的取值(進行秒和CLK之間的換算)需要計算每個訊號何時發出以及發出該訊號需要保持的時間
- 類似記憶體的介面類(RAM-like)
首先先看看關於幾個晶片的的原理圖
記憶體晶片的原理圖
Nor Flash的原理圖
網絡卡的原理圖
有這三幅圖可以看出來,他們都有大量的地址線和資料線。
抽象圖
那麼可以抽象出這樣一幅圖,這三個晶片上都有一組地址線通往2440晶片,同時也有一組資料線通往2440晶片。那麼,2440在和SDRAM通訊時,如何避免NOR FLASH和網絡卡不會造成干擾呢?
在這些晶片和2440連線的時候,每個晶片還都有一個獨立的片選晶片/CSx (Chip Selected)。CS引腳是低電平有效,那麼只需要將需要被選中的晶片的對應片選引腳輸出低電平。
其中兩塊SDRAM晶片使用同一個片選線,那麼此時可以一次性選中兩塊晶片,每次讀取32位資料時,每個晶片可以提供16位資料。
我們不需要手工設定片選引腳。在2440中有一個記憶體控制器和CPU。CPU發出的地址訊號傳送給地址控制器,由地址控制器根據收到的記憶體地址來決定哪個片選引腳輸出低電平。
記憶體控制器的記憶體範圍
有圖上可以看出,如果是NOR啟動的情況下,地址在0到0x8000000的範圍以內(128M),記憶體控制器就會讓nGCS0被選中,以此類推。
如果不是NOR啟動的情況下,那麼則無法選中nCGS0。
每一個片選引腳對應的地址範圍成為一個Bank,對應這個晶片來說,每個Bank為128M ,其中128M是2的27次方(M為2的10次方,128為2的7次方),那麼說明,資料的傳送需要使用27根地址線,那麼範圍應該是ADDR0~ADDR26。
CPU為32位,不代表有32條地址線。CPU範圍A地址,地址總長度為32為,其中bit 0 ~ bit 26,會出現在地址線上,而剩下的bit 31 ~ bit 27,是有記憶體控制器來決定,實際是沒有用的。CPU實際是發出了32bit的地址,但是記憶體控制器只能控制26位。
比如64位CPU來說,實際理論可以支援的最大記憶體大小為2^64,相當於16,777,216TB,而實際電腦的最大記憶體不會有這麼大,他的最大可用記憶體由記憶體控制器來決定。而32位CPU支援的僅僅最大4GB的記憶體,一般記憶體控制器可以實現。所以,這就是對於32位的電腦來說,最大的記憶體支援為4GB;而64位CPU所支援的最大記憶體可能並不相同。
那麼對於記憶體來說,很重要的功能就是讀寫。有了地址線、資料線,還有一個非常重要的就是如何來區分是讀取還是寫入。
所以在記憶體的晶片上一定是有某某使能的引腳。我們看到在晶片上有nOE和nWE的引腳,他們分別是Output Enable和Write Enable的引腳,並且是以低電平有效。那麼他們就是輸出使能和寫入使能。對於晶片來說的輸出,對於2440來說就是讀取資料;反之對晶片來說寫入,對於2440來說就是寫入資料。
對於RAM-like晶片來說,通訊所需要的最少的線路
從原理圖可以看到,Nor Flash是從Addr1開始使用,沒有從Addr0開始使用。
不同位寬外設的接線方式
CPU認為一個地址對應一個位元組;NOR認為一個地址對應兩個位元組。(16位的NOR,一次只能讀取或寫入16位也就是兩個位元組)
假設CPU訪問地址為3的一個位元組,那麼NOR會讀取到地址為2~3的資料。再由記憶體控制器,從兩個自己的記憶體裡面取出自己需要的資料。
如果訪問地址2的一個位元組,NOR會取出2~3的記憶體地址的資料。記憶體控制器,再由其中取出需要使用的資料。
由於1位元組和2位元組之間相差2倍,那麼對於地址的最低位其實是無用的。所以ADDR0作為最後一位的地址是無用的。所以沒必要再連線這條線。
- 對於開發版來說,其實就相當於一套小電腦,如果我們組裝過電腦,對與上面的元件一般都不會感覺陌生,就算沒有組裝過,至少也能說出一部分元件的名字。
比如在主機板上會有CPU、顯示卡、記憶體、網絡卡等等元件。
而對於嵌入式來說,尤其是Linux嵌入式來說,主要使用的是ARM晶片,也可以稱之為SOC(System on Chip),也就是對於一塊ARM晶片來說,其中集成了各種模組,比如CPU、I2C、記憶體模組、網絡卡模組等等。在ARM晶片外面接上合適的元器件。
- 地址統一編址空間
對於2440晶片來說,可以直接使用記憶體地址來訪問SDRAM和NOR Flash。但是如果需要訪問Nand Flash,則需要通過Nand flash控制器來訪問(也就相當於SDRAM、NOR Flash和Nand Flash 控制器是2440的兒子,而Nand Flash則是Nand Flash控制器的兒子,也就是2440的孫子)。cpu可以看到NOR的0地址,但是不能直接看到Nand的零地址。Nand不屬於CPU的統一編址空間