Interfaces for Serial Communication

RS232 UART 的差別


RS232 序列埠

RS232 主要用在裝置之間的長距離傳輸,使用的電壓按標準來說如下所示
  • Logic 1
  • 傳送端 -5V ~ -15V / 接收端 -3V ~ -15V
  • Logic 0
  • 傳送端+5V ~ +15V / 接收端 +3V ~ +15V

RS232 有規範兩種接頭形狀,D-sub 9(簡稱DB-9)與D-sub 25(簡稱DB-25),對於pin腳也有定義。但是時間一久,除了PC有定義RS232要為公頭,而且自身的TX要在第3pin之外,其它產品簡直亂無章法,有些做公頭、有些作母頭,有些TX在pin2、有些在pin3,讓工程師們很困擾,所以才有2、3對調這種名詞出現。

UART 序列埠

UART(Universal Asynchronous Receiver/Transmitter)只是IC收發資料的對外管道,訊號的電壓最高就是chip自身的邏輯電壓,通常是5V或3.3V。

由於電壓低、速度慢,通常它用在裝置內部電路板的對外溝通,也就是debug的工作,這種資訊量通常很小。例如你想讓程式印出變數的值,通常會呼叫printf( )函式,這時字串就會從UART的TXD跑出來。


UART只是晶片內序列傳輸模組的通稱,第一個字母U的Universal表示是泛用型,你可以config它成為各種形式的序列埠,例如要不要parity check,bit rate要多少之類的。由於UART是通訊協定裡的Layer2,也就是Data Link Layer,它只定義傳送一個byte時,頭尾應該要有那些0與1護送,因此沒有定義接頭形狀,接頭的形狀與訊號準位則是定義在RS232,它是Layer1或說實體層Physical Layer。因此UART底層的實體要接哪種介面,完全看個人需求而定,你可以接RS232也可以直接導線對接。


另外有人會問,UART裡的非同步Asynchronous是甚麼意思? 不知您有無發現RS232/UART只用一條線來傳資料,所以它沒有額外的clock,沒有clock輔助資料取樣表示接收端即便知道發射端的bit rate,自身的資料取樣速度也無法完全與發射端相同,因此稱為非同步,它只能盡量跟對方速度一樣,畢竟是用自己的Clock來取樣;若是像I2C/SPI等傳輸介面是包含clock訊號的,取樣頻率就可以完全和對方相同,因為自身的取樣頻率可以鎖定在對方的clock上,就稱為同步傳輸

UART 與 RS232 的資料格式



  • Idle
  • 表示Serial port資料送完了,目前沒事做,等待下一筆資料中,UART level固定在H。
  • Start
  • 將狀態反相,是送資料前的準備動作,這樣接收端才知道後面有資料要送,UART level固定為L。
  • D0~D7
  • 送資料的順序是D0先送,D7最後送,所以在示波器顯示的波形是D0:D7,要判讀示波器上的資料前記得先在腦中反序變成D7:D0再來判讀,也別忘了RS232是負邏輯喔! 這個錯誤很多人都掉進去過。I2C就沒這個困擾,它是D7先送,所以波形從左到右可以很順的解讀。
  • Stop
  • 資料送完後,要變成Stop狀態。Stop bit很妙,我遇過Stop bit太短導致接收端會誤判,最短一個bit,最長其實可以很長,看你高興,通常有1bit、1.5bit、2bit的選項,個人建議隔開一點比較安全,倒不是硬體來不及收,而是可能你程式會來不及處理,尤其是在慢速的MCU上。 實際上Stop bit本身就可視為下個bit的idle狀態,因為兩個狀態一樣。邏輯上來說,你可以把Stop state經過2 bit之後才視為Idle,但實際上D7送完,接收器馬上就會standby要收下個byte了,除非你跟我一樣遇到兩光接收器,非得每個byte都間格一段時間,不然stop bit設定為1bit應該就可以了。

I²C

I²C(Inter-Integrated Circuit)是內部整合電路的稱呼,是一種串列通訊匯流排,它的設計並不能應用到長距離裝置的通訊。

I²C的參考設計使用一個7位元長度的位址空間但保留了16個位址,所以在一組匯流排最多可和112個節點通訊。



I2C 使用兩條雙向 open-drain Line:
  • SDA : Serial Data Line, holds Data or address signal
  • SCL : Serial Clock Line, holds Clock signal




留言

熱門文章