諸如SPI、 I2C、USART等協議有什麼共同點和區別啊?什麼時候該用什麼?


前排幾位同學回答的都差不多,但都不夠準確,我簡單說下。

I2C、SPI、UART都是常見的低速板級通信協議,目前主流的SoC都內置了這些通訊協議的控制器,同樣,各種感測器、Touch控制器、指紋模塊、藍牙模塊、WIFI模塊也都兼容這三種通信方式的一種或幾種。

分別說下:

1. SPI是四根線,分別是CS(片選)、MOSI(主發從收)、MISO(從發主收)、CLK(時鐘),是一種同步傳輸協議。主機送出CLK信號,主機到從機的數據在MOSI線上傳輸,從機到主機的數據在MISO線上傳輸。在啟動傳輸之前,需要先拉低(一般是這樣,也有各別晶元是CS高有效)對應從機的CS管腳,在傳輸完成之後,再拉高CS管腳,從機的SPI Slave模塊進入休眠。

2. I2C是兩根線,SDA(數據)和SCL(時鐘),也是一種同步傳輸協議。主機在發送開始信號之後,先發送7個比特的地址位和1個比特的讀寫位,每個從機有自己的I2C地址,當發現該條指令是發給自己的時候,拉低SDA線(即回復ACK信號),然後主機發送或接收數據,完成傳輸。傳輸完成之後,主機發送停止位,完成該次傳輸。

3. UART一般由TXD、RXD、GND三根線組成,是一種非同步傳輸協議。無論是主機還是從機,均可以自由發送數據,但是由於UART匯流排並沒有時鐘線,所以需要提前約定對應的波特率,這是一種很簡單的傳輸協議。

說說異同點和使用場景吧。首先,I2C和SPI都是同步協議,都有時鐘信號,在一條匯流排上也都可以掛多個從設備,但是I2C的從設備是通過地址來區分的,SPI的從設備是通過片選線來區分的,所以SPI匯流排上,每多掛一個從設備,就要多用一個線作為片選線,而I2C則不用,只要地址不衝突,可以隨便掛設備。但是,I2C匯流排速度一般普遍慢於SPI,I2C一般的速度是100kbs、400kbps和1Mbps,而SPI的速度可以在幾Mbps,也可以10+Mbps。所以看使用場合,低速的話,I2C就挺合適的,如果速度快一些,則一般都要選用SPI。另外,I2C匯流排的管腳都是開漏輸出,必須外接上拉電阻,阻值可以根據匯流排速度來推算,一般我們常用400kbps傳輸速率,上拉電阻選用2.2K。

UART和SPI、I2C不同,他是非同步傳輸的,一般來說傳輸速度比較慢,傳統的傳輸速度一般在115200bps或以下,不過現在大部分UART控制器也能支持到4Mbps或者8Mbps了。UART目前最常用的就是調試介面,因為UART比較簡單,所以CPU輸出log一般都通過一個UART口來輸出。


1、i2c是雙線單工匯流排,由一條時鐘線scl和一條數據線sda實現, 加上從機的data ready(interrupt)線的話是3條線實現。好處是需要的io口少,壞處是單工收發慢。

2、spi是四線雙工匯流排,加上從機的data ready(interrupt)線的話是5條線實現。好處是雙工吞吐率大,壞處是線數較多。

3、以上兩種都是非對等主從匯流排,需要由主機發起數據讀寫時鐘。而uart是雙工對等匯流排,沒有主從之分。優劣在於:

a,非對等匯流排可以掛載多個設備,每個設備都能收發數據。對等匯流排由於沒有仲裁機制,所以只能掛載兩個同時收發數據的設備,或者一個發送設備與多個接收設備,又或者自己在應用層實現仲裁(不過這就失去uart的優勢和意義了)。

b,由於在非對等匯流排中必須由主機發起時鐘,數據發送比對等匯流排要複雜得多,特別是當你想實現一些比較複雜的通信協議時,幾乎只能使用同步邏輯來實現,這樣就造成cpu的運算速度被數據匯流排速度嚴重限制。而uart天生就是一個非同步匯流排,通過dma可以幾乎不佔用cpu時間。


對Tom Zhu的答案基本認同,但有一點需要澄清。

題主所問的「USART」嚴格來講是通用同步/非同步收發器(Universal synchronous/asynchronous receiver/transmitter),和Tom Zhu所說的UART 通用非同步收發是不一樣的。前者一般是指單片機的一個埠模塊,可以根據需要將其配置為同步模式(SPI, I2C),也可以將其配置為非同步模式,也就是後者UART。所以說UART姑且可以稱之為一個與SPI, I2C對等的「協議」,而USART則不是一個協議,而是更應該理解為一個物理實體。

UART和前兩者最大的區別在於前兩者是同步的,要有統一的時鐘線,而UART不需要,接線簡便。但收發雙方的設備都要配置相同的波特率等,這也就要求所有設備都要有自己的時鐘源。

I2C協議中是有地址規則的,因此在一對多通信的時候更有優勢。

SPI則是相對簡單的一種實現方式,編程非常簡單。在設備不多,埠充足,對通信速度要求不高的場合可以應用。


spii2c與uart有點區別。spi i2c 單匯流排等都是晶元與cpu的通信方式。因為cpu就那麼點管腳,所以不能每個晶元都單獨用一個管腳。所以就有匯流排的概念。生產晶元的廠商就定義了自己生產的晶元是什麼匯流排類型的,這樣就可以接到cpu上使用了。就好比cpu是會說英語和漢語的一個人,這樣有的人會說漢語,有的人會說英語。所以cpu可以能夠和說漢語和說英語的交流。當然只會說漢語的人是肯定聽不懂英語的一樣,這裡的漢語英語就是spi和i2c的協議。晶元生產廠家會規定生產的晶元是什麼協議的。大概就是這樣。至於想很明白怎麼回事,就一定要看datasheet了。


看了回答~概念很詳細咯~繼續追加補充下應用場景吧~這三類都是數據匯流排,iic和spi一般用於本處理器外掛的ic,通信速度spi高於iic(因為iic協議需要ack信號,而且本身時鐘頻率就低),uart常用於處理器與其他處理器進行通信。例如eeprom,nor flash,RTC等,很多同樣功能的ic,會有iic和spi兩種版本供選擇~uart只是標準通用全雙工非同步串口,外掛不同的電平轉換ic可以組建rs232 485等通信方式~如果想深入了解協議,可以用邏輯分析儀測量下信號,直觀很容易理解了


都是串列通信,微控制器支持什麼介面,晶元支持什麼介面就用什麼。


從機的data ready(interrupt) 這個是什麼意思啊,剛學習,求指點。


共同點是都可以和MCU進行通信,所謂通信無非就是發送(write)和接收(read).


推薦閱讀:

TAG:電力電子技術 | 電子技術 |