UART SPI I2C 接口介紹 轉載

UART SPI I2C 接口介紹@TOC
做單片機開發時UART,SPI和I2C都是我們最經常使用到的硬件接口,我收集了相關的具體材料對這三種接口進行了詳細的解釋。
UART
UART是一種通用串行數據總線,用於異步通信。該總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用於主機與輔助設備通信,如汽車音響與外接AP之間的通信,與PC機通信包括與監控調試器和其它器件,如EEPROM通信。
將由計算機內部傳送過來的並行數據轉換爲輸出的串行數據流。將計算機外部來的串行數據轉換爲字節,供計算機內部並行數據的器件使用。在輸出的串行數據流中加入奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。在輸出數據流中加入啓停標記,並從接收數據流中刪除啓停標記。處理由鍵盤或鼠標發出的中斷信號(鍵盤和鼠標也是串行設備)。可以處理計算機與外部串行設備的同步管理問題。有一些比較高檔的UART還提供輸入輸出數據的緩衝區,比較新的UART是16550,它可以在計算機需要處理數據前在其緩衝區內存儲16字節數據,而通常的UART是8250。
接口
在單片機中UART可以說是一種最基本的配置,很多與電腦進行通信的設備都採用到它,按計算機最常規的說法就是串行通信。

TX - 數據發送接口
RX - 數據接受接口

兩個設備間將TX與RX相連,RX與TX相連即可正常工作。最常用到的就是我們電腦上的USB那就是個最典型的UART接口。
工作原理
發送接收
發送邏輯對從發送FIFO 讀取的數據執行“並→串”轉換。控制邏輯輸出起始位在先的串行位流,並且根據控制寄存器中已編程的配置,後面緊跟着數據位(注意:最低位 LSB 先輸出)、奇偶校驗位和停止位。
在檢測到一個有效的起始脈衝後,接收邏輯對接收到的位流執行“串→並”轉換。此外還會對溢出錯誤、奇偶校驗錯誤、幀錯誤和線中止(line-break)錯誤進行檢測,並將檢測到的狀態附加到被寫入接收FIFO 的數據中。
波特率產生
波特率除數(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 產生中斷:

FIFO 溢出錯誤
線中止錯誤(line-break,即Rx 信號一直爲0 的狀態,包括校驗位和停止位在內)
奇偶校驗錯誤
幀錯誤(停止位不爲1)
接收超時(接收FIFO 已有數據但未滿,而後續數據長時間不來)
發送
接收

由於所有中斷事件在發送到中斷控制器之前會一起進行“或運算”操作,所以任意時刻 UART 只能向中斷產生一箇中斷請求。通過查詢中斷狀態函數UARTIntStatus( ),軟件可以在同一個中斷服務函數裏處理多箇中斷事件(多個並列的if 語句)。
FIFO 操作
FIFO 是“First-In First-Out”的縮寫,意爲“先進先出”,是一種常見的隊列操作。 Stellaris 系列ARM 的UART 模塊包含有2 個16 字節的FIFO:一個用於發送,另一個用於接收。可以將兩個FIFO 分別配置爲以不同深度觸發中斷。可供選擇的配置包括:1/8、 1/4、1/2、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
I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只需要兩根線即可在連接於總線上的器件之間傳送信息。
主器件用於啓動總線傳送數據,併產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認爲是從器件.在總線上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先尋址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件尋址從器件.然後主機接收從器件發送的數據,最後由主機終止接收過程。在這種情況下.主機負責產生定時時鐘和終止數據傳送。
接口

SCL - 串行時鐘線
SDA - 串行數據線接口

SDA(串行數據線)和SCL(串行時鐘線)都是雙向I/O線,接口電路爲開漏輸出.需通過上拉電阻接電源VCC.當總線空閒時.兩根線都是高電平,連接總線的外同器件都是CMOS器件,輸出級也是開漏電路.在總線上消耗的電流很小,因此,總線上擴展的器件數量主要由電容負載來決定,因爲每個器件的總線接口都有一定的等效電容.而線路中電容會影響總線傳輸速度.當電容過大時,有可能造成傳輸錯誤.所以,其負載能力爲400pF,因此可以估算出總線允許長度和所接器件數量。
主器件用於啓動總線傳送數據,併產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認爲是從器件.在總線上主和從、發和收的關係不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先尋址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件尋址從器件.然後主機接收從器件發送的數據,最後由主機終止接收過程。在這種情況下.主機負責產生定時時鐘和終止數據傳送。
特點
I2C總線特點可以概括如下:

在硬件上,I2C總線只需要一根數據線和一根時鐘線兩根線,總線接口已經集成在芯片內部,不需要特殊的接口電路,而且片上接口電路的濾波器可以濾去總線數據上的毛刺.因此I2C總線簡化了硬件電路PCB佈線,降低了系統成本,提高了系統可靠性。因爲I2C芯片除了這兩根線和少量中斷線,與系統再沒有連接的線,用戶常用IC可以很容易形成標準化和模塊化,便於重複利用。
I2C總線是一個真正的多主機總線,如果兩個或多個主機同時初始化數據傳輸,可以通過沖突檢測和仲裁防止數據破壞,每個連接到總線上的器件都有唯一的地址,任何器件既可以作爲主機也可以作爲從機,但同一時刻只允許有一個主機。數據傳輸和地址設定由軟件設定,非常靈活。總線上的器件增加和刪除不影響其他器件正常工作。
I2C總線可以通過外部連線進行在線檢測,便於系統故障診斷和調試,故障可以立即被尋址,軟件也利於標準化和模塊化,縮短開發時問。
連接到相同總線上的IC數量只受總線最大電容的限制,串行的8位雙向數據傳輸位速率在標準模式下可達100Kbit/s,快速模式下可達400Kbit/s,高速模式下可達3.4Mbit/s。
總線具有極低的電流消耗.抗高噪聲干擾,增加總線驅動器可以使總線電容擴大10倍,傳輸距離達到15m;兼容不同電壓等級的器件,工作溫度範圍寬。

數據傳輸方式
字節格式
發送到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 總線規範與標準模式相比有以下特徵:

最大位速率增加到400kbit/s;
調整了串行數據(SDA) 和串行時鐘(SCL )信號的時序;
快速模式器件的輸入有抑制毛刺的功能,SDA 和SCL輸入有施密特觸發器;
快速模式器件的輸出緩衝器對SDA 和SCL 信號的下降沿有斜率控制功能;
如果快速模式器件的電源電壓被關斷,SDA 和SCL 的I/O 管腳必須懸空,不能阻塞總線;
連接到總線的外部上拉器件必須調整以適應快速模式I2C 總線更短的最大允許上升時間。對於負載最大是200pF 的總線,每條總線的上拉器件可以是一個電阻,對於負載在200pF~400pF 之間的總線,上拉器件可以是一個電流源(最大值3mA )或者是一個開關電阻電路。

高速模式
高速模式(Hs 模式)器件對I2C 總線的傳輸速度有巨大的突破。Hs 模式器件可以在高達3.4Mbit/s 的位速率下傳輸信息,而且保持完全向下兼容快速模式或標準模式(F/S 模式)器件,它們可以在一個速度混合的總線系統中雙向通訊。
Hs 模式傳輸除了不執行仲裁和時鐘同步外,與F/S 模式系統有相同的串行總線協議和數據格式。
高速模式下I2C 總線規範如下:

Hs 模式主機器件有一個SDAH 信號的開漏輸出緩衝器和一個在SCLH 輸出的開漏極下拉和電流源上拉電路。這個電流源電路縮短了SCLH 信號的上升時間,任何時候在Hs 模式,只有一個主機的電流源有效;
在多主機系統的Hs 模式中,不執行仲裁和時鐘同步,以加速位處理能力。仲裁過程一般在前面用F/S 模式傳輸主機碼後結束;
Hs 模式主機器件以高電平和低電平是1:2 的比率產生一個串行時鐘信號。解除了建立和保持時間的時序要求;
可以選擇Hs 模式器件有內建的電橋。在Hs 模式傳輸中,Hs 模式器件的高速數據(SDAH)和高速串行時鐘(SCLH )線通過這個電橋與F/S 模式器件的SDA 和SCL 線分隔開來。減輕了SDAH 和SCLH 線的電容負載,使上升和下降時間更快;
Hs 模式從機器件與F/S 從機器件的唯一差別是它們工作的速度。Hs 模式從機在SCLH 和SDAH輸出有開漏輸出的緩衝器。SCLH 管腳可選的下拉晶體管可以用於拉長SCLH 信號的低電平,但只允許在Hs 模式傳輸的響應位後進行;
Hs 模式器件的輸出可以抑制毛刺,而且SDAH 和SCLH 輸出有一個施密特觸發器;
Hs 模式器件的輸出緩衝器對SDAH 和SCLH 信號的下降沿有斜率控制功能。

SPI
SPI接口的全稱是"Serial Peripheral Interface",意爲串行外圍接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應用在EEPROM、FLASH、實時時鐘、AD轉換器,還有數字信號處理器和數字信號解碼器之間。
SPI接口是在CPU和外圍低速器件之間進行同步串行數據傳輸,在主器件的移位脈衝下,數據按位傳輸,高位在前,低位在後,爲全雙工通信,數據傳輸速度總體來說比I2C總線要快,速度可達到幾Mbps。
接口

MOSI – 主器件數據輸出,從器件數據輸入
MISO – 主器件數據輸入,從器件數據輸出
SCLK –時鐘信號,由主器件產生,最大爲fPCLK/2,從模式頻率最大爲fCPU/2
NSS – 從器件使能信號,由主器件控制,有的IC會標註爲CS(Chip select)

在點對點的通信中,SPI接口不需要進行尋址操作,且爲全雙工通信,顯得簡單高效。在多個從器件的系統中,每個從器件需要獨立的使能信號,硬件上比I2C系統要稍微複雜一些。
SPI接口在內部硬件實際上是兩個簡單的移位寄存器,傳輸的數據爲8位,在主器件產生的從器件使能信號和移位脈衝下,按位傳輸,高位在前,低位在後。
優缺點

協議簡單,相對數據速率高。
佔用的Pin口較多
沒有指定的流控制,沒有應答機制確認是否接收到數據。

作者:梁睿坤
鏈接:https://www.jianshu.com/p/df2ed057b4a0
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章