串口通信(Serial Communications)的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。它很簡單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。比如IEEE488定義并行通行狀態(tài)時,規(guī)定設(shè)備線總長不得超過20米,并且任意兩個設(shè)備間的長度不得超過2米;而對于串口而言,長度可達(dá)1200米。典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成,分別是地線、發(fā)送、接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時在另一根線上接收數(shù)據(jù)。其他線用于握手,但不是必須的。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗。對于兩個進(jìn)行通信的端口,這些參數(shù)必須匹配。
串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。
常見的串行通信協(xié)議
1.UART
UART是通用異步收發(fā)傳輸器,使用RxD和TxD兩根線實現(xiàn)異步全雙工通信;為確保通信可靠,可以在通信兩邊接共地;因此,完整的UART通信只需最少3根線即可。
RxD是發(fā)送數(shù)據(jù)線,TxD是接收數(shù)據(jù)線,通信雙方使用交叉互聯(lián),RxD接對方TxD,TxD接對方RxD。UART使用標(biāo)準(zhǔn)的TTL/CMOS電平(0~5V,0~3.3V,0~2.5V,0~1.8V)來表示數(shù)據(jù),高電平表示1,低電平表示0.為了增強抗干擾能力,提高傳輸長度,可將TTL/CMOS 電平轉(zhuǎn)換為RS232電平邏輯電平,3~12V表示0,-3~-12V表示1(RS232為負(fù)邏輯)
1)UART平時處于空閑狀態(tài),邏輯1狀態(tài)。
2)當(dāng)有數(shù)據(jù)發(fā)送時,先發(fā)送起始位,即將TxD拉低并維持1位時間,接收方在檢測到起始位下降沿,等待1.5位后開始一位一位檢測數(shù)據(jù)。
3)發(fā)送數(shù)據(jù),UART數(shù)據(jù)一幀可以是5,6,7,8位等,一般是8bit,一個字節(jié)。數(shù)據(jù)發(fā)送是先發(fā)送低位,依次發(fā)送,直到最高位。
4)可以使用0或者1bit的校驗位,校驗位可以是奇校驗或者偶檢驗。奇校驗:數(shù)據(jù)加校驗位中1的個數(shù)為奇數(shù);偶校驗:數(shù)據(jù)加校驗位中1的個數(shù)為偶數(shù)。
5)最后是停止位,數(shù)據(jù)線恢復(fù)到空閑狀態(tài),停止位可以是1,1.5,2位。
1位時間由波特率決定,在UART通信中,波特率(一秒鐘傳輸?shù)姆枖?shù))等于比特率(一秒鐘傳輸?shù)淖址麛?shù)),通信雙方使用約定的一致的波特率進(jìn)行通信,常見的波特率有4800,9600,115200等。
2.I2C
與UART不同,I2C 是同步半雙工通信協(xié)議。I2C使用SCL,SDA兩根雙向數(shù)據(jù)線進(jìn)行通信,同時為了支持線與邏輯,需要使用開漏輸出,同時使用上拉電阻;上拉電阻大小常見的有1.8K,4.7K,10K;在低速場合,為了降低功耗,可以使用10K上拉電阻,1.8K的上拉電阻具有最好的性能,可滿足較高速的應(yīng)用。I2C常見的通信速率有普通:100K,快速:400K,高速:3.4M。I2C最大的從機(jī)數(shù)量受從機(jī)地址和最大總線電容400pF電容的限制。I2C的數(shù)據(jù)幀格式如下:
開始位 | 7bit從機(jī)地址 | 1bit讀寫方向位(0寫,1讀) | 1bit應(yīng)答 | 8bit數(shù)據(jù)1 | 1bit應(yīng)答1| 。.. | 8bit數(shù)據(jù)N |1bit非應(yīng)答N | 停止位 。
空閑狀態(tài):空閑時,SCL,SDA同時處于高電平。此時,各器件的輸出場效應(yīng)管處于截止?fàn)顟B(tài),釋放總線,總線信號由上拉電阻上拉至高電平。
開始START:SCL為高電平時,SDA有下降沿。
數(shù)據(jù)傳輸:數(shù)據(jù)傳輸已字節(jié)為單位,第一個字節(jié)表示從機(jī)地址+讀寫方向,后續(xù)數(shù)據(jù)格式由器件自己定義。數(shù)據(jù)傳輸中,SDA的只能在SCL低電平時變化,并在SCL上升沿進(jìn)行數(shù)據(jù)采樣。
應(yīng)答:每發(fā)送一個字節(jié)后,接收方必須回應(yīng)答信號ACK,但發(fā)送最后一個字節(jié)后,回非應(yīng)答信號NACK。
停止STOP :SCL為高電平時,SDA有上升沿。
握手機(jī)制:I2C提供握手機(jī)制,當(dāng)主機(jī)速度太快而從機(jī)無法滿足快速通信時,從機(jī)可以拉低SCL來與主機(jī)握手,從而延長SCL低電平的時間。(SCL高電平由所有器件發(fā)出最短的高電平?jīng)Q定,低電平則有低電平最長的決定)。
仲裁:SDA是線與邏輯,因此,只要有一端輸出低,總線就為低電平,因此是低電平優(yōu)先仲裁。仲裁規(guī)則是發(fā)送低電平個數(shù)多的主機(jī)獲得總線權(quán)。
由于I2C通信的方向性,在一次通信中不能改變數(shù)據(jù)流方向,因此讀過程中需要一次dummy寫過程:
dummy寫完后,在restart,然后將數(shù)據(jù)流方向改為讀,接著就可以讀取從機(jī)數(shù)據(jù)內(nèi)容了。
3.SPI
SPI是同步全雙工串行通信協(xié)議。SPI定義了4根信號線:
SCK:時鐘線,主機(jī)提供
MISO:主入從出
MOSI:主出從入
SS:片選。
片選信號可選,因此通信最少需要3根信號線。SPI在時鐘上升沿下進(jìn)行雙向數(shù)據(jù)交換,主機(jī)在輸出的同時,也會接收到從機(jī)的數(shù)據(jù)。在設(shè)計上,主機(jī)從機(jī)均需要一個移位寄存器。SPI不區(qū)分讀寫方向,只進(jìn)行數(shù)據(jù)交換,要讀也必須寫,才能將數(shù)據(jù)交換過來。
SPI通過時鐘極性和時鐘相位定義了4種通信模式:
時鐘極性CPOL:0:空閑時SCK為0,1:空閑時SCK為1.
時鐘相位CPHA:0:數(shù)據(jù)在第一個時鐘跳沿采樣(可能是上升沿,可能是下降沿,與CPOL有關(guān)),1:數(shù)據(jù)在第二個時鐘跳沿采樣(可能是上升沿,可能是下降沿,與CPOL有關(guān))。
若在上沿采樣,則數(shù)據(jù)在下沿輸出,因此數(shù)據(jù)能夠穩(wěn)定的被采樣。
SPI時序圖如下:
評論
查看更多