這里只是為了看懂原理圖,不牽扯具體的計算等內容(比如電路電流多少啊,三極管放大等等)。因為對于嵌入式開發人員來說,只需要明白不同的電平對于開發板的結果即可,不需要知道具體電路的情況。
微機原理:側重于講計算機結構
數字電子技術基礎:側重于門電路
- 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被點亮;輸出高電平,則燈會熄滅。
在芯片手冊中查詢該引腳的信息
查看到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
可以看到,如果配置為輸入引腳,那么對應的位中的數據就是讀取到的數據,也就是讀到1為高電平,讀到0為低電平。如果配置為輸出引腳,如果寫入1為輸出高電平,如果寫入0則輸出低電平。
在手冊中不難看出,還有一個GPFUP
這個是上拉電阻的意思,至于上拉電阻的問題,還需要看看三極管。
對于NPN三極管來說,如果此時2440芯片的引腳為輸出引腳,并且輸出的為低電平,那么此時,三極管處于不導通的狀態。但是對于三極管另外一個管腳來說,狀態未知,所以,在此管腳上接通一個電阻,以方便得到他的狀態。
那么此時,如果輸出一個低電平,三極管不導通,那么,此時的輸入管腳會得到一個高電平。而反之,如果輸出為高電平,那么輸入會得到一個低電平。所以輸出和輸入為反相的情況。
那么引腳的上拉功能是什么呢?可以假設在芯片內部存在一個上拉電阻,當寄存器設置為1則該電阻不通電。
假設這樣的電路,其中上拉電阻是位于芯片內部的,對應的引腳是輸入引腳,如果上拉電阻設置為斷開,此時開關也不打開,對于中間一段電路來說是“懸空的”,無法獲取其中的電路。
如果此時設置了上拉功能,就出現了圖上的情況,是一個完整的電路,也就可以測量出芯片外的電平情況。如果獲取到的信息為高電平說明開關未被按下;如果獲取低電平,說明此時形成了回路,開關被按下。
上拉電阻的作用,對于輸入引腳,可以用它來確定電平狀態。
還存在一種下拉電阻的情況
對于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芯片具有三個串口的寄存器。寄存器中數據的不同位分別表示了數據長度、停止位、校驗位等信息。
現在已經知道如何設置串口控制器的一些參數,以及數據應該放在哪個寄存器中。但是還有一個關鍵數據沒有設置,那就是發送數據的速度——波特率
硬件上其實相對比較簡單,最少只需要三條線即可完成串口,一條發送、一條接受還有一條參考地線。
- I2C
每個I2C設備中一定有一個地址,只有地址相同的時候,才會響應。
I2C開始發送數據,開始會先發送7位數的從機地址[可以在芯片手冊里面獲取](pow(2, 7) 為128,也就是最多可以有128個外置設備被同一個芯片控制),第8位表示讀寫狀態。地址匹配完成會得到響應信號(ACK),說明這個設備是存在的。
開始信號:2440讓時鐘SCL保持高電平,數據SDA由高電平調轉到低電平
停止線號:2440讓式中SCL保持高電平,數據SDA由低電平跳轉到高電平。
響應信號(ACK):接收器在接收到8位數據后,在第9個時鐘周期,拉低SDA為低電平。
也就是在第9個時鐘周期,2440會將SDA設置為接受引腳,有AT24C02來驅動,以檢測是否成功接收數據。
SDA上傳輸的數據必須在SCL為高電平的期間保持穩定,外部設備會在SCL在高電平的時候讀取數據
SDA上的數據只能在SCL為低電平期間發生變化
不論是何種I2C芯片,start信號之后,都會發送設備地址,以及讀寫信息。之后的數據的含義需要具體查看對應芯片的手冊上面的規則。
我們也不需要控制I2C的引腳應該如何控制電平,我們只需要控制I2C控制器即可。
- SPI
其中片選引腳需要在2440上找一個GPIO引腳,并設置為輸出引腳,以方便可以連接多個SPI設備。
與SPI的數據通信需要三條線,分別為時鐘、輸入、輸出。
對于上方圖示的SPI芯片來說,Vcc用于接電源來為SPI芯片供電。Vss接地。W接寫保護,如果為低電平則無法對芯片進行寫入。HOLD可以暫停任何操作,低電平有效。
對于硬件的接線,基本上是找到對應的引腳,將其連接在一起即可。數據傳輸,需要查看對應芯片的協議。
有芯片手冊可以得到,開始8位被稱為指令,其中包括9位地址的最高位,以及是寫還是讀。第二個八位數據是SPI芯片的地址。之后才是數據的傳輸部分。
- Nand Flash
有說明可以知道,I/O0~I/O7的八個引腳可以用于傳輸數據、地址、命令(讀寫擦除等)。但是芯片如何才能區分這幾個引腳傳入的數據到底是地址、命令還是數據呢?
在芯片上還有CLE引腳,如果為高電平,表示這8個引腳所傳輸的為命令。ALE為高電平表示,8個引腳所傳輸的數據為內存地址。兩者都是低電平是,那么說明這8個引腳上傳輸的是數據信息。RE為低電平是,說明信號是從2440到Nand flash,WE為低電平說明,是從Nand Flash讀取信息。其中WP為寫保護引腳,為低電平是為寫保護狀態。R/B為狀態引腳,通過該引腳入股哦為高電平說明Nand已經完畢,可以操作,如果為低電平,說芯片還在工作,處于繁忙的狀態
2440在發送脈沖的階段必須有一定的時間要求,否則,可能Nand Flash不能反應過來。需要查詢手冊中的時序要求。
設置2440的Nand Flash控制器中的寄存器,可以使得2440發送的控制Nand Flash的信號滿足要求
如何設置時序:
- 看2440手冊,有哪些參數可以設置
看Nand Flash手冊確定取值
-
進行計算,保證發送的信號符合Nand Flash的要求。
- LCD
協議類的的學習思路
- 看原理圖:2440和外接芯片引腳對接即可
- 弄清楚接口的協議:數據如何傳輸,各引腳如何配合
- 設置時序:2440發出的各個信號,要讓外接芯片可以反應得過來
- 看2440手冊弄清楚能設置哪些參數以及這些參數的含義(以CLK時鐘為單位)
- 看外設芯片手冊,弄清楚這些參數的取值范圍(以秒為單位)
- 根據之前的兩條,計算2440寄存器的取值(進行秒和CLK之間的換算)需要計算每個信號何時發出以及發出該信號需要保持的時間
- 類似內存的接口類(RAM-like)
首先先看看關于幾個芯片的的原理圖
有這三幅圖可以看出來,他們都有大量的地址線和數據線。
那么可以抽象出這樣一幅圖,這三個芯片上都有一組地址線通往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來說就是寫入數據。
從原理圖可以看到,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的統一編址空間