# 常用的協定

# UART

常見的UART有RS-232、RS-485 優點: 只使用兩根電線 不需要時鐘信號 有一個奇偶校驗位 只要雙方設置後,就可以改變數據包的結構 有完整的文檔並且具有廣泛的使用

缺點: 裝置之間只能一對一傳輸(如下圖),速度不快,不適合用在需要大量傳輸的時候。 數據幀的大小限制為最多9位 不支持多個從屬或多個主系統 每個UART的波特率必須在10%之內

通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART。它將要傳輸的資料在串行通信與並行通信之間加以轉換。作為把並行輸入信號轉成串行輸出信號的晶片,UART通常被集成於其他通訊接口的連結上。 它不是像SPI和I2C這樣的通信協議,而是微控制器中獨立的物理電路或獨立的IC。 UART最好的一點是它只使用兩根線就可以在設備之間傳輸數據,UART背後的原理很容易理解。

# UART通信簡介

在UART通信中,兩個UART直接相互通信。發送UART將來自CPU等控制設備的並行數據轉換為串行形式,並將其串行發送到接收UART,接收UART然後將串行數據轉換回接收設備的並行數據。在兩個UART之間傳輸數據只需要兩根線。數據從發送UART的Tx引腳流向接收UART的Rx引腳:

UART以異步方式發送數據,這意味著沒有時鐘信號將發送UART的位輸出與接收UART的位採樣同步。發送UART不是時鐘信號,而是將開始和停止位添加到正在傳輸的數據包中。這些位定義數據包的開始和結束,因此接收UART知道何時開始讀取位。 當接收UART檢測到起始位時,它開始以稱為波特率的特定頻率讀取輸入位。波特率是數據傳輸速度的度量,以每秒位數(bps)表示。兩個UART必須以大致相同的波特率運行。發送和接收UART之間的波特率只能相差10%左右。 兩個UART還必須配置為發送和接收相同的數據包結構。

# UART如何工作

UART傳輸數據依靠的是UART總線,數據總線用於通過CPU,存儲器或微控制器等其他設備將數據發送到UART。數據以並行形式從數據總線傳輸到發送UART。在發送UART從數據總線獲得並行數據之後,它將添加起始位,奇偶校驗位和停止位,從而創建數據包。接下來,數據包在Tx引腳上逐位串行輸出。UART接收端則在其Rx引腳上逐位讀取數據包。然後,接收UART將數據轉換回並行形式,並刪除起始位,奇偶校驗位和停止位。最後,接收UART將數據包並行傳輸到接收端的數據總線:

UART傳輸的數據被組織成數據包。每個數據包包含1個起始位,5到9個數據位(取決於UART),可選的奇偶校驗位以及1或2個停止位:

# 開始位

當UART數據傳輸線不傳輸數據時,它通常保持在高電壓電平。為了開始數據傳輸,發送UART將傳輸線從高電平拉至低電平一個時鐘周期。當接收UART檢測到高電壓到低電壓轉換時,它開始以波特率的頻率讀取數據幀中的位。

# 數據框

數據框包含要傳輸的實際數據。如果使用奇偶校驗位,則它可以是5位到8位長。如果不使用奇偶校驗位,則數據幀可以是9位長。在大多數情況下,數據首先以最低有效位發送。

# 奇偶校驗位

奇偶校驗描述數字的均勻性或奇數。奇偶校驗位是接收UART在傳輸過程中判斷是否有任何數據發生變化的一種方法。電磁輻射、不匹配的波特率或長距離傳輸時,數據都有可能發生變化。接收UART讀取數據幀後,它會計算值為1的位數,並檢查總數是偶數還是奇數。如果奇偶校驗位為0(偶校驗),則數據幀中的1位應總計為偶數。如果奇偶校驗位是1(奇校驗),則數據幀中的1位應總計為奇數。當奇偶校驗位與數據匹配時,UART知道傳輸沒有錯誤。但如果奇偶校驗位為0,然而1位應總計為奇數;或者奇偶校驗位是1,並且1位應總計是偶數,則數據幀中的位已經改變。

# 停止位

為了通知傳輸數據包的結束,UART發送端會將數據傳輸線從低電壓驅動至高電壓至少兩位持續時間。

# I2C

I2C(Inter-Integrated Circuit),唸做I-square-C,最初是為了晶片間的傳輸而設計。

它是NXP(前身為飛利浦)開發的通訊協定,主要用來做為IC之間的通訊。它的速度一般是100Kbit/s,有些是400Kbit/s,現在更有到1M bit/s與3.4Mbit/s,因此無法像Ethernet那麼快,所以不適合傳送大量資料。但是它又比RS232快速,所以它非常適合拿來設定IC初始值,或是IC之間的控制訊號傳輸。由於I2C只用兩條線通訊SDA(data)/SCL(clock),因此空間超級省。 I2C是序列式的傳輸,只用兩條線,一個叫做SDA專門用來送資料,另一個叫做SCL是用來傳clock。資料格式如下圖,依序是由start condition所開始,然後開始傳資料,最後stop condition結束。所謂start condition就是這兩條線的某種狀態的組合可以拿來認定傳輸的開始。

# 優點:

I2C與UART的RS-232線路一樣只需兩條,資料線(SDA, Serial Data Line)及時脈線 (SCL, Serial Clock Line),特別的是,I2C可以同時連接多個裝置(如下圖),通常傳輸速度也比UART的RS-232快。

# 缺點:

I2C的兩條線路一條是資料線,另一條是時脈線,RS-232是兩條都是資料線,因此,I2C在接收數據時無法發送,反之發送時無法接收,但UART/RS-232則無此問題。

上圖最左邊是Start condition: SCL=high + SDA falling

上圖最右邊是Stop condition: SCL=high + SDA raising

至於中間的資料,它是以8+1bit為一組來傳送的,意思是說8bit data外加1bit的Acknowledge,ACK是slave用來回應master用的,表示已經收到資料了。clock的positive pulse必須完整包含在bit data之內。

# SPI

常用來連接EEPROM記憶體、Flash記憶體

# 優點:

可以同時連接多個裝置(如下圖),且發送與接收可同時進行, 可說改善了UART-RS232與I2C的缺點,傳輸速度高於I2C。

# 缺點:

連接裝置數的增加,線路也是要增加,如N台裝置連接, 就需即N+3條線路,且多半是用於短距離傳輸。

是Motorola首先在其MC68HCXX系列處理器上定義的。SPI介面主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字訊號處理器和數字訊號解碼器之間。SPI,是一種高速的,全雙工,同步的序列通訊匯流排,,在主器件的移位脈衝下,資料按位傳輸,高位在前,低位在後. 並且在晶片的管腳上只佔用四根線,節約了晶片的管腳,同時為PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的晶片整合了這種通訊協議,比如AT91RM9200。

SPI的通訊原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的裝置共有的,它們是SDI(資料輸入),SDO(資料輸出),SCK(時鐘),CS(片選)。

  • SDO - 主裝置資料輸出,從裝置資料輸入
  • SDI - 主裝置資料輸入,從裝置資料輸出
  • SCLK - 時鐘訊號,由主裝置產生
  • CS - 從裝置使能訊號,由主裝置控制

CS:其中CS是控制晶片是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶片的操作才有效,這就允許在同一匯流排上連線多個SPI裝置成為可能。

SDI/SDO/SCLK:通訊是通過資料交換完成的,這裡先要知道SPI是序列通訊協議,也就是說資料是一位一位的傳輸的。這就是SCK時鐘線存在的原因,由SCK提供時鐘脈衝,SDI,SDO則基於此脈衝完成資料傳輸。資料輸出通過 SDO線,資料在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位資料傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘訊號的改變(上沿和下沿為一次),就可以完成8位資料的傳輸。

要注意的是,SCK訊號線只由主裝置控制,從裝置不能控制訊號線。同樣,在一個基於SPI的裝置中,至少有一個主控裝置。這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的序列通訊不同,普通的序列通訊一次連續傳送至少8位資料,而SPI允許資料一位一位的傳送,甚至允許暫停,因為SCK時鐘線由主控裝置控制,當沒有時鐘跳變時,從裝置不採集或傳送資料,也就是說,主裝置通過對SCK時鐘線的控制可以完成對通訊的控制。SPI還是一個資料交換協議:因為SPI的資料輸入和輸出線獨立,所以允許同時完成資料的輸入和輸出。不同的SPI裝置的實現方式不盡相同,主要是資料改變和採集的時間不同,在時鐘訊號上沿或下沿採集有不同定義,具體請參考相關器件的文件。

在點對點的通訊中,SPI介面不需要進行定址操作,且為全雙工通訊,顯得簡單高效。在多個從裝置的系統中,每個從裝置需要獨立的使能訊號,硬體上比I2C系統要稍微複雜一些。

參考:

https://www.strongpilab.com/i2c-introduction/ https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/395419/