常見的序列通訊協議

2022-08-04 18:15:22 字數 2309 閱讀 4350

1.uart

uart是通用非同步收發傳輸器,使用rxd和txd兩根線實現非同步全雙工通訊;為確保通訊可靠,可以在通訊兩邊接共地;因此,完整的uart通訊只需最少3根線即可。

rxd是傳送資料線,txd是接收資料線,通訊雙方使用交叉互聯,rxd接對方txd,txd接對方rxd。uart使用標準的ttl/cmos電平(0~5v,0~3.3v,0~2.5v,0~1.8v)來表示資料,高電平表示1,低電平表示0.為了增強抗干擾能力,提高傳輸長度,可將ttl/cmos 電平轉換為rs232電平邏輯電平,3~12v表示0,-3~-12v表示1(rs232為負邏輯)

1)uart平時處於空閒狀態,邏輯1狀態。

2)當有資料傳送時,先傳送起始位,即將txd拉低並維持1位時間,接收方在檢測到起始位下降沿,等待1.5位後開始一位一位檢測資料。

3)傳送資料,uart資料一幀可以是5,6,7,8位等,一般是8bit,乙個位元組。資料傳送是先傳送低位,依次傳送,直到最高位。

4)可以使用0或者1bit的校驗位,校驗位可以是奇校驗或者偶檢驗。奇校驗:資料加校驗位中1的個數為奇數;偶校驗:資料加校驗位中1的個數為偶數。

5)最後是停止位,資料線恢復到空閒狀態,停止位可以是1,1.5,2位。

1位時間由波特率決定,在uart通訊中,波特率(一秒鐘傳輸的符號數)等於位元率(一秒鐘傳輸的字元數),通訊雙方使用約定的一致的波特率進行通訊,常見的波特率有4800,9600,115200等。

2.i2c

與uart不同,i2c 是同步半雙工通訊協議。i2c使用scl,sda兩根雙向資料線進行通訊,同時為了支援線與邏輯,需要使用開漏輸出,同時使用上拉電阻;上拉電阻大小常見的有1.8k,4.7k,10k;在低速場合,為了降低功耗,可以使用10k上拉電阻,1.8k的上拉電阻具有最好的效能,可滿足較高速的應用。i2c常見的通訊速率有普通:100k,快速:400k,高速:3.4m。i2c最大的從機數量受從機位址和最大匯流排電容400pf電容的限制。i2c的資料幀格式如下:

開始位 | 7bit從機位址 | 1bit讀寫方向位(0寫,1讀) | 1bit應答 | 8bit資料1 | 1bit應答1| ...  | 8bit資料n |1bit非應答n | 停止位 。

空閒狀態:空閒時,scl,sda同時處於高電平。此時,各器件的輸出場效電晶體處於截止狀態,釋放匯流排,匯流排訊號由上拉電阻上拉至高電平。

開始start:scl為高電平時,sda有下降沿。

資料傳輸:資料傳輸已位元組為單位,第乙個位元組表示從機位址+讀寫方向,後續資料格式由器件自己定義。資料傳輸中,sda的只能在scl低電平時變化,並在scl上公升沿進行資料取樣。

應答:每傳送乙個位元組後,接收方必須回應答訊號ack,但傳送最後乙個位元組後,回非應答訊號nack。

停止stop :scl為高電平時,sda有上公升沿。

握手機制:i2c提供握手機制,當主機速度太快而從機無法滿足快速通訊時,從機可以拉低scl來與主機握手,從而延長scl低電平的時間。(scl高電平由所有器件發出最短的高電平決定,低電平則有低電平最長的決定)。

仲裁:sda是線與邏輯,因此,只要有一端輸出低,匯流排就為低電平,因此是低電平優先仲裁。仲裁規則是傳送低電平個數多的主機獲得匯流排權。

由於i2c通訊的方向性,在一次通訊中不能改變資料流方向,因此讀過程中需要一次dummy寫過程:

dummy寫完後,在restart,然後將資料流方向改為讀,接著就可以讀取從機資料內容了。

3.spi

spi是同步全雙工序列通訊協議。spi定義了4根訊號線:

sck:時鐘線,主機提供

miso:主入從出

mosi:主出從入

ss:片選。

片選訊號可選,因此通訊最少需要3根訊號線。spi在時鐘上公升沿下進行雙向資料交換,主機在輸出的同時,也會接收到從機的資料。在設計上,主機從機均需要乙個移位暫存器。spi不區分讀寫方向,只進行資料交換,要讀也必須寫,才能將資料交換過來。

spi通過時鐘極性和時鐘相位定義了4種通訊模式:

時鐘極性cpol:0:空閒時sck為0,1:空閒時sck為1.

時鐘相位cpha:0:資料在第乙個時鐘跳沿取樣(可能是上公升沿,可能是下降沿,與cpol有關),1:資料在第二個時鐘跳沿取樣(可能是上公升沿,可能是下降沿,與cpol有關)。

若在上沿取樣,則資料在下沿輸出,因此資料能夠穩定的被取樣。

spi時序圖如下:

常見硬體通訊協議總結

正好手上的nodemcu支援uart spi i2c協議,所以這篇文章乾脆就用nodemcu來分析協議了 uart 用邏輯分析儀捕捉nodemcu init.lua給上位機傳送 a init.lua tmr.alarm 1,1000,tmr.alarm auto,function print a e...

通訊協議 UDP通訊

通訊協議 通訊協議是udp tcp通訊的基礎,沒有通訊協議的 通訊 是沒有任何意義上的,通訊協議不是底層函式或者高深的原理,而是程式設計師之間的一種文字約定。資料在網路上是以位元組的形式傳送的 底層是01碼 我們在讀取到資料之後,該以怎樣的方式對它進行解碼呢?這就是我們在通訊之前需要制定的通訊協議。...

串列埠通訊 通訊協議

我們的串列埠程式,除了通用的,進行串列埠監聽收發的簡單工具,大多都和下位機有關,這就需要關心我們的通訊協議如何快取,分析,以及通知介面。所謂通訊協議是指通訊雙方的一種約定。約定包括對資料格式 同步方式 傳送速度 傳送步驟 檢糾錯方式以及控制字元定義等問題做出統一規定,通訊雙方必須共同遵守。因此,也叫...