UART通信協(xié)議及SoC仿真
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UATR,是一種串行、異步、全雙工的收發(fā)器。全雙工的UART支持同時雙向通信,是嵌入式系統(tǒng)必不可少的debug接口。
什么是全雙工?什么是半雙工?
全雙工:同一時刻,兩個設(shè)備都在收發(fā)數(shù)據(jù),比如SPI。注意QSPI是半雙工,因為4根線只能同時收或者發(fā)。
半雙工:兩設(shè)備間可以收發(fā)數(shù)據(jù),但只能收完再發(fā)或發(fā)完再收。
單工:任何時刻只能進行一個方向的通訊,且固定一方為發(fā)送設(shè)備,一方為接收設(shè)備。
串口通信協(xié)議
空閑位:不通信時,TX & RX是邏輯“1”狀態(tài),表示當前線路無數(shù)據(jù)傳輸。
起始位:發(fā)送“0”,表示傳輸開始。
數(shù)據(jù)位:起始位之后,數(shù)據(jù)位的個數(shù)可以是5、6、7、8等,一般是8bit,采用ASCII碼。從最低位開始傳送,根據(jù)波特率在數(shù)據(jù)bit穩(wěn)定的中間位置采樣。
奇偶校驗位:數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)為偶數(shù),則為偶校驗,使得“1”的位數(shù)為奇數(shù)則為奇校驗,以次來校驗數(shù)據(jù)傳送的正確性。
比如一個 8 位長的有效數(shù)據(jù)為:10100101,此時總共有 4 個“ 1”,
為達到奇校驗效果,校驗位應(yīng)為“ 1”,即有效數(shù)據(jù)和校驗位中“ 1”的個數(shù)為奇數(shù)。
為達到偶校驗效果,校驗位應(yīng)為“ 0”,即有效數(shù)據(jù)和校驗位中“ 1”的個數(shù)為偶數(shù)。
注意,UART校驗方法有:奇校驗(odd)、偶校驗(even)、0校驗(space)、0校驗(mark)、無校驗(noparity),為了提高實際帶寬,一般可省去校驗位,即選擇無校驗,思考下為什么?
0 校驗是不管有效數(shù)據(jù)是什么,校驗位固定為“ 0”。1 校驗是校驗位固定為“ 1”。
無校驗就是數(shù)據(jù)包中不包含校驗位。
停止位:一個字符數(shù)據(jù)傳輸?shù)慕Y(jié)束標志,可以是1位、1.5位、2位的高電平。停止位不僅表示傳輸?shù)慕Y(jié)束,并且可提供校正時鐘同步。停止位的位數(shù)越多,時鐘容忍程度越大,但有效帶寬就越小。
波特率
數(shù)據(jù)傳輸速率使用波特率來表示。單位bps(bits per second),常見的波特率9600bps、19200bps、115200bps等,如果串口波特率設(shè)置為9600bps,那么傳輸1bit數(shù)據(jù)需要的時間是1/9600≈104.2us。
帶上校驗位,傳送一個字符數(shù)據(jù)實際是11個比特(1bit開始位、8bit數(shù)據(jù)位、1bit校驗位、1bit停止位),有效的傳輸速率實際為9600*8/11= 6982bps。
不帶校驗位,傳送一個字符數(shù)據(jù)實際是10個比特(1bit開始位、8bit數(shù)據(jù)位、1bit停止位),有效的傳輸速率實際為9600*8/10=7680bps。
這就是為何不傳校驗位,可以提高一點帶寬,也就是所謂的開銷。
以小編設(shè)計的RISC-V SoC為例,仿真UART:
寫個簡單的測試程序:
配置波特率115200bps:
觀察到1bit的傳輸時間為8.8us,1s/115200bps=8.68us, 基本符合預期。
仿真打印效果: