標籤:負載能力 情況下 讀取 初始 選擇 快速 back 設計 3.4
做單片機開發時UART,SPI和I2C都是我們最經常使用到的硬體介面,我收集了相關的具體材料對這三種介面進行了詳細的解釋。
UART
UART是一種通用串列資料匯流排,用於非同步通訊。該匯流排雙向通訊,可以實現全雙工系統傳輸和接收。在嵌入式設計中,UART用於主機與輔助裝置通訊,如汽車音響與外接AP之間的通訊,與PC機通訊包括與監控調試器和其它器件,如EEPROM通訊。
將由電腦內部傳送過來的並行資料轉換為輸出的串列資料流。將電腦外部來的串列資料轉換為位元組,供電腦內部並行資料的器件使用。在輸出的串列資料流中加入同位位元,並對從外部接收的資料流進行同位。在輸出資料流中加入啟停標記,並從接收資料流中刪除啟停標記。處理由鍵盤或滑鼠發出的中斷訊號(鍵盤和滑鼠也是串列裝置)。可以處理電腦與外部串列裝置的同步管理問題。有一些比較高檔的UART還提供輸入輸出資料的緩衝區,比較新的UART是16550,它可以在電腦需要處理資料前在其緩衝區記憶體儲16位元組資料,而通常的UART是8250。
介面
在單片機中UART可以說是一種最基本的配置,很多與電腦進行通訊的裝置都採用到它,按電腦最常規的說法就是串列通訊。
兩個裝置間將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口較多
- 沒有指定的流量控制,沒有應答機制確認是否接收到資料。
UART、SPI和I2C詳解