1. 程式人生 > >UART IIC SPI 解釋以及三者之間的關係

UART IIC SPI 解釋以及三者之間的關係

1、UART, SPI, IIC的詳解

UART、SPI、IIC是經常用到的幾個資料傳輸標準,下面分別總結一下:


UART(Universal Asynchronous Receive Transmitter):也就是我們經常所說的串列埠,基本都用於除錯。

主機和從機至少要接三根線,RX、TX和GND。TX用於傳送資料,RX用於接受資料(收發不是一根線,所以是全雙工方式)。注意A和B通訊A.TX要接B.RX,A.RX要接B.TX(A用TX發B當然要用RX來收了!)

如果A是PC機,B是微控制器,A和B之間還要接一塊電平轉換晶片,用於將TTL/CMOS(微控制器電平)轉換為RS232(PC機電平)。因為TTL/CMOS電平範圍是0~1.8/2.5/3.3/5V(不同微控制器範圍不同),高電壓表示1,低電壓表示0。而RS232邏輯電平範圍-12V~12V,-5~-12表示高電平,+5~+12V表示低電平(對!你沒有聽錯)。為什麼這麼設定?這就要追溯到調變解調器出生時代了,有興趣自己去查資料!


資料協議:以PC機A給微控制器B發資料為例(1為高電平,0為低電平):A.TX to B.RX。剛開始B.RX的埠保持1,當A.TX發來一個0作為起始位告訴B我要發資料了!然後就開始發資料,發多少呢?通常一次是5位、6位、7位、8位,這個雙方事先要用軟體設定好。PC機一般會用串列埠助手設定,微控制器會在uart的驅動中設定。一小幀資料傳送完了以後,A.TX給個高電平告訴B.RX我發完了一幀。如果還有資料,就再給個0然後重複上一步。如果雙方約定由校驗位,還要在發停止位1之前傳送個校驗位,不過現在一般都不需要校驗位了,因為出錯的概率太小了,而且一般用於除錯。

一般在串列埠助手上還有個RTS/CTS流控選項,也叫握手,我從來沒用過。搬一段我能理解的介紹:RTS(請求傳送),CTS(清除傳送)。如果要用這兩個功能,那就至少要接5根線:RX+TX+GND+RTS+CTS。當A要傳送資料時,置RTS有效(可能是置1),告訴B我要傳送資料了。當B準備好接受資料後,置CTS有效,告訴A你可以發了。然後他們就實現了兩次握手!挺耽誤時間是不是?這個RTS還可以當電源使用,如果你不用它的握手功能,且電源電流在50mA以下時,就可以把它置為高電平可以當電源用喔~!



SPI(Serial Peripheral Interface, 同步外設介面)是由摩托羅拉公司開發的全雙工同步序列匯流排,該匯流排大量用在與EEPROM、ADC、FRAM和顯示驅動器之類的慢速外設器件通訊。

SPI是一種串行同步通訊協議,由一個主裝置和一個或多個從裝置組成,主裝置啟動一個與從裝置的同步通訊,從而完成資料的交換。SPI 介面由SDI(序列資料輸入),SDO(序列資料輸出),SCK(序列移位時鐘),CS(從使能訊號)四種訊號構成,CS 決定了唯一的與主裝置通訊的從裝置,片選訊號低電平有效。如沒有CS 訊號,則只能存在一個從裝置,主裝置通過產生移位時鐘來發起通訊。通訊時,資料由SDO 輸出,SDI 輸入,資料在時鐘的上升或下降沿由SDO 輸出,在緊接著的下降或上升沿由SDI 讀入,這樣經過8/16 次時鐘的改變,完成8/16 位資料的傳輸。

IIC(Inter Integrated Circuit):兩根線:一個時鐘線SCL和一個數據線SDA。只有一根資料線,所以是半雙工通訊。接線不難,而且兩根線上也可以掛很多裝置(每個裝置的IIC地址不同),資料協議比較麻煩:

還是假設A給B發資料(這裡A.SCL接B.SCL, A.SDA接B.SDA)。起初SDA和SCL上的電平都為高電平。然後A先把SDA拉低,等SDA變為低電平後再把SCL拉低(以上兩個動作構成了iic的起始位),此時SDA就可以傳送資料了,與此同時,SCL傳送一定週期的脈衝(週期和PCLK有關,一般會在IIC的控制暫存器中設定)。SDA傳送資料和SCL傳送脈衝的要符合的關係是:SDA必須在SCL是高電平是保持有效,在SCL是低電平時傳送下一位(SCL會在上升沿對SDA進行取樣)。規定一次必須傳8位資料,8位資料傳輸結束後A釋放SDA,但SCL再發一個脈衝(這是第九個脈衝),這會觸發B通過將SDA置為低電平表示確認(該低電平稱為ACK)。最後SCL先變為高電平,SDA再變為高電平(以上兩個動作稱為結束標誌)如果B沒有將SDA置為0,則A停止傳送下一幀資料。IIC匯流排(即SDA和SCL)上的每個裝置都有唯一地址,資料包傳輸時先發送地址位,接著才是資料。一個地址位元組由7個地址位(可以掛128個裝置)和1個指示位組成(7位定址模式)。指示位是0表示寫,1表示讀。還有10位定址模式,使用兩個位元組來儲存地址,第一個位元組的最低兩位和第二個位元組的8位合起來構成10位地址。


在I2C匯流排的應用中應注意的事項總結為以下幾點 : 
1) 嚴格按照時序圖的要求進行操作, 
2) 若與口線上帶內部上拉電阻的微控制器介面連線,可以不外加上拉電阻。 
3) 程式中為配合相應的傳輸速率,在對口線操作的指令後可用NOP指令加一定的延時。 
4) 為了減少意外的干擾訊號將EEPROM內的資料改寫可用外部防寫引腳(如果有),或者在EEPROM內部沒有用的空間寫入標誌字,每次上電時或復位時做一次檢測,判斷EEPROM是否被意外改寫。

關於IIC匯流排的操作注意事項

1、對IIC匯流排的一次操作完之後,需要等待一段時間才能進行第二次操作。否則是啟動不了匯流排的:)
2、在時鐘線(SCL)為高電平的時候,一定不能動資料線(SDA)狀態,除非是啟動或者結束匯流排

2、UART, SPI, IIC的區別與聯絡:

第一個區別當然是名字:

UART(Universal Asynchronous Receiver Transmitter:通用非同步收發器)
SPI(Serial Peripheral Interface:序列外設介面);
I2C(INTER IC BUS)


第二,區別在電氣訊號線上:


SPI匯流排由三條訊號線組成:序列時鐘(SCLK)、序列資料輸出(SDO)、序列資料輸入(SDI)。SPI匯流排可以實現 多個SPI裝置互相連線。提供SPI序列時鐘的SPI裝置為SPI主機或主裝置(Master),其他裝置為SPI從機或從裝置(Slave)。主從裝置間可以實現全雙工通訊,當有多個從裝置時,還可以增加一條從裝置選擇線。
如果用通用IO口模擬SPI匯流排,必須要有一個輸出口(SDO),一個輸入口(SDI),另一個口則視實現的裝置型別而定,如果要實現主從裝置,則需輸入輸出口,若只實現主裝置,則需輸出口即可,若只實現從裝置,則只需輸入口即可。

I2C匯流排是雙向、兩線(SCL、SDA)、序列、多主控(multi-master)介面標準,具有匯流排仲裁機制,非常適合在器件之間進行近距離、非經常性的資料通訊。在它的協議體系中,傳輸資料時都會帶上目的裝置的裝置地址,因此可以實現裝置組網。
如果用通用IO口模擬I2C匯流排,並實現雙向傳輸,則需一個輸入輸出口(SDA),另外還需一個輸出口(SCL)。(注:I2C資料瞭解得比較少,這裡的描述可能很不完備)

UART匯流排是非同步串列埠,因此一般比前兩種同步串列埠的結構要複雜很多,一般由波特率產生器(產生的波特率等於傳輸波特率的16倍)、UART接收器、UART傳送器組成,硬體上由兩根線,一根用於傳送,一根用於接收。
顯然,如果用通用IO口模擬UART匯流排,則需一個輸入口,一個輸出口。

第三,從第二點明顯可以看出,SPI和UART可以實現全雙工,但I2C不行;

第四,看看牛人們的意見吧!


wudanyu:I2C線更少,我覺得比UART、SPI更為強大,但是技術上也更加麻煩些,因為I2C需要有雙向IO的支援,而且使用上拉電阻,我覺得抗干擾能力較弱,一般用於同一板卡上晶片之間的通訊,較少用於遠距離通訊。SPI實現要簡單一些,UART需要固定的波特率,就是說兩位資料的間隔要相等,而SPI則無所謂,因為它是有時鐘的協議。
quickmouse:I2C的速度比SPI慢一點,協議比SPI複雜一點,但是連線也比標準的SPI要少。

UART一幀可以傳5/6/7/8位,IIC必須是8位。IIC和SPI都從最高位開始傳。

SPI用片選訊號選擇從機,IIC用地址選擇從機。