1. 問題背景:
2. 問題分析:
3. 總結(jié):
1. 問題背景:
對于嵌入式開發(fā)者來說,串口應(yīng)該是應(yīng)用最廣泛的模塊,在日??蛻糁С诌^程中經(jīng)常會有客戶問到一些關(guān)于串口通訊穩(wěn)定性的問題,比較典型的幾個問題如下:
在9600波特率能工作,但切換到115200就無法正常通訊,是不是和時鐘精度有關(guān)系?
串口穩(wěn)定通訊對時鐘精度的要求是多少,是否波特率配置越高對時鐘精度要求就越高?內(nèi)部RC能否滿足?
串口正常通訊了一段時間后通訊出錯,是不是因為累計誤差太大了?
盡管網(wǎng)上鋪天蓋地的串口配置的資料,但對這些具體問題的描述確實不多,于是好好研究了一番。
2. 問題分析:
想回答這些問題還要從串口通訊的采樣時序說起,如上圖所示,根據(jù)串口的采樣特點不難看出,對于發(fā)送端來說,數(shù)據(jù)是在上升沿被drive到總線上,接收端在每個bit的中間位置采樣,這就意味著在最后一個Bit位采樣時,允許極限偏移為50%,假如用1個起始位+9個數(shù)據(jù)位+1個奇偶校驗位+1個停止位來計算,那么每位偏差最高為:
±50% / 12 = ±4.16%
Note:對于有些支持過采樣的串口來說,采樣點可能不是50%中間位置,一般會更靠后,此處不展開討論;
假如用1個起始位+8個數(shù)據(jù)位+1個停止位來計算,那么每位偏差最高為:±50% / 10 = ±5%
而串口通信,要涉及到發(fā)送和接收兩端,當(dāng)一端為0誤差,另一端最大誤差可到4.16%,如果兩端誤差相同,那每端的最大誤差就只能是2.08%,這也就是為什么很多硬件老法師建議串口的波特率誤差控制在2%以內(nèi)。
±4.16% / 2 = ±2.08%
因此,對于串口通信來說,可以粗略認(rèn)為,當(dāng)時鐘誤差小于±2%時,通信是比較可靠的。對于客戶實際的應(yīng)用系統(tǒng),考慮到UART是一個異步通訊,通訊的穩(wěn)定性取決于雙方的時鐘精度,不是說只有一方的精度滿足要求,系統(tǒng)就能正常工作,所以需要系統(tǒng)去考慮。
3. 總結(jié):
基于以上的分析,可以得出結(jié)論如下:
串口穩(wěn)定通訊和雙方的時鐘精度和有關(guān),總誤差不能超過±4.16%,對于大部分全溫度范圍±1%的MCU來說,都能滿足基本的通訊需求。
串口通訊的累計誤差發(fā)生在每次數(shù)據(jù)(也可以簡單理解成每個字節(jié),只是字節(jié)不嚴(yán)謹(jǐn),因為有時數(shù)據(jù)可能是9 bits)發(fā)送內(nèi)部,連續(xù)的多次發(fā)送之間沒有累計誤差,因為連續(xù)的多個字節(jié)發(fā)送都會被Start起始信號進(jìn)行重新同步,也就是說傳輸1個字節(jié)的誤差和傳輸1000個字節(jié)的誤差基本差不多;
串口是否穩(wěn)定通訊和波特率大小無關(guān),并非波特率配置越高對時鐘精度要求就越高,只和每次發(fā)送的串口數(shù)據(jù)長度(包含起始位/數(shù)據(jù)位/奇偶校驗位/停止位長度)有關(guān), 位長越長,對時鐘精度要求越高;
對于使用串口實現(xiàn)的LIN通訊,以上結(jié)論也基本適用;
以上結(jié)論僅從采樣時序的角度分析,不考慮外界電磁干擾的影響,因為通常波特率越高,每位數(shù)據(jù)的時間長度越短,就越容易受到電磁干擾從而導(dǎo)致通信不可靠。
審核編輯 :李倩
?
評論