作者:陸向陽
對專業電子工程人員而言,UART、I2C、SPI等介面及介面的差別,是可以講到非常細節的,包含邏輯信號的準位、傳輸協定中的封包格式等。
然而對不是電子工程背景的創客、自造者(Maker)而言,這些介面就比較陌生了,然而這些介面又不得不去面對,因為Arduino、Raspberry Pi開發板就有這些介面。
以Arduino而言,最原初的Arduino就有UART,而演化不久後也加添了I2C,現在無論Arduino家族開發板如何演化,多會具備UART與I2C。
而RPi方面則是從2012年最原初的RPi開始,就同時具備這三種介面,事實上Arduino開發板所用的微控制器晶片,其本身也是具備SPI介面功能的,只是Arduino將此功能掩蓋、關閉而已。
至於其他開發板,如BeagleBone、96Boards等,也都必然具備這三種介面,更簡單說,幾乎多數開發板都會具備這三種介面。如果刻意不理會、不使用這三種介面,而用一般數位輸出入接腳來實現相同功能,通常是事倍功半的,甚至根本做不到。
既然一定要認識、了解與運用,是否可以先跳略過太專業的電子電機層面,從幾個大特性來了解這三種介面?本文其實就是從這個角度切入,盡可能讓一般人都了解這三種介面的差異,以及在何時該用哪種介面。
1. UART
嚴格而論UART不是個具體的介面,此介面只提供一個雛形基礎,以此基礎再加搭電路與軟體,才可以實現不同的介面,如RS-232、RS-422、RS-485等。
不過就Maker運用而言幾乎是用來實現RS-232介面,而RS-232介面只允許兩個裝置直接對接,無法接更多裝置(若為RS-422、RS-485則可接多個裝置)。
用UART/RS-232來連接,通常是接另一個Arduino,或者是讓Arduino與電腦連接,過去老舊的電腦是具備RS-232介面(在電腦領域稱為串列埠,Serial Port)的,可以直接接Arduino,但近10年的電腦都只具備USB,已經沒有RS-232了,因此通常還要透過一個UART轉USB的轉接電路,才能讓Arduino與電腦連接。
UART/RS-232好處是線路簡單,僅兩條線路,但缺點是只能一對一連接,以及速度不是很快,一般而言最高為115.2kbps,雖有更高速版本但不太普及,不適合用在高速、大量傳輸上。
2. I2C
I2C與UART/RS-232一樣是兩條線路,也是有線路簡單的好處,最早是PHILIPS(今日的NXP)提出來,用在晶片間的聯繫傳輸之用。I2C可以同時連接多個裝置,不似前述的RS-232僅能一對一,理論上I2C可以連接128個裝置,甚至有更多數目的封包格式定義,但實務上無法接那麼多,但接10個上下多無大礙。
無論接幾個裝置,I2C都只用兩條線,這是I2C介面的優點,另一優點是一般而言傳輸速度比UART/RS-232快,最初版本為100kbps,但之後就升級到400kbps,後續甚至到5Mbps,但與UART/RS-232類似的,更快速的版本不太普及,然同樣以普及性版本而言,I2C仍是快一些。
I2C有其優點,但也有一些缺點,首先它本來是設計給晶片間溝通用的,原則上只能走在電路板上,以印刷電路板(PCB)上的銅箔線路來走,不是走電線纜線的,但目前許多應用卻是把I2C纜線化。
也因為最原初是走銅箔線路,所以一般來說I2C長度不超過30公分(即一片印刷電路板的面積內走繞)。而UART/RS-232通常有再寬裕一點的連接長度(若依據RS-232最原始標準,使用正負12V電壓傳輸,傳輸距離是可以上km的)。
另外I2C的兩條線路只有一條是數據傳輸線,另一條是時脈線路,但UART/RS-232是兩條都是傳輸線,I2C在接收數據時無法發送,反之發送時無法接收,但UART/RS-232則無此問題。
SPI
SPI(由Motorola發明,即是之後的Freescale,之後NXP購併Freescale)與I2C相同是可以接多個裝置的,而且傳輸速度比I2C更快(事實上SD記憶卡的根基就是這個介面),而且與UART/RS-232一樣,發送與接收可同時進行。
不過SPI也有缺點,一是隨著連接裝置數的增加,線路也是要增加的,每增加一個連接裝置,至少要增加一條,不像I2C可以一直維持只要兩條。而SPI在一對一連接時需要四條,一對二時要五條,一對三時要六條,即N+3的概念。另外SPI比I2C更少纜線化運用,多半是更短距離的連接。在實務上,I2C較常用來連接感測器,而SPI較常用來連接EEPROM記憶體、Flash記憶體(記憶卡),或一些液晶顯示器。
透過以上的說明,相信各位比較了解三種介面的特性,此將有助後續創作發想時,用更切合需求的介面來實現創作。
- 創客積木M5Stack加入LLM戰局 - 2024/11/29
- MLPerf大語言模型、生成式AI測項觀察 - 2024/11/27
- Sony強力加持!樹莓派發表專屬AI攝影機 - 2024/10/28
2017/11/01
RS232的規格 傳輸距離應該是15m頂多到50m左右
要更遠要轉成RS422(半雙工) 大概可以到500m
或是RS485(全雙工)才能到KM級別
超過1KM可能還需要特殊IC來處理訊號
2017/11/06
您好,我們是MakerPRO編輯部,我們會再把您的回覆轉給作者,謝謝您:)
2018/03/28
沒錯,要公里等級的話應該要485才有能力達到。
2016/07/18
要用Arduino連接很多SPI設備,能不能用其他的數位腳當每個設備的SS?
2016/08/07
可以的,只要軟體程式有跟著搭配,沒問題。
2016/07/12
“過去老舊的電腦是具備RS-232介面(在電腦領域稱為串列埠,Serial Port)的,可以直接接Arduino” 這個可能要稍微再說明一下。電腦的RS-232介面是12V的,Arduino的Uart(Arduino 上標示TX / RX 的腳位) 是5V的,直接接是有機會燒掉Arduino,一般會透過Max232之類的IC來或透過電路處裡不同準位(12V /5V)的問題,可參考下面連結。
下面連結這個版本的Arduino在RS-232介面的部分(ArduinoSeverinoSchematic.png中的X1這個元件)有透過電路處裡不同準位,所以可以接電腦的RS-232
https://www.arduino.cc/en/Main/ArduinoBoardSerialSingleSided3
https://www.arduino.cc/en/uploads/Main/ArduinoSeverinoSchematic.png
2016/08/07
是的,電壓位準是不同的,正規RS-232使用+12V、-12V來運作,也因為這樣才能有上km的傳輸距離。
一般要把RS-232連接到MCU的UART,透過MAX的晶片,其實是做Charge Bump的動作,把5V轉換成倍壓,變成+10V、-10V,算是合乎RS-232準位,以此達到相通。