本文深入而全面地概述了嵌入式領(lǐng)域內(nèi)七種經(jīng)典串行通信協(xié)議:UART、RS232、RS485、I2C、SPI、CAN和I2S。這些協(xié)議能夠適應(yīng)不同的應(yīng)用需求,包括通信速度、傳輸距離、系統(tǒng)復(fù)雜度和成本等多個方面。通過了解每種協(xié)議的核心特性和差異,可以為電子系統(tǒng)設(shè)計中選擇最適宜的通信方式提供重要參考哦。
UART
通用異步收發(fā)器(Universal Asynchronous Receiver Transmitter),常見的串行、異步通信總線,兩條數(shù)據(jù)線Tx、Rx,實現(xiàn)全雙工通信,常用于主機與外設(shè)的通信,點對點。
UART幀格式:
關(guān)鍵點:
- 串行、異步
- 需要雙方約定好傳輸?shù)?a class="article-link" target="_blank" href="/baike/497736.html">波特率(因為沒有時鐘線)
- 空閑位是高位
- 不能連續(xù)發(fā)數(shù)據(jù),一次最多發(fā)5-8位(防止誤差累計,因為沒有時鐘線)
TX接RX,RX接TX
一般串口監(jiān)視器里面,設(shè)置好這幾個參數(shù)就行,默認是這樣,基本就改改波特率。
I2C
串行、半雙工。兩根線SDA(數(shù)據(jù)線)、SCL(時鐘線)
近距離、低速,硬件結(jié)構(gòu)簡單,成本低。
最大特點:多主機!
主機有權(quán)發(fā)起和結(jié)束一次通信,從機只能被主機呼叫。
主線上有多個主機時,IIC具備沖突檢測和仲裁功能。
每個IIC總線上的器件都有一個唯一的地址(7bit),每個器件可以作為主機也可以作為從機(同一時間只能有一個主機)
I2C通信過程
- 主機發(fā)送起始信號啟用總線(其他主機收到后就知道現(xiàn)在總線被占用)
- 主機發(fā)送一個字節(jié)數(shù)據(jù)指明從機地址(7bit)和后續(xù)字節(jié)的傳送方向(1bit,0:主到從,1:從到主)
- 被尋址的從機發(fā)送應(yīng)答信號回應(yīng)主機
- 發(fā)送器發(fā)送一個字節(jié)數(shù)據(jù)
- 接收器發(fā)送應(yīng)答信號回應(yīng)發(fā)送器 (循環(huán)步驟4、5)
- 通信完成后主機發(fā)送停止信號釋放總線
尋址方式(主機給從機發(fā)的第一個字節(jié)數(shù)據(jù)):
一次通信時發(fā)送器可以發(fā)任意多個字節(jié)數(shù)據(jù)給接收器。上面第一個字節(jié)數(shù)據(jù)的最后一位決定了發(fā)送器是主機還是從機。
IIC具體通信過程
空閑時SCL和SDA都是高電平
規(guī)定每次傳一個字節(jié)(8bit),先發(fā)高位,
發(fā)送器發(fā)完一個字節(jié)后,接收器必須發(fā)送1位應(yīng)答位,所以一幀共有9位。應(yīng)答位為低電平。
同步信號:
SCL為低電平時,發(fā)送器向數(shù)據(jù)線發(fā)一位數(shù)據(jù),在此期間數(shù)據(jù)線上信號允許發(fā)送變化。
SCL為高電平時,接收器從數(shù)據(jù)線讀取一位數(shù)據(jù),在此期間數(shù)據(jù)線上信號要穩(wěn)定。
典型I2C時序
A表示應(yīng)答,A非表示非應(yīng)答,S表示起始信號,P表示終止信號
SPI
Serial Peripheral Interface(SPI),串行外設(shè)接口高速、全雙工、同步一個主機,若干個從機
至少4根線:
MISO(master in server out)
MOSI(master out server in)
SCLK(時鐘)
CS (片選,通過使能它來選中不同的從機,有n個從機,主機就需要n條CS線)
SPI具體通信過程
先發(fā)高位 (MSB:most significant bit,LSB:least significant bit)
SPI傳完一個字節(jié)后,不需要應(yīng)答!可以直接發(fā)下一個字節(jié)。
沒有起始信號,也沒有終止信號!
CLK下降沿發(fā)數(shù)據(jù),上升沿收數(shù)據(jù),或者? CLK上升沿發(fā)數(shù)據(jù),下降沿收數(shù)據(jù)(由極性和相位一起決定)
SPI極性和相位
SPI總線有四種不同的工作模式,取決于極性(CPOL) 和 相位(CPHL) 這兩個因素。為了滿足不同場合,不同芯片的需求。
CPOL表示SCLK空閑時的狀態(tài)
CPOL=0,空閑時SCLK為低電平
CPOL=1,空閑時SCLK為高電平
CPHA表示采樣時刻
CPHA=0,每個周期的第一個時鐘沿采樣
CPHA=1,每個周期的第二個時鐘沿采樣
I2C與SPI異同
相同點:
- 串行、同步
- TTL電平,傳輸距離不長
- 主從方式
不同點:
- I2C為半雙工,SPI全雙工
- I2C有應(yīng)答,SPI無應(yīng)答
- 尋址方式:I2C通過向總線廣播從機地址尋址,SPI通過使能不同CS引腳尋址
- I2C時鐘極性和相位固定,SPI有4種模式
因為SPI無應(yīng)答、快速尋址等優(yōu)勢,所以SPI速率比I2C快很多,幾M到幾十Mbps。
I2C一般幾百kbps,超高速模式下能5Mbps。
RS232、RS485
回顧一下UART串口通信,它其實在實際應(yīng)用中存在很多問題:
UART的問題
1. 電氣接口不統(tǒng)一
UART只是對信號的時序進行了定義,而未定義接口的電氣特性;UART通信時一般直接使用處理器使用的電平,即TTL電平,但不同的處理器使用的電平存在差異, 高電平和低電平的具體定義不一樣,所以不同的處理器使用UART通信時一般不能直接相連。
2. 抗干擾能力差,通信距離短
TTL信號表示0和1,數(shù)據(jù)傳輸的時候很容易出錯,最多1、2m。
只能用于一個電路板上兩個不同芯片之間的通信。
RS232
用于串行通訊的標準。
依賴UART串口協(xié)議,在電氣層面做處理,統(tǒng)一了標準,能傳得更遠和更快。編程的話沒有任何區(qū)別,就是串口通信。
采用一個標準的連接器,且對9個引腳的作用和電平都做了規(guī)定。主要是用RX、TX和GND這三個引腳。
高電平:-3到-15v
低電平:+3到+15v
抗干擾能力增加,通信距離大致15m。
MCU通過TTL發(fā)出來的信號要接一個電平轉(zhuǎn)換芯片去轉(zhuǎn)成RS232的信號,比如MAX232芯片。類似usb-ttl芯片(ch340,cp2302)。
RS232的問題:
- 接口的信號電平值較高,易損壞接口電路的芯片,又因為與TTL電平不兼容,所以需要使用電平轉(zhuǎn)換芯片才能與TTL電路連接。
- 通信速度較低,易產(chǎn)生共模干擾,抗噪聲干擾性較弱,傳輸距離較短(15m)
RS485
與RS232類似,也是個基于串口的標準,但是是半雙工。
與RS232相比最大特點:遠距離(1500m),抗干擾強,速度更快(幾百kbps到10 Mbps),允許接收多個收發(fā)器(可以組建設(shè)備網(wǎng)絡(luò))
使用差分信號進行數(shù)據(jù)傳輸,有效減少共模干擾,因為外部電磁干擾會同時影響到這兩條線,而差分信號的接收方只關(guān)心兩條線之間的電壓差,從而有效抵消了干擾。(通信用雙絞線,抗干擾強)
高電平(邏輯1):兩線之間電壓差為+2v到+6v
低電平(邏輯0):兩線之間電壓差為-2v到-6v
采用兩線制,因為用的差分信號,所以兩根線表示一個信號,只能半雙工。是不是感覺和I2C很像?只是I2C規(guī)定好了主機怎么管理從機,在編程RS485時完全可以仿照I2C的主從邏輯,避免沖突。
一般也還是要在MCU后接一個TTL轉(zhuǎn)485的芯片(單端傳差分),比如MAX485
CAN
CAN(Controller Area Network,控制器局域網(wǎng))總線協(xié)議是一種高度可靠的、多主機的消息廣播系統(tǒng),廣泛用于汽車和工業(yè)自動化領(lǐng)域進行設(shè)備之間的通信。
汽車中最小的控制模塊叫ECU,
CAN總線大大促進了ECU之間的高效通訊
CAN像RS485一樣采用差分信號通信,雙線制(CAN_High,CAN_Low)物理上用雙絞線,抗干擾強
MCU與外界需要一個TTL轉(zhuǎn)CAN信號的芯片(單端轉(zhuǎn)差分)
CAN總線數(shù)據(jù)幀
有11位識別碼,區(qū)分多達2048個設(shè)備;
RTR為了區(qū)分數(shù)據(jù)幀或遠程請求幀;
控制碼有6位,第一位區(qū)分標準幀和拓展幀(識別位有29位),第二位是空閑位,接下來4為是DLC,控制數(shù)據(jù)碼的長度,0001表示數(shù)據(jù)有8位,1000表示數(shù)據(jù)有64位;
CRC是循環(huán)冗余校驗碼,檢測到錯誤時會自動重傳;
CRC界定符為了把后面信息隔開;
后面2位分別是ACK(接收1則發(fā)送0)和ACK界定符;
最后7位是結(jié)束位;
優(yōu)先級控制: CAN協(xié)議通過識別碼實現(xiàn)優(yōu)先級控制。ID較低的消息具有較高的優(yōu)先級,能夠在網(wǎng)絡(luò)忙時優(yōu)先傳輸。
CAN總線的數(shù)據(jù)傳輸速率可根據(jù)網(wǎng)絡(luò)長度和節(jié)點數(shù)進行調(diào)整,一般情況下,速率可以從幾kbps到1Mbps不等
位定時
數(shù)據(jù)在CAN總線上的傳輸和采樣過程涉及到位定時(Bit Timing),這是確保數(shù)據(jù)準確同步和傳輸?shù)年P(guān)鍵因素。
位定時包括若干部分,如同步段、傳播時間段、相位緩沖段1和相位緩沖段2,其中采樣點(Sample Point)是位時間內(nèi)的一個特定點,用于決定何時對傳輸?shù)奈贿M行采樣。
在CAN協(xié)議中,數(shù)據(jù)位的采樣通常發(fā)生在位時間的某個固定點上,這個點被配置為盡可能靠近位時間結(jié)束前,以允許信號在總線上傳播并穩(wěn)定。這意味著數(shù)據(jù)的采樣不直接依賴于時鐘信號的上升沿或下降沿,而是依賴于位時間內(nèi)預(yù)先配置的采樣點。
由于CAN總線使用非歸零(Non-Return to Zero, NRZ)編碼,連續(xù)的位之間沒有自動的同步點(例如,沒有時鐘信號的顯式傳輸),因此,CAN總線協(xié)議通過硬件和位定時配置來確保所有節(jié)點在位時間內(nèi)正確地同步和采樣數(shù)據(jù)。
詳細位定時知識建議參考這篇博客 《CAN通信位定時與同步》
CAN與RX485異同
他倆都是串行半雙工,且基于差分信號和多設(shè)備,但有較大差異:
- CAN總線使用唯一標識符(ID)為每條消息指定優(yōu)先級,具有自動仲裁功能。RS485總線是一種常規(guī)的通信總線,它不能夠做總線的自動仲裁,也就是不能夠同時發(fā)送數(shù)據(jù)以避免總線競爭。
- CAN支持復(fù)雜的網(wǎng)絡(luò)拓撲,如星型、樹型和總線型結(jié)構(gòu)。RS485主要支持總線型拓撲,所有設(shè)備通過兩條信號線相連。
- CAN內(nèi)置復(fù)雜的錯誤檢測、報告和恢復(fù)機制,包括位級錯誤檢測、重傳和錯誤限制等功能。RS485作為一種電氣標準,本身不提供錯誤處理機制。需要通過高層協(xié)議來實現(xiàn)錯誤控制
- 數(shù)據(jù)傳輸時同步方式不同。
I2S
主要用于音頻數(shù)據(jù)傳輸? 串行,同步,半雙工
三根線
SCK(時鐘線)
WS(左右時鐘線,選擇左右聲道)
SD(數(shù)據(jù)線,數(shù)據(jù)可以是單聲道或立體聲,格式通常是線性PCM編碼)
時鐘上升沿時發(fā)數(shù)據(jù),下降沿時讀數(shù)據(jù)
WS的高低表示不同的聲道,在一個SCK時鐘周期內(nèi),一半的時間用于傳輸左聲道數(shù)據(jù),另一半時間用于傳輸右聲道數(shù)據(jù)。
WS跳轉(zhuǎn)表示一字節(jié)數(shù)據(jù)傳輸?shù)淖詈笠晃?/p>