常见的通讯协议总结(USART、IIC、SPI、485、CAN)
目錄
- 一、通訊的基本概念
- 1、串行通訊
- 2、并行通訊
- 3、串行通訊與并行通訊對比
- 4、傳輸模式(單工、半雙工、全雙工)
- 二、USART—串口通訊
- 1、物理層
- 2、協議層
- (1)波特率
- (2)起始和停止信號
- (3)有效數據
- (4)數據校驗
- 2、異步串行通信的數據接收過程
- 3、USART與UART
- 二、IIC通訊
- 1、物理層
- 2、協議層
- (1)通訊的起始和停止信號
- (2)數據有效性
- (2)地址及數據方向
- (3)響應信號
- 3、I2C 基本讀寫過程
- 三、SPI通訊
- 1、SPI 物理層
- 2、協議層
- (1)通訊的起始和停止信號
- (2)數據有效性
- (3)CPOL/CPHA 及通訊模式
- 四、RS-485 通訊
- 1、物理層
- 四、CAN—通訊
- 1、CAN 物理層
- (1)閉環總線網絡
- (2)開環總線網絡
- (3)通訊節點
- (4)差分信號
- 2、未完待續……
- 五、參考文獻
一、通訊的基本概念
計算機通信是指將計算機技術和通信技術相結合,完成計算機與外部設備或計算機與計算機之間的信息交換。按照數據傳輸方式的不同,可以分為串行通信和并行通信兩類。
1、串行通訊
特點: 數據逐位傳輸,傳輸線少,長距離傳輸時成本低,但數據的傳輸控制較復雜。按照實現數據同步的方式,可以分為同步串行和異步串行兩種。
2、并行通訊
特點: 多位數據同時傳輸,傳輸控制簡單,傳輸速度快,但是在長距離傳輸時硬件成本較高。
3、串行通訊與并行通訊對比
4、傳輸模式(單工、半雙工、全雙工)
二、USART—串口通訊
串口(全雙工)通訊(Serial Communication)是一種設備間非常常用的串行通訊方式,因為它簡單便捷,大部分電子設備都支持該通訊方式,電子工程師在調試設備時也經常使用該通訊方式輸出調試信息。
1、物理層
根據通訊使用的電平標準不同,串口通訊可分為 TTL 標準及 RS-232 標準。
在目前的工業控制使用的串口通訊中,一般使用 RXD、 TXD 以及 GND 三條信號線,直接傳輸數據信號。
2、協議層
串口通訊的數據包由發送設備通過自身的 TXD 接口傳輸到接收設備的 RXD 接口。在串口通訊的協議層中,規定了數據包的內容,它由啟始位、主體數據、校驗位以及停止位組成。
(1)波特率
串口異步通訊中由于沒有時鐘信號,所以兩個通訊設備之間需要約定好波特率,即每個碼元的長度,以便對信號進行解碼。
波特率是指每秒鐘傳送二進制數碼的位數,以bit/s(bps)為單位。
? 常用的波特率有: 9600、 19200、 38400、 57600和115200;
? 波特率為115200, 表示每秒傳輸115200位,且每一位數據在數
據線上持續時間為Tbit = 1/115200 ≈ 8.68us。
(2)起始和停止信號
串口通訊的一個數據包從起始信號開始,直到停止信號結束。數據包的起始信號由一個邏輯 0 的數據位表示,而數據包的停止信號可由 0.5、 1、 1.5 或 2 個邏輯 1 的數據位表示,只要雙方約定一致即可。
(3)有效數據
在數據包的起始位之后緊接著的就是要傳輸的主體數據內容,也稱為有效數據,有效數據的長度常被約定為 5、 6、 7 或 8 位長。
(4)數據校驗
在有效數據之后,有一個可選的數據校驗位。由于數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、 0 校驗(space)、 1 校驗(mark)以及無校驗(noparity)。
2、異步串行通信的數據接收過程
接收過程的本質是數據采集,假設接收端的采樣時鐘是波特率的16倍。
① 接收過程由起始位的下降沿啟動;
② 接收端等待8個時鐘周期,以便建立一個接近比特周期中間的采樣點;
③ 接收端等待16個時鐘周期,使其進入第一個數據位周期的中點;
④ 第一個數據位被采樣并存儲在接收寄存器中;
⑤ 串口模塊在采樣第二個數據位之前等待另外16個時鐘周期;
⑥ 重復此過程, 直到所有數據位都被采樣和存儲;
⑦ 由停止位的上升沿使數據線返回到空閑狀態。
3、USART與UART
STM32 芯片具有多個 USART 外設用于串口通訊,它是 Universal Synchronous Asynchronous Receiver and Transmitter 的縮寫,即通用同步異步收發器可以靈活地與外部設備進行全雙工數據交換。有別于 USART,它還有具有 UART 外設(Universal Asynchronous Receiver and Transmitter),它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。
USART 在 STM32 應用最多莫過于“打印”程序信息,一般在硬件設計時都會預留一個 USART 通信接口連接電腦,用于在調試程序是可以把一些調試信息“打印”在電腦端的串口調試助手工具上,從而了解程序運行是否正確、指出運行出錯位置等等。
二、IIC通訊
I2C(同步半雙工)通訊協議(Inter-Integrated Circuit)是由 Phiilps(飛利浦) 公司開發的,由于它引腳少,硬件實現簡單,可擴展性強,不需要 USART、 CAN 等通訊協議的外部收發設備,現在被廣泛地使用在系統內多個集成電路(IC)間的通訊。
1、物理層
I2C 通訊設備之間的常用連接方式如下圖所示
它的物理層有如下特點:
(1) 它是一個支持多設備的總線。“總線”指多個設備共用的信號線。在一個 I2C 通訊總線中,可連接多個 I2C 通訊設備,支持多個通訊主機及多個通訊從機。
(2) 一個 I2C 總線只使用兩條總線線路,一條雙向串行數據線(SDA) ,一條串行時鐘線(SCL)。數據線即用來表示數據,時鐘線用于數據收發同步。
(3) 每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備之間的訪問。
(4) 總線通過上拉電阻接到電源。當 I2C 設備空閑時,會輸出高阻態,而當所有設備都空閑,都輸出高阻態時,由上拉電阻把總線拉成高電平。
(5) 多個主機同時使用總線時,為了防止數據沖突,會利用仲裁方式決定由哪個設備占用總線。
(6) 具有三種傳輸模式:標準模式傳輸速率為 100kbit/s ,快速模式400kbit/s ,高速模式下可達 1Mbit/s,但目前大多 I2C 設備尚不支持高速模式。
(7) 連接到相同總線的 IC 數量受到總線的最大電容 400pF 限制 。
2、協議層
I2C 總線在傳送數據過程中共有三種類型信號, 它們分別是:起始信號、停止信號和應答信號。
(1)通訊的起始和停止信號
起始信號: SCL 為高電平時, SDA 由高電平向低電平跳變,開始傳送數據。
//軟件模擬 IIC 起始信號 void IIC_Start(void) { SDA_OUT(); //sda 線輸出 IIC_SDA=1; IIC_SCL=1; delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL=0;//鉗住 I2C 總線,準備發送或接收數據 }停止信號: SCL 為高電平時, SDA 由低電平向高電平跳變,結束傳送數據。
//產生 IIC 停止信號 void IIC_Stop(void) { SDA_OUT();//sda 線輸出 IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1;//發送 I2C 總線結束信號 delay_us(4); }(2)數據有效性
I2C 使用 SDA 信號線來傳輸數據,使用 SCL 信號線進行數據同步。見圖 23-6。 SDA數據線在 SCL 的每個時鐘周期傳輸一位數據。傳輸時, SCL 為高電平的時候 SDA 表示的數據有效,即此時的 SDA 為高電平時表示數據“1”,為低電平時表示數據“0”。當 SCL為低電平時, SDA 的數據無效,一般在這個時候 SDA 進行電平切換,為下一次表示數據做好準備。
每次數據傳輸都以字節為單位,每次傳輸的字節數不受限制。
(2)地址及數據方向
I2C 總線上的每個設備都有自己的獨立地址,主機發起通訊時,通過 SDA 信號線發送設備地(SLAVE_ADDRESS)來查找從機。 I2C 協議規定設備地址可以是 7 位或 10 位,實際中 7 位的地址應用比較廣泛。緊跟設備地址的一個數據位用來表示數據傳輸方向,它是數據方向位(R/W),第 8 位或第 11 位。數據方向位為“1”時表示主機由從機讀數據,該位為“0”時表示主機向從機寫數據。
讀數據方向時,主機會釋放對 SDA 信號線的控制,由從機控制 SDA 信號線,主機接收信號,寫數據方向時, SDA 由主機控制,從機接收信號。
(3)響應信號
I2C 的數據和地址傳輸都帶響應。響應包括“應答(ACK)”和“非應答(NACK)”兩種信號。作為數據接收端時,當設備(無論主從機)接收到 I2C 傳輸的一個字節數據或地址后,若希望對方繼續發送數據,則需要向對方發送“應答(ACK)”信號,發送方會繼續發送下一個數據;若接收端希望結束數據傳輸,則向對方發送“非應答(NACK)”信號,發送方接收到該信號后會產生一個停止信號,結束信號傳輸。
傳輸時主機產生時鐘,在第 9 個時鐘時,數據發送端會釋放 SDA 的控制權,由數據接收端控制 SDA,若 SDA 為高電平,表示非應答信號(NACK),低電平表示應答信號(ACK)。
3、I2C 基本讀寫過程
除了基本的讀寫, I2C 通訊更常用的是復合格式,即第三幅圖的情況,該傳輸過程有兩次起始信號(S)。一般在第一次傳輸中,主機通過 SLAVE_ADDRESS 尋找到從設備后,發送一段“數據”,這段數據通常用于表示從設備內部的寄存器或存儲器地址(注意區分它與 SLAVE_ADDRESS 的區別);在第二次的傳輸中,對該地址的內容進行讀或寫。也就是說,第一次通訊是告訴從機讀寫地址,第二次則是讀寫的實際內容。
三、SPI通訊
SPI (同步全雙工)協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface),即串行外圍設備接口,是一種高速全雙工的通信總線。它被廣泛地使用在 ADC、 LCD 等設備與 MCU 間,要求通訊速率較高的場合。
1、SPI 物理層
SPI 通訊設備之間的常用連接方式如下圖所示。
SPI 通訊使用 3 條總線及片選線, 3 條總線分別為 SCK、 MOSI、 MISO,片選線為SS,它們的作用介紹如下:
(1) SS( Slave Select):從設備選擇信號線,常稱為片選信號線,也稱為 NSS、 CS,以下用 NSS 表示。 當有多個 SPI 從設備與 SPI 主機相連時,設備的其它信號線 SCK、MOSI 及 MISO 同時并聯到相同的 SPI 總線上,即無論有多少個從設備,都共同只使用這 3 條總線;而每個從設備都有獨立的這一條 NSS 信號線,本信號線獨占主機的一個引腳,即有多少個從設備,就有多少條片選信號線。 I2C 協議中通過設備地址來尋址、選中總線上的某個設備并與其進行通訊;而 SPI 協議中沒有設備地址,它使用 NSS 信號線來尋址,當主機要選擇從設備時,把該從設備的 NSS 信號線設置為低電平,該從設備即被選中,即片選有效,接著主機開始與被選中的從設備進行 SPI 通訊。所以SPI 通訊以 NSS 線置低電平為開始信號,以 NSS 線被拉高作為結束信號。
(2) SCK (Serial Clock): 時鐘信號線,用于通訊數據同步。它由通訊主機產生,決定了通訊的速率,不同的設備支持的最高時鐘頻率不一樣,如 STM32 的 SPI 時鐘頻率最大為fpclk/2,兩個設備之間通訊時,通訊速率受限于低速設備。
(3) MOSI (Master Output, Slave Input):主設備輸出/從設備輸入引腳。主機的數據從這條信號線輸出,從機由這條信號線讀入主機發送的數據,即這條線上數據的方向為主機到從機。
(4) MISO(Master Input,, Slave Output):主設備輸入/從設備輸出引腳。主機從這條信號線讀入數據,從機的數據由這條信號線輸出到主機,即在這條線上數據的方向為從機到主機。
2、協議層
(1)通訊的起始和停止信號
NSS 信號線由高變低,是 SPI 通訊的起始信號。 NSS 是每個從機各自獨占的信號線,當從機檢在自己的 NSS 線檢測到起始信號后,就知道自己被主機選中了,開始準備與主機通訊。在圖中的標號?處, NSS 信號由低變高,是 SPI 通訊的停止信號,表示本次通訊結束,從機的選中狀態被取消。
(2)數據有效性
SPI 使用 MOSI 及 MISO 信號線來傳輸數據,使用 SCK 信號線進行數據同步。 MOSI及 MISO 數據線在 SCK 的每個時鐘周期傳輸一位數據,且數據輸入輸出是同時進行的。MOSI 及 MISO 的數據在 SCK 的上升沿期間變化輸出,在 SCK 的下降沿時被采樣。即在 SCK 的下降沿時刻, MOSI 及 MISO 的數據有效,高電平時表示數據“1”,為低電平時表示數據“0”。在其它時刻,數據無效, MOSI 及 MISO為下一次表示數據做準備。SPI 每次數據傳輸可以 8 位或 16 位為單位,每次傳輸的單位數不受限制。
(3)CPOL/CPHA 及通訊模式
上面講述的圖中的時序只是 SPI 中的其中一種通訊模式, SPI 一共有四種通訊模式,它們的主要區別是總線空閑時 SCK 的時鐘狀態以及數據采樣時刻。為方便說明,在此引入“時鐘極性 CPOL”和“時鐘相位 CPHA”的概念。
時鐘極性 CPOL 是指 SPI 通訊設備處于空閑狀態時, SCK 信號線的電平信號(即 SPI 通訊開始前、 NSS 線為高電平時 SCK 的狀態)。 CPOL=0 時, SCK 在空閑狀態時為低電平,CPOL=1 時,則相反。
時鐘相位 CPHA 是指數據的采樣的時刻,當 CPHA=0 時, MOSI 或 MISO 數據線上的信號將會在 SCK 時鐘線的“奇數邊沿‖被采樣。當 CPHA=1 時,數據線在 SCK 的“偶數邊沿”采樣。
CPHA=0 時的 SPI 通訊模式:
CPHA=1 時的 SPI 通訊模式:
由 CPOL 及 CPHA 的不同狀態, SPI 分成了四種模式,主機與從機需要工作在相同的模式下才可以正常通訊,實際中采用較多的是“模式 0”與“模式 3”。
四、RS-485 通訊
RS-485 是一種(異步半雙工)工業控制環境中常用的通訊協議,它具有抗干擾能力強、傳輸距離遠的特點。 RS-485 通訊協議由 RS-232 協議改進而來,協議層不變,只是改進了物理層,因而保留了串口通訊協議應用簡單的特點。
1、物理層
RS-485 協議主要是把 RS-232 的信號改進成差分信號,從而大大提高了抗干擾特性,它的通訊網絡如下圖:
每個節點都是由一個通訊控制器和一個收發器組成,在 RS-485 通訊網絡中,節點中的串口控制器使用 RX 與 TX信號線連接到收發器上,而收發器通過差分線連接到網絡總線,串口控制器與收發器之間一般使用 TTL 信號傳輸,收發器與總線則使用差分信號來傳輸。發送數據時,串口控制器的 TX 信號經過收發器轉換成差分信號傳輸到總線上,而接收數據時,收發器把總線上的差分信號轉化成 TTL 信號通過 RX 引腳傳輸到串口控制器中。
RS-485 通訊網絡的最大傳輸距離可達 1200 米,總線上可掛載 128 個通訊節點,而由于 RS-485 網絡只有一對差分信號線,它使用差分信號來表達邏輯,當 AB 兩線間的電壓差為-6V——-2V 時表示邏輯 1,當電壓差為+2V——+6V 表示邏輯 0,在同一時刻只能表達一個信號,所以它的通訊是半雙工形式的。
四、CAN—通訊
CAN 是控制器局域網絡(Controller Area Network)的簡稱, 它是由研發和生產汽車電子產品著稱的德國 BOSCH 公司開發的,并最終成為國際標準(ISO11519) , 是國際上應用最廣泛的現場總線之一。
CAN 總線協議已經成為汽車計算機控制系統和嵌入式工業控制局域網的標準總線,并且擁有以 CAN 為底層協議專為大型貨車和重工機械車輛設計的 J1939 協議。近年來, 它具有的高可靠性和良好的錯誤檢測能力受到重視,被廣泛應用于汽車計算機控制系統和環境溫度惡劣、電磁輻射強及振動大的工業環境。
1、CAN 物理層
與 I2C、 SPI 等具有時鐘信號的同步通訊方式不同, CAN 通訊并不是以時鐘信號來進行同步的,它是一種異步通訊,只具有 CAN_High 和 CAN_Low 兩條信號線,共同構成一組差分信號線,以差分信號的形式進行通訊。
(1)閉環總線網絡
CAN 物理層的形式主要有兩種,下圖中的 CAN 通訊網絡是一種遵循 ISO11898 標準的高速、短距離“閉環網絡”,它的總線最大長度為 40m,通信速度最高為 1Mbps,總線的兩端各要求有一個“120 歐”的電阻。
(2)開環總線網絡
下圖是遵循 ISO11519-2 標準的低速、遠距離“開環網絡”,它的最大傳輸距離為 1km,最高通訊速率為 125kbps,兩根總線是獨立的、不形成閉環,要求每根總線上各串聯有一個“2.2 千歐”的電阻。
(3)通訊節點
從 CAN 通訊網絡圖可了解到, CAN 總線上可以掛載多個通訊節點,節點之間的信號經過總線傳輸,實現節點間通訊。由于 CAN 通訊協議不對節點進行地址編碼,而是對數據內容進行編碼的,所以網絡中的節點個數理論上不受限制,只要總線的負載足夠即可,可以通過中繼器增強負載。
CAN 通訊節點由一個 CAN 控制器及 CAN 收發器組成,控制器與收發器之間通過CAN_Tx 及 CAN_Rx 信號線相連,收發器與 CAN 總線之間使用 CAN_High 及 CAN_Low信號線相連。其中 CAN_Tx 及 CAN_Rx 使用普通的類似 TTL 邏輯信號,而 CAN_High 及CAN_Low 是一對差分信號線,使用比較特別的差分信號,下一小節再詳細說明。
當 CAN 節點需要發送數據時, 控制器把要發送的二進制編碼通過 CAN_Tx 線發送到收發器,然后由收發器把這個普通的邏輯電平信號轉化成差分信號,通過差分線CAN_High 和 CAN_Low 線輸出到 CAN 總線網絡。而通過收發器接收總線上的數據到控制器時,則是相反的過程,收發器把總線上收到的 CAN_High 及 CAN_Low 信號轉化成普通的邏輯電平信號,通過 CAN_Rx 輸出到控制器中。
例如, STM32 的 CAN 片上外設就是通訊節點中的控制器,為了構成完整的節點,還要給它外接一個收發器,在我們實驗板中使用型號為 TJA1050 的芯片作為 CAN 收發器。CAN 控制器與 CAN 收發器的關系如同 TTL 串口與 MAX3232 電平轉換芯片的關系,MAX3232 芯片把 TTL 電平的串口信號轉換成 RS-232 電平的串口信號, CAN 收發器的作用則是把 CAN 控制器的 TTL 電平信號轉換成差分信號(或者相反)。
(4)差分信號
差分信號又稱差模信號,與傳統使用單根信號線電壓表示邏輯的方式有區別,使用差分信號傳輸時,需要兩根信號線,這兩個信號線的振幅相等,相位相反,通過兩根信號線的電壓差值來表示邏輯 0 和邏輯 1。
相對于單信號線傳輸的方式,使用差分信號傳輸具有如下優點:
?抗干擾能力強,當外界存在噪聲干擾時,幾乎會同時耦合到兩條信號線上,而接收端只關心兩個信號的差值,所以外界的共模噪聲可以被完全抵消。
?能有效抑制它對外部的電磁干擾,同樣的道理,由于兩根信號的極性相反,他們對外輻射的電磁場可以相互抵消,耦合的越緊密,泄放到外界的電磁能量越少。
?時序定位精確, 由于差分信號的開關變化是位于兩個信號的交點,而不像普通單端信號依靠高低兩個閾值電壓判斷,因而受工藝,溫度的影響小,能降低時序上的誤差,同時也更適合于低幅度信號的電路。
由于差分信號線具有這些優點,所以在 USB 協議、 485 協議、以太網協議及 CAN 協議的物理層中,都使用了差分信號傳輸。
2、未完待續……
對CAN協議的學習就這么多了,等把剩下的學習完繼續補上。
五、參考文獻
【1】STM32 HAL 庫開發實戰指南—基于野火 F429 挑戰者 V2 開發板
總結
以上是生活随笔為你收集整理的常见的通讯协议总结(USART、IIC、SPI、485、CAN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说《人类简史》
- 下一篇: 我的世界海洋java_我的世界Minec