作單片機開發時UART,SPI和I2C都是咱們最常用到的硬件接口,我收集了相關的具體材料對這三種接口進行了詳細的解釋。編程
UART是一種通用串行數據總線,用於異步通訊。該總線雙向通訊,能夠實現全雙工傳輸和接收。在嵌入式設計中,UART用於主機與輔助設備通訊,如汽車音響與外接AP之間的通訊,與PC機通訊包括與監控調試器和其它器件,如EEPROM通訊。數組
將由計算機內部傳送過來的並行數據轉換爲輸出的串行數據流。將計算機外部來的串行數據轉換爲字節,供計算機內部並行數據的器件使用。在輸出的串行數據流中加入奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。在輸出數據流中加入啓停標記,並從接收數據流中刪除啓停標記。處理由鍵盤或鼠標發出的中斷信號(鍵盤和鼠標也是串行設備)。能夠處理計算機與外部串行設備的同步管理問題。有一些比較高檔的UART還提供輸入輸出數據的緩衝區,比較新的UART是16550,它能夠在計算機須要處理數據前在其緩衝區內存儲16字節數據,而一般的UART是8250。異步
在單片機中UART能夠說是一種最基本的配置,不少與電腦進行通訊的設備都採用到它,按計算機最常規的說法就是串行通訊。模塊化
兩個設備間將TX與RX相連,RX與TX相連便可正常工做。最經常使用到的就是咱們電腦上的USB那就是個最典型的UART接口。函數
發送邏輯對從發送FIFO 讀取的數據執行「並→串」轉換。控制邏輯輸出起始位在先的串行位流,而且根據控制寄存器中已編程的配置,後面緊跟着數據位(注意:最低位 LSB 先輸出)、奇偶校驗位和中止位。
在檢測到一個有效的起始脈衝後,接收邏輯對接收到的位流執行「串→並」轉換。此外還會對溢出錯誤、奇偶校驗錯誤、幀錯誤和線停止(line-break)錯誤進行檢測,並將檢測到的狀態附加到被寫入接收FIFO 的數據中。oop
波特率除數(baud-rate divisor)是一個22 位數,它由16 位整數和6 位小數組成。波特率發生器使用這兩個值組成的數字來決定位週期。經過帶有小數波特率的除法器,在足夠高的系統時鐘速率下,UART 能夠產生全部標準的波特率,而偏差很小。編碼
發送時,數據被寫入發送FIFO。若是UART 被使能,則會按照預先設置好的參數(波特率、數據位、中止位、校驗位等)開始發送數據,一直到發送FIFO 中沒有數據。一旦向發送FIFO 寫數據(若是FIFO 未空),UART 的忙標誌位BUSY 就有效,而且在發送數據期間一直保持有效。BUSY 位僅在發送FIFO 爲空,且已從移位寄存器發送最後一個字符,包括中止位時才變無效。即 UART 再也不使能,它也能夠指示忙狀態。BUSY 位的相關庫函數是UARTBusy( )
在UART 接收器空閒時,若是數據輸入變成「低電平」,即接收到了起始位,則接收計數器開始運行,而且數據在Baud16 的第8 個週期被採樣。若是Rx 在Baud16 的第8 週期仍然爲低電平,則起始位有效,不然會被認爲是錯誤的起始位並將其忽略。
若是起始位有效,則根據數據字符被編程的長度,在 Baud16 的每第 16 個週期(即一個位週期以後)對連續的數據位進行採樣。若是奇偶校驗模式使能,則還會檢測奇偶校驗位。
最後,若是Rx 爲高電平,則有效的中止位被確認,不然發生幀錯誤。當接收到一個完整的字符時,將數據存放在接收FIFO 中。設計
出現如下狀況時,可以使UART 產生中斷:調試
因爲全部中斷事件在發送到中斷控制器以前會一塊兒進行「或運算」操做,因此任意時刻 UART 只能向中斷產生一箇中斷請求。經過查詢中斷狀態函數UARTIntStatus( ),軟件能夠在同一個中斷服務函數裏處理多箇中斷事件(多個並列的if 語句)。接口
FIFO 是「First-In First-Out」的縮寫,意爲「先進先出」,是一種常見的隊列操做。 Stellaris 系列ARM 的UART 模塊包含有2 個16 字節的FIFO:一個用於發送,另外一個用於接收。能夠將兩個FIFO 分別配置爲以不一樣深度觸發中斷。可供選擇的配置包括:1/八、 1/四、1/二、3/4 和7/8 深度。例如,若是接收FIFO 選擇1/4,則在UART 接收到4 個數據時產生接收中斷。
發送FIFO的基本工做過程: 只要有數據填充到發送FIFO 裏,就會當即啓動發送過程。因爲發送自己是個相對緩慢的過程,所以在發送的同時其它須要發送的數據還能夠繼續填充到發送 FIFO 裏。當發送 FIFO 被填滿時就不能再繼續填充了,不然會形成數據丟失,此時只能等待。這個等待並不會好久,以9600 的波特率爲例,等待出現一個空位的時間在1ms 上下。發送 FIFO 會按照填入數據的前後順序把數據一個個發送出去,直到發送 FIFO 全空時爲止。已發送完畢的數據會被自動清除,在發送FIFO 裏同時會多出一個空位。
接收FIFO的基本工做過程: 當硬件邏輯接收到數據時,就會往接收FIFO 裏填充接收到的數據。程序應當及時取走這些數據,數據被取走也是在接收FIFO 裏被自動刪除的過程,所以在接收 FIFO 裏同時會多出一個空位。若是在接收 FIFO 裏的數據未被及時取走而形成接收FIFO 已滿,則之後再接收到數據時因無空位能夠填充而形成數據丟失。
收發FIFO 主要是爲了解決UART 收發中斷過於頻繁而致使CPU 效率不高的問題而引入的。在進行 UART 通訊時,中斷方式比輪詢方式要簡便且效率高。可是,若是沒有收發 FIFO,則每收發一個數據都要中斷處理一次,效率仍然不夠高。若是有了收發FIFO,則能夠在連續收發若干個數據(可多至14 個)後才產生一次中斷而後一併處理,這就大大提升了收發效率。
徹底沒必要要擔憂FIFO 機制可能帶來的數據丟失或得不到及時處理的問題,由於它已經幫你想到了收發過程當中存在的任何問題,只要在初始化配置UART 後,就能夠放心收發了, FIFO 和中斷例程會自動搞定一切。
UART 能夠進入一個內部迴環(Loopback)模式,用於診斷或調試。在迴環模式下,從Tx 上發送的數據將被Rx 輸入端接收。
在某些 Stellaris 系列 ARM 芯片裏,UART 還包含一個 IrDA 串行紅外(SIR)編碼器/ 解碼器模塊。IrDA SIR 模塊的做用是在異步UART數據流和半雙工串行SIR 接口之間進行轉換。片上不會執行任何模擬處理操做。SIR 模塊的任務就是要給UART 提供一個數字編碼輸出和一個解碼輸入。UART 信號管腳能夠和一個紅外收發器鏈接以實現IrDA SIR物理層鏈接。
I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只須要兩根線便可在鏈接於總線上的器件之間傳送信息。
主器件用於啓動總線傳送數據,併產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認爲是從器件.在總線上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。若是主機要發送數據給從器件,則主機首先尋址從器件,而後主動發送數據至從器件,最後由主機終止數據傳送;若是主機要接收從器件的數據,首先由主器件尋址從器件.而後主機接收從器件發送的數據,最後由主機終止接收過程。在這種狀況下.主機負責產生定時時鐘和終止數據傳送。
SDA(串行數據線)和SCL(串行時鐘線)都是雙向I/O線,接口電路爲開漏輸出.需經過上拉電阻接電源VCC.當總線空閒時.兩根線都是高電平,鏈接總線的外同器件都是CMOS器件,輸出級也是開漏電路.在總線上消耗的電流很小,所以,總線上擴展的器件數量主要由電容負載來決定,由於每一個器件的總線接口都有必定的等效電容.而線路中電容會影響總線傳輸速度.當電容過大時,有可能形成傳輸錯誤.因此,其負載能力爲400pF,所以能夠估算出總線容許長度和所接器件數量。
主器件用於啓動總線傳送數據,併產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認爲是從器件.在總線上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。若是主機要發送數據給從器件,則主機首先尋址從器件,而後主動發送數據至從器件,最後由主機終止數據傳送;若是主機要接收從器件的數據,首先由主器件尋址從器件.而後主機接收從器件發送的數據,最後由主機終止接收過程。在這種狀況下.主機負責產生定時時鐘和終止數據傳送。
I2C總線特色能夠歸納以下:
發送到SDA 線上的每一個字節必須爲8 位,每次傳輸能夠發送的字節數量不受限制。每一個字節後必須跟一個響應位。首先傳輸的是數據的最高位(MSB),若是從機要完成一些其餘功能後(例如一個內部中斷服務程序)才能接收或發送下一個完整的數據字節,可使時鐘線SCL 保持低電平,迫使主機進入等待狀態,當從機準備好接收下一個數據字節並釋放時鐘線SCL 後數據傳輸繼續。
數據傳輸必須帶響應,相關的響應時鐘脈衝由主機產生。在響應的時鐘脈衝期間發送器釋放SDA 線(高)。
在響應的時鐘脈衝期間,接收器必須將SDA 線拉低,使它在這個時鐘脈衝的高電平期間保持穩定的低電平。
一般被尋址的接收器在接收到的每一個字節後,除了用CBUS 地址開頭的數據,必須產生一個響應。當從機不能響應從機地址時(例如它正在執行一些實時函數不能接收或發送),從機必須使數據線保持高電平,主機而後產生一箇中止條件終止傳輸或者產生重複起始條件開始新的傳輸。
若是從機接收器響應了從機地址,可是在傳輸了一段時間後不能接收更多數據字節,主機必須再一次終止傳輸。這個狀況用從機在第一個字節後沒有產生響應來表示。從機使數據線保持高電平,主機產生一箇中止或重複起始條件。
若是傳輸中有主機接收器,它必須經過在從機發出的最後一個字節時產生一個響應,向從機發送器通知數據結束。從機發送器必須釋放數據線,容許主機產生一箇中止或重複起始條件。
全部主機在SCL線上產生它們本身的時鐘來傳輸I2C總線上的報文。數據只在時鐘的高電平週期有效,所以須要一個肯定的時鐘進行逐位仲裁。
時鐘同步經過線與鏈接I2C 接口到SCL 線來執行。這就是說SCL 線的高到低切換會使器件開始數它們的低電平週期,並且一旦器件的時鐘變低電平,它會使SCL 線保持這種狀態直到到達時鐘的高電平。可是若是另外一個時鐘仍處於低電平週期,這個時鐘的低到高切換不會改變SCL 線的狀態。所以SCL 線被有最長低電平週期的器件保持低電平。此時低電平週期短的器件會進入高電平的等待狀態。
當全部有關的器件數完了它們的低電平週期後,時鐘線被釋放並變成高電平。以後,器件時鐘和SCL線的狀態沒有差異,並且全部器件會開始數它們的高電平週期。首先完成高電平週期的器件會再次將SCL線拉低。
這樣產生的同步SCL 時鐘的低電平週期由低電平時鐘週期最長的器件決定,而高電平週期由高電平時鐘週期最短的器件決定。
快速模式器件能夠在400kbit/s 下接收和發送。最小要求是:它們能夠和400kbit/s 傳輸同步,能夠延長SCL 信號的低電平週期來減慢傳輸。快速模式器件都向下兼容,能夠和標準模式器件在0~100kbit/s 的I2C 總線系統通信。可是,因爲標準模式器件不向上兼容,因此不能在快速模式I2C 總線系統中工做。快速模式I2C 總線規範與標準模式相比有如下特徵:
高速模式(Hs 模式)器件對I2C 總線的傳輸速度有巨大的突破。Hs 模式器件能夠在高達3.4Mbit/s 的位速率下傳輸信息,並且保持徹底向下兼容快速模式或標準模式(F/S 模式)器件,它們能夠在一個速度混合的總線系統中雙向通信。
Hs 模式傳輸除了不執行仲裁和時鐘同步外,與F/S 模式系統有相同的串行總線協議和數據格式。
高速模式下I2C 總線規範以下:
SPI接口的全稱是"Serial Peripheral Interface",意爲串行外圍接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應用在EEPROM、FLASH、實時時鐘、AD轉換器,還有數字信號處理器和數字信號解碼器之間。
SPI接口是在CPU和外圍低速器件之間進行同步串行數據傳輸,在主器件的移位脈衝下,數據按位傳輸,高位在前,低位在後,爲全雙工通訊,數據傳輸速度整體來講比I2C總線要快,速度可達到幾Mbps。
在點對點的通訊中,SPI接口不須要進行尋址操做,且爲全雙工通訊,顯得簡單高效。在多個從器件的系統中,每一個從器件須要獨立的使能信號,硬件上比I2C系統要稍微複雜一些。
SPI接口在內部硬件其實是兩個簡單的移位寄存器,傳輸的數據爲8位,在主器件產生的從器件使能信號和移位脈衝下,按位傳輸,高位在前,低位在後。