Linux嵌入式開發(fā)入門(二)——快速看懂原理圖,對接軟件開發(fā)

這里只是為了看懂原理圖,不牽扯具體的計算等內(nèi)容(比如電路電流多少啊,三極管放大等等)。因為對于嵌入式開發(fā)人員來說,只需要明白不同的電平對于開發(fā)板的結(jié)果即可,不需要知道具體電路的情況。

微機(jī)原理:側(cè)重于講計算機(jī)結(jié)構(gòu)
數(shù)字電子技術(shù)基礎(chǔ):側(cè)重于門電路

  • GPIO和門電路
    • GPIO類
      GPIO:通用的輸入輸出端口,可以通過輸入來測量外界的電平情況;可以通過輸出來控制電路

只要上面的2440芯片對應(yīng)的引腳應(yīng)該為輸出引腳。如果對應(yīng)的輸出引腳輸出3.3V的高電平LED就會被點亮;如果輸出引腳輸出低電平(0V),那么LED則不亮


以上的線路很簡單,開關(guān)閉合線路接通有電流;開關(guān)打開,線路不導(dǎo)通,無電流。
如果在開關(guān)打開的前提下,A點使用萬用表測量,電壓應(yīng)該為3.3v,因為,如果此時這里不為3.3V與之相連的上方為3.3V就會形成電流,與實際不符;如果此時開關(guān)閉合,那么該線路是接通狀態(tài),應(yīng)該有電流流過,那么此時,A點的電流應(yīng)該為0V。

那么如果把萬用表換成2440芯片會得到。

那么此時2440對應(yīng)的引腳應(yīng)該為輸入引腳,通過讀取該引腳對應(yīng)的寄存器中的數(shù)據(jù),就可以知道該引腳為高電平還是低電平。如果讀到了高電平,說明此處為3.3V電路沒有接通了如果讀到了低電平,說此處為0V,說明電路接通了。以此可以判斷開關(guān)的開閉情況。

對于現(xiàn)在的芯片的引腳來說,既可以作為輸入引腳,同樣也可以作為輸出引腳。可以通過配置其中參數(shù)的某一位(具體參照手冊)的方法來改變其功能。
輸出引腳,寫值到某個寄存器中
輸入引腳,讀某個寄存器中的值。

實際原理圖

LED處的原理圖
芯片引腳的原理圖

由以上兩幅圖可以看出,LED由某一個引腳引入到芯片中。就可以找到對應(yīng)的芯片中的引腳。通過該芯片手冊就可以查到該如何操作。
由LED的原理圖可以看出,三個控制LED的引腳的功能都不是為了檢測電壓,那么都是輸出引腳,也就是如果輸出了低電平,則LED被點亮;輸出高電平,則燈會熄滅。

在芯片手冊中查詢該引腳的信息


查看到pin name為EINT3/GPF3 的引腳的pin number為M15


可以看到該引腳既可以作為輸入引腳也可以作為輸出引腳

可以在I/O port章節(jié)中看到,這一組引腳的應(yīng)該如何配置

那么如果將GPF的寄存器配置為EINT[4]時,則該引腳會成為中斷引腳


中斷引腳舉例

對于假設(shè)2440外連接一個DM9000的網(wǎng)卡,如果網(wǎng)卡收到了數(shù)據(jù),如何來通知2440芯片呢?如果定時讓2440去查詢DM9000,是一個非常耗費資源的工作,那么這時候,如果把對應(yīng)的引腳設(shè)置為中斷引腳,只要DM9000獲得了數(shù)據(jù),就把想2440的中斷引腳輸出高電平,2440得到高電平后,向CPU發(fā)送中斷信號,以執(zhí)行相應(yīng)的操作即可。
中斷引腳,有輸入功能,可以中斷CPU(同樣可以通過GPFDAT來獲得數(shù)據(jù)已得到是否中斷,但是比較耗費資源)

GPFCON就是配置GPF引腳的內(nèi)存地址為0x56000050

參照接下面的表格可以看出,對于GPF4來說,需要操作8、9兩位來控制該引腳的輸入輸出功能。具體的設(shè)置情:
00 = Input 01 = Output 10 = EINT[4] 11 = Reserved

那么如何設(shè)置該引腳輸出低電平來點亮LED呢?
在GPFDAT中可以看到數(shù)據(jù)配置信息的地址為:0x56000054

GPFDAT配置

可以看到,如果配置為輸入引腳,那么對應(yīng)的位中的數(shù)據(jù)就是讀取到的數(shù)據(jù),也就是讀到1為高電平,讀到0為低電平。如果配置為輸出引腳,如果寫入1為輸出高電平,如果寫入0則輸出低電平。

在手冊中不難看出,還有一個GPFUP


GPFUP

這個是上拉電阻的意思,至于上拉電阻的問題,還需要看看三極管。

NPN三極管

對于NPN三極管來說,如果此時2440芯片的引腳為輸出引腳,并且輸出的為低電平,那么此時,三極管處于不導(dǎo)通的狀態(tài)。但是對于三極管另外一個管腳來說,狀態(tài)未知,所以,在此管腳上接通一個電阻,以方便得到他的狀態(tài)。
那么此時,如果輸出一個低電平,三極管不導(dǎo)通,那么,此時的輸入管腳會得到一個高電平。而反之,如果輸出為高電平,那么輸入會得到一個低電平。所以輸出和輸入為反相的情況。

那么引腳的上拉功能是什么呢?可以假設(shè)在芯片內(nèi)部存在一個上拉電阻,當(dāng)寄存器設(shè)置為1則該電阻不通電。



假設(shè)這樣的電路,其中上拉電阻是位于芯片內(nèi)部的,對應(yīng)的引腳是輸入引腳,如果上拉電阻設(shè)置為斷開,此時開關(guān)也不打開,對于中間一段電路來說是“懸空的”,無法獲取其中的電路。
如果此時設(shè)置了上拉功能,就出現(xiàn)了圖上的情況,是一個完整的電路,也就可以測量出芯片外的電平情況。如果獲取到的信息為高電平說明開關(guān)未被按下;如果獲取低電平,說明此時形成了回路,開關(guān)被按下。

上拉電阻的作用,對于輸入引腳,可以用它來確定電平狀態(tài)。

還存在一種下拉電阻的情況

PNP三極管和上拉電阻

對于PNP類型的三極管來說,如果2440芯片輸出低電平,那么此時三極管處于導(dǎo)通的狀態(tài),此時輸入能夠得到一個高電平;那么反之,如果輸出是一個高電平,三極管不導(dǎo)通,那么此時輸入會得到低電平。

上拉電阻和下拉電阻的作用主要是為了,確定“懸空的引腳”的確定的狀態(tài)。

  • 門電路
    • 非門


      非門

      對于非門來說,如果2440輸出高電平,在B端會得到低電平;反之,2440輸出高電平,在B端會得到低電平

    • 與門


      與門

對于與門是對A1和A2做與運算B = A1 & A2,如果A1和A2中只要任意一個或者同時輸出了低電平,那么B會輸出低電平;如果A1、A2同時輸出高電平,在B會得到高電平

- 或門

或門

對于或門來說,就是對A1和A2做或運算,B = A1 || A2,當(dāng)A1、A2中,只要輸出至少一個高電平,對于B來說都會得到高電平。如果A1、A2同時輸出低電平,那么B會得到低電平

 - 與非門
與非門
- 或非門
或非門
  • 協(xié)議類
    協(xié)議類遵循的原則:
    1.雙方約定的信號協(xié)議(互相可以理解彼此的語言)
    2.雙方滿足是時序要求(語速別人可以理解)


    開發(fā)板和PC串口連接示意圖
    • UART串口(Universal Async Receive Transmit )
      • UART如何傳輸數(shù)據(jù)
        UART協(xié)議發(fā)送8bits的數(shù)據(jù)的時序圖
        1. 狀態(tài)1:空閑。空現(xiàn)階段為高電平
        • 狀態(tài)2:起始位。2440數(shù)據(jù)時,讓RxD0為低電平,并保持一段時間T;PC機(jī)接收到低電平,就得到了2440即將發(fā)送信息消息;需要保持的時間為事先約定好的T,沒辦法自動約定。
        • 狀態(tài)3:停止位:保持高電平至少一個時間T。

    我們不可能手動的發(fā)送電平,來和PC機(jī)通信。那么在2440上有一個串口控制器,我們只需要把串口控制器設(shè)置好,并且把數(shù)據(jù)發(fā)送給串口控制器即可,它會自動幫我們發(fā)送起始位、停止位、數(shù)據(jù)以及校驗位的電平。

2440芯片手冊中的UART寄存器部分

由手冊可以看到,2440芯片具有三個串口的寄存器。寄存器中數(shù)據(jù)的不同位分別表示了數(shù)據(jù)長度、停止位、校驗位等信息。

串口控制器數(shù)據(jù)段的寄存器

現(xiàn)在已經(jīng)知道如何設(shè)置串口控制器的一些參數(shù),以及數(shù)據(jù)應(yīng)該放在哪個寄存器中。但是還有一個關(guān)鍵數(shù)據(jù)沒有設(shè)置,那就是發(fā)送數(shù)據(jù)的速度——波特率

波特率的寄存器設(shè)置

硬件上其實相對比較簡單,最少只需要三條線即可完成串口,一條發(fā)送、一條接受還有一條參考地線。

  • I2C
一款存儲芯片的I2C電路
可以連接多個I2C的芯片

每個I2C設(shè)備中一定有一個地址,只有地址相同的時候,才會響應(yīng)。
I2C開始發(fā)送數(shù)據(jù),開始會先發(fā)送7位數(shù)的從機(jī)地址[可以在芯片手冊里面獲取](pow(2, 7) 為128,也就是最多可以有128個外置設(shè)備被同一個芯片控制),第8位表示讀寫狀態(tài)。地址匹配完成會得到響應(yīng)信號(ACK),說明這個設(shè)備是存在的。

I2C開始和停止的時序圖

開始信號:2440讓時鐘SCL保持高電平,數(shù)據(jù)SDA由高電平調(diào)轉(zhuǎn)到低電平
停止線號:2440讓式中SCL保持高電平,數(shù)據(jù)SDA由低電平跳轉(zhuǎn)到高電平。

I2C的總線響應(yīng)

響應(yīng)信號(ACK):接收器在接收到8位數(shù)據(jù)后,在第9個時鐘周期,拉低SDA為低電平。
也就是在第9個時鐘周期,2440會將SDA設(shè)置為接受引腳,有AT24C02來驅(qū)動,以檢測是否成功接收數(shù)據(jù)。

I2C數(shù)據(jù)的采集

SDA上傳輸?shù)臄?shù)據(jù)必須在SCL為高電平的期間保持穩(wěn)定,外部設(shè)備會在SCL在高電平的時候讀取數(shù)據(jù)
SDA上的數(shù)據(jù)只能在SCL為低電平期間發(fā)生變化

不論是何種I2C芯片,start信號之后,都會發(fā)送設(shè)備地址,以及讀寫信息。之后的數(shù)據(jù)的含義需要具體查看對應(yīng)芯片的手冊上面的規(guī)則。

我們也不需要控制I2C的引腳應(yīng)該如何控制電平,我們只需要控制I2C控制器即可。

  • SPI
假設(shè)有這樣一款SPI的芯片
SPI和2440的接線

其中片選引腳需要在2440上找一個GPIO引腳,并設(shè)置為輸出引腳,以方便可以連接多個SPI設(shè)備。
與SPI的數(shù)據(jù)通信需要三條線,分別為時鐘、輸入、輸出。
對于上方圖示的SPI芯片來說,Vcc用于接電源來為SPI芯片供電。Vss接地。W接寫保護(hù),如果為低電平則無法對芯片進(jìn)行寫入。HOLD可以暫停任何操作,低電平有效。

對于硬件的接線,基本上是找到對應(yīng)的引腳,將其連接在一起即可。數(shù)據(jù)傳輸,需要查看對應(yīng)芯片的協(xié)議。

2440芯片關(guān)于SPI所支持的四種通信方式
SPI芯片手冊中的讀取時序
SPI芯片手冊中的寫入時序圖

有芯片手冊可以得到,開始8位被稱為指令,其中包括9位地址的最高位,以及是寫還是讀。第二個八位數(shù)據(jù)是SPI芯片的地址。之后才是數(shù)據(jù)的傳輸部分。

  • Nand Flash
Nand Flash芯片的接線原理圖
芯片手冊對引腳功能的說明

有說明可以知道,I/O0~I/O7的八個引腳可以用于傳輸數(shù)據(jù)、地址、命令(讀寫擦除等)。但是芯片如何才能區(qū)分這幾個引腳傳入的數(shù)據(jù)到底是地址、命令還是數(shù)據(jù)呢?
在芯片上還有CLE引腳,如果為高電平,表示這8個引腳所傳輸?shù)臑槊睢LE為高電平表示,8個引腳所傳輸?shù)臄?shù)據(jù)為內(nèi)存地址。兩者都是低電平是,那么說明這8個引腳上傳輸?shù)氖菙?shù)據(jù)信息。RE為低電平是,說明信號是從2440到Nand flash,WE為低電平說明,是從Nand Flash讀取信息。其中WP為寫保護(hù)引腳,為低電平是為寫保護(hù)狀態(tài)。R/B為狀態(tài)引腳,通過該引腳入股哦為高電平說明Nand已經(jīng)完畢,可以操作,如果為低電平,說芯片還在工作,處于繁忙的狀態(tài)

發(fā)送命令操作的時序圖
發(fā)送地址的時序圖
向Nand Flash中寫數(shù)據(jù)的時序圖
讀取數(shù)據(jù)的時序圖

2440在發(fā)送脈沖的階段必須有一定的時間要求,否則,可能Nand Flash不能反應(yīng)過來。需要查詢手冊中的時序要求。

設(shè)置2440的Nand Flash控制器中的寄存器,可以使得2440發(fā)送的控制Nand Flash的信號滿足要求
如何設(shè)置時序:

  1. 看2440手冊,有哪些參數(shù)可以設(shè)置
  • 看Nand Flash手冊確定取值

  • 進(jìn)行計算,保證發(fā)送的信號符合Nand Flash的要求。

    • LCD
原理圖

協(xié)議類的的學(xué)習(xí)思路

  1. 看原理圖:2440和外接芯片引腳對接即可
  • 弄清楚接口的協(xié)議:數(shù)據(jù)如何傳輸,各引腳如何配合
  • 設(shè)置時序:2440發(fā)出的各個信號,要讓外接芯片可以反應(yīng)得過來
    • 看2440手冊弄清楚能設(shè)置哪些參數(shù)以及這些參數(shù)的含義(以CLK時鐘為單位)
    • 看外設(shè)芯片手冊,弄清楚這些參數(shù)的取值范圍(以秒為單位)
    • 根據(jù)之前的兩條,計算2440寄存器的取值(進(jìn)行秒和CLK之間的換算)需要計算每個信號何時發(fā)出以及發(fā)出該信號需要保持的時間
  • 類似內(nèi)存的接口類(RAM-like)
    首先先看看關(guān)于幾個芯片的的原理圖
內(nèi)存芯片的原理圖
Nor Flash的原理圖
網(wǎng)卡的原理圖

有這三幅圖可以看出來,他們都有大量的地址線和數(shù)據(jù)線。

抽象圖

那么可以抽象出這樣一幅圖,這三個芯片上都有一組地址線通往2440芯片,同時也有一組數(shù)據(jù)線通往2440芯片。那么,2440在和SDRAM通信時,如何避免NOR FLASH和網(wǎng)卡不會造成干擾呢?
在這些芯片和2440連接的時候,每個芯片還都有一個獨立的片選芯片/CSx (Chip Selected)。CS引腳是低電平有效,那么只需要將需要被選中的芯片的對應(yīng)片選引腳輸出低電平。

其中兩塊SDRAM芯片使用同一個片選線,那么此時可以一次性選中兩塊芯片,每次讀取32位數(shù)據(jù)時,每個芯片可以提供16位數(shù)據(jù)。

我們不需要手工設(shè)置片選引腳。在2440中有一個內(nèi)存控制器和CPU。CPU發(fā)出的地址信號發(fā)送給地址控制器,由地址控制器根據(jù)收到的內(nèi)存地址來決定哪個片選引腳輸出低電平。

內(nèi)存控制器的內(nèi)存范圍

有圖上可以看出,如果是NOR啟動的情況下,地址在0到0x8000000的范圍以內(nèi)(128M),內(nèi)存控制器就會讓nGCS0被選中,以此類推。
如果不是NOR啟動的情況下,那么則無法選中nCGS0。
每一個片選引腳對應(yīng)的地址范圍成為一個Bank,對應(yīng)這個芯片來說,每個Bank為128M ,其中128M是2的27次方(M為2的10次方,128為2的7次方),那么說明,數(shù)據(jù)的傳送需要使用27根地址線,那么范圍應(yīng)該是ADDR0~ADDR26。
CPU為32位,不代表有32條地址線。CPU范圍A地址,地址總長度為32為,其中bit 0 ~ bit 26,會出現(xiàn)在地址線上,而剩下的bit 31 ~ bit 27,是有內(nèi)存控制器來決定,實際是沒有用的。CPU實際是發(fā)出了32bit的地址,但是內(nèi)存控制器只能控制26位。
比如64位CPU來說,實際理論可以支持的最大內(nèi)存大小為2^64,相當(dāng)于16,777,216TB,而實際電腦的最大內(nèi)存不會有這么大,他的最大可用內(nèi)存由內(nèi)存控制器來決定。而32位CPU支持的僅僅最大4GB的內(nèi)存,一般內(nèi)存控制器可以實現(xiàn)。所以,這就是對于32位的電腦來說,最大的內(nèi)存支持為4GB;而64位CPU所支持的最大內(nèi)存可能并不相同。

那么對于內(nèi)存來說,很重要的功能就是讀寫。有了地址線、數(shù)據(jù)線,還有一個非常重要的就是如何來區(qū)分是讀取還是寫入。
所以在內(nèi)存的芯片上一定是有某某使能的引腳。我們看到在芯片上有nOE和nWE的引腳,他們分別是Output Enable和Write Enable的引腳,并且是以低電平有效。那么他們就是輸出使能和寫入使能。對于芯片來說的輸出,對于2440來說就是讀取數(shù)據(jù);反之對芯片來說寫入,對于2440來說就是寫入數(shù)據(jù)。

對于RAM-like芯片來說,通訊所需要的最少的線路

從原理圖可以看到,Nor Flash是從Addr1開始使用,沒有從Addr0開始使用。
不同位寬外設(shè)的接線方式
CPU認(rèn)為一個地址對應(yīng)一個字節(jié);NOR認(rèn)為一個地址對應(yīng)兩個字節(jié)。(16位的NOR,一次只能讀取或?qū)懭?6位也就是兩個字節(jié))
假設(shè)CPU訪問地址為3的一個字節(jié),那么NOR會讀取到地址為2~3的數(shù)據(jù)。再由內(nèi)存控制器,從兩個自己的內(nèi)存里面取出自己需要的數(shù)據(jù)。
如果訪問地址2的一個字節(jié),NOR會取出2~3的內(nèi)存地址的數(shù)據(jù)。內(nèi)存控制器,再由其中取出需要使用的數(shù)據(jù)。
由于1字節(jié)和2字節(jié)之間相差2倍,那么對于地址的最低位其實是無用的。所以ADDR0作為最后一位的地址是無用的。所以沒必要再連接這條線。

  • 對于開發(fā)版來說,其實就相當(dāng)于一套小電腦,如果我們組裝過電腦,對與上面的組件一般都不會感覺陌生,就算沒有組裝過,至少也能說出一部分組件的名字。
    比如在主板上會有CPU、顯卡、內(nèi)存、網(wǎng)卡等等組件。
    而對于嵌入式來說,尤其是Linux嵌入式來說,主要使用的是ARM芯片,也可以稱之為SOC(System on Chip),也就是對于一塊ARM芯片來說,其中集成了各種模塊,比如CPU、I2C、內(nèi)存模塊、網(wǎng)卡模塊等等。在ARM芯片外面接上合適的元器件。
  • 地址統(tǒng)一編址空間
    對于2440芯片來說,可以直接使用內(nèi)存地址來訪問SDRAM和NOR Flash。但是如果需要訪問Nand Flash,則需要通過Nand flash控制器來訪問(也就相當(dāng)于SDRAM、NOR Flash和Nand Flash 控制器是2440的兒子,而Nand Flash則是Nand Flash控制器的兒子,也就是2440的孫子)。cpu可以看到NOR的0地址,但是不能直接看到Nand的零地址。Nand不屬于CPU的統(tǒng)一編址空間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容