1. 程式人生 > >I2C、SPI、USRT、USRAT通訊方式對比

I2C、SPI、USRT、USRAT通訊方式對比

     在產品開發中經常會遇到一些通訊問題,平常經常會用到的I2C、SPI、USRT、USRAT通訊方式進行對比。一般通訊的速錄,距離、接線的問題,會對通訊方式的選擇有所影響。瞭解不同通訊模式的特點,便於開發中選擇合適的通訊方式。

一、I2C通訊協議。

  工作速率有低速100kbits、快速400kbits(常用的)和高速3.4Mbits(未曾使用過,只是聽聞)
    支援多機通訊;
    支援多主控模組,但同一時刻只允許有一個主控;      
    由資料線SDA和時鐘SCL構成的序列匯流排;
    每個電路和模組都有唯一的地址;                    
    每個器件可以使用獨立電源二

. 基本工作原理:
    以啟動訊號START來掌管匯流排,以停止訊號STOP來釋放匯流排;
    每次通訊以START開始,以STOP結束;
    啟動訊號START後緊接著傳送一個地址位元組,其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R. /W位為0表示由主控向被控器件寫資料,R/W為1表示由主控向被控器件讀資料;
    當被控器件檢測到收到的地址與自己的地址相同時,在第9個時鐘期間反饋應答訊號;
    每個資料位元組在傳送時都是高位(MSB)在前;

  寫通訊過程:
    1. 主控在檢測到匯流排空閒的狀況下,首先發送一個START訊號掌管匯流排;
    2. 傳送一個地址位元組(包括7位地址碼和一位R/W);
    3. 當被控器件檢測到主控傳送的地址與自己的地址相同時傳送一個應答訊號(ACK);
    4. 主控收到ACK後開始傳送第一個資料位元組;
    5. 被控器收到資料位元組後傳送一個ACK表示繼續傳送資料,傳送NACK表示傳送資料結束;
    6. 主控傳送完全部資料後,傳送一個停止位STOP,結束整個通訊並且釋放匯流排;

 讀通訊過程:
    1. 主控在檢測到匯流排空閒的狀況下,首先發送一個START訊號掌管匯流排;
    2. 傳送一個地址位元組(包括7位地址碼和一位R/W);
    3. 當被控器件檢測到主控傳送的地址與自己的地址相同時傳送一個應答訊號(ACK);
    4. 主控收到ACK後釋放資料匯流排,開始接收第一個資料位元組;
    5. 主控收到資料後傳送ACK表示繼續傳送資料,傳送NACK表示傳送資料結束;
    6. 主控傳送完全部資料後,傳送一個停止位STOP,結束整個通訊並且釋放匯流排;四. 匯流排訊號時序分析
    1. 匯流排空閒狀態
    SDA和SCL兩條訊號線都處於高電平,即總線上所有的器件都釋放匯流排,兩條訊號線各自的

上拉電阻把電平拉高;
    2. 啟動訊號START
    時鐘訊號SCL保持高電平,資料訊號SDA的電平被拉低(即負跳變)。啟動訊號必須是跳變訊號,而且在建立該訊號前必修保證匯流排處於空閒狀態;
    3. 停止訊號STOP
    時鐘訊號SCL保持高電平,資料線被釋放,使得SDA返回高電平(即正跳變),停止訊號也必須是跳變訊號。
    4. 資料傳送
    SCL線呈現高電平期間,SDA線上的電平必須保持穩定,低電平表示0(此時的線電壓為地電壓),高電平表示1(此時的電壓由元器件的VDD決定)。只有在SCL線為低電平期間,SDA上的電平允許變化。
    5. 應答訊號ACK
    I2C匯流排的資料都是以位元組(8位)的方式傳送的,傳送器件每傳送一個位元組之後,在時鐘的第9個脈衝期間釋放資料匯流排,由接收器傳送一個ACK(把資料匯流排的電平拉低)來表示資料成功接收。
    6. 無應答訊號NACK
    在時鐘的第9個脈衝期間傳送器釋放資料匯流排,接收器不拉低資料匯流排表示一個NACK,NACK有兩種用途:
    a. 一般表示接收器未成功接收資料位元組;
    b. 當接收器是主控器時,它收到最後一個位元組後,應傳送一個NACK訊號,以通知被控傳送器結束資料傳送,並釋放匯流排,以便主控接收器傳送一個停止訊號STOP。五. 定址約定
     I2C裝置地址:

  1.已經固化在晶片裡。

  2.晶片外部的引腳連線的,影響某幾位電平的高低,從而改變地址。

  例子:MPU9260內部I2C地址,在datasheet中截圖


   模擬I2C的通訊便是依據I2C的通訊時序,控制pin腳的高低電平輸出從而達到模擬時序的目的,實現I2C的通訊。在另一篇博文中將講解模擬I2C通訊的程式。

二、SPI通訊協議(使用後補充)
SPI的通訊原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的裝置共有的,它們是SDI(資料輸入)、SDO(資料輸出)、SCLK(時鐘)、CS(片選)。
(1)SDO – 主裝置資料輸出,從裝置資料輸入;
(2)SDI – 主裝置資料輸入,從裝置資料輸出;
(3)SCLK – 時鐘訊號,由主裝置產生;
(4)CS – 從裝置使能訊號,由主裝置控制。
其中,CS是控制晶片是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶片的操作才有效。這就允許在同一總線上連線多個SPI裝置成為可能。
接下來就負責通訊的3根線了。通訊是通過資料交換完成的,這裡先要知道SPI是序列通訊協議,也就是說資料是一位一位的傳輸的。這就是SCLK時鐘線存在的原因,由SCLK提供時鐘脈衝,SDI,SDO則基於此脈衝完成資料傳輸。資料輸出通過 SDO線,資料在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位資料傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘訊號的改變(上沿和下沿為一次),就可以完成8位資料的傳輸。
要注意的是,SCLK訊號線只由主裝置控制,從裝置不能控制訊號線。同樣,在一個基於SPI的裝置中,至少有一個主控裝置。這樣傳輸的特點:這樣的傳輸方式有一個優點,與普通的序列通訊不同,普通的序列通訊一次連續傳送至少8位資料,而SPI允許資料一位一位的傳送,甚至允許暫停,因為SCLK時鐘線由主控裝置控制,當沒有時鐘跳變時,從裝置不採集或傳送資料。也就是說,主裝置通過對SCLK時鐘線的控制可以完成對通訊的控制。SPI還是一個數據交換協議:因為SPI的資料輸入和輸出線獨立,所以允許同時完成資料的輸入和輸出。不同的SPI裝置的實現方式不盡相同,主要是資料改變和採集的時間不同,在時鐘訊號上沿或下沿採集有不同定義,具體請參考相關器件的文件。
最後,SPI介面的一個缺點:沒有指定的流控制,沒有應答機制確認是否接收到資料。
SPI的片選可以擴充選擇16個外設,這時PCS輸出=NPCS,說NPCS0~3接4-16譯碼器,這個譯碼器是需要外接4-16譯碼器,譯碼器的輸入為NPCS0~3,輸出用於16個外設的選擇。


三、UART通訊協議。

UART是一種通用序列資料匯流排,用於非同步通訊。該匯流排雙向通訊,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用來主機與輔助裝置通訊,如汽車音響與外接AP之間的通訊,與PC機通訊包括與監控偵錯程式和其它器件,如EEPROM通訊。
計算機內部採用並行資料,不能直接把資料發到Modem,必須經過UART整理才能進行非同步傳輸,其過程為:CPU先把準備寫入序列裝置的資料放到UART的暫存器(臨時記憶體塊)中,再通過FIFO(First Input First Output,先入先出佇列)傳送到序列裝置,若是沒有FIFO,資訊將變得雜亂無章,不可能傳送到Modem。
它是用於控制計算機與序列裝置的晶片。有一點要注意的是,它提供了RS-232C資料終端裝置介面,這樣計算機就可以和調變解調器或其它使用RS-232C介面的序列裝置通訊了。作為介面的一部分,UART還提供以下功能:將由計算機內部傳送過來的並行資料轉換為輸出的序列資料流。將計算機外部來的序列資料轉換為位元組,供計算機內部並行資料的器件使用。在輸出的序列資料流中加入奇偶校驗位,並對從外部接收的資料流進行奇偶校驗。在輸出資料流中加入啟停標記,並從接收資料流中刪除啟停標記。處理由鍵盤或滑鼠發出的中斷訊號(鍵盤和滑鼠也是序列裝置)。可以處理計算機與外部序列裝置的同步管理問題。有一些比較高檔的UART還提供輸入輸出資料的緩衝區,比較新的UART是16550,它可以在計算機需要處理資料前在其緩衝區記憶體儲16位元組資料,而通常的UART是8250。如果您購買一個內建的調變解調器,此調變解調器內部通常就會有16550 UART。
UART作為非同步串列埠通訊協議的一種,工作原理是將傳輸資料的每個字元一位接一位地傳輸。
其中各位的意義如下:
起始位:先發出一個邏輯"0"的訊號,表示傳輸字元的開始。
資料位:緊接著起始位之後。資料位的個數可以是4、5、6、7、8等,構成一個字元。通常採用ASCII碼。從最低位開始傳送,靠時鐘定位。
奇偶校驗位:資料位加上這一位後,使得"1"的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。
停止位:它是一個字元資料的結束標誌。可以是1位、1.5位、2位的高電平。 由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢。
空閒位:處於邏輯"1"狀態,表示當前線路上沒有資料傳送。
波特率:是衡量資料傳送速率的指標。表示每秒鐘傳送的符號數(symbol)。一個符號代表的資訊量(位元數)與符號的階數有關。例如資料傳送速率為120字元/秒,傳輸使用256階符號,每個符號代表8bit,則波特率就是120baud,位元率是120*8=960bit/s。這兩者的概念很容易搞錯。

一.USRAT (USART在UART基礎上增加了同步功能,即USART是UART的增強型USART相對UART的區別之一就是能提供主動時鐘

串列埠是計算機上一種非常通用的裝置通訊協議(不要與通用序列匯流排Universal SerialBus或者USB混淆)。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊介面;很多GPIB相容的裝置也帶有RS-232口。同時,串列埠通訊協議也可以用於獲取遠端採集裝置的資料。
串列埠通訊的概念非常簡單,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。它很簡單並且能夠實現遠距離通訊。比如IEEE488定義並行通行狀態時,規定裝置線總長不得超過20米,並且任意兩個裝置間的長度不得超過2米;而對於串列埠而言,長度可達1200米。
典型地,串列埠用於ASCII碼字元的傳輸。通訊使用3根線完成:(1)地線,(2)傳送,(3)接收。由於串列埠通訊是非同步的,埠能夠在一根線上傳送資料同時在另一根線上接收資料。其他線用於握手,但是不是必須的。串列埠通訊最重要的引數是位元率、資料位、停止位和奇偶校驗。對於兩個進行通訊的埠,這些引數必須匹配:
a,位元率:這是一個衡量通訊速度的引數。它表示每秒鐘傳送的bit的個數。例如300波特表示每秒鐘傳送300個bit。當我們提到時鐘週期時,就是指位元率,例如如果協議需要4800波特率,那麼時鐘是4800Hz。這意味著串列埠通訊在資料線上的取樣率為4800Hz。通常電話線的位元率為14400,28800和36600。位元率可以遠遠大於這些值,但是波特率和距離成反比。高位元率常常用於放置的很近的儀器間的通訊,典型的例子就是GPIB裝置的通訊。
b,資料位:這是衡量通訊中實際資料位的引數。當計算機發送一個資訊包,實際的資料不會是8位的,標準的值是5、7和8位。如何設定取決於你想傳送的資訊。比如,標準的ASCII碼是0~127(7位)。擴充套件的ASCII碼是0~255(8位)。如果資料使用簡單的文字(標準ASCII碼),那麼每個資料包使用7位資料。每個包是指一個位元組,包括開始/停止位,資料位和奇偶校驗位。由於實際資料位取決於通訊協議的選取,術語"包"指任何通訊的情況。
c,停止位:用於表示單個包的最後一位。典型的值為1,1.5和2位。由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢。
d,奇偶校驗位:在串列埠通訊中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串列埠會設定校驗位(資料位後面的一位),用一個值確保傳輸的資料有偶個或者奇個邏輯高位。例如,如果資料是011,那麼對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,校驗位為1,這樣就有3個邏輯高位。高位和低位不真正的檢查資料,簡單置位邏輯高或者邏輯低校驗。這樣使得接收裝置能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通訊或者是否傳輸和接收資料是否不同步。