几种常用通信协议
通信可以形象的比喻成兩個人講話:1、你說的別人得能聽懂:雙方約定信號的協議。2、你的語速別人得能接受:雙方滿足時序要求。
一、IIC協議:
2C串行總線一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。兩條線可以掛多個設備。IIC設備(稍微有點智能的)里有個固化的地址。只有在兩條線上傳輸的值等于我(IIC設備)的地址時,我才作出響應。
開始信號:處理器讓SCL時鐘保持高電平,然后讓SDA數據信號由高變低就表示一個開始信號。同時IIC總線上的設備檢測到這個開始信號它就知道處理器要發送數據了。
停止信號:處理器讓SCL時鐘保持高電平,然后讓SDA數據信號由低變高就表示一個停止信號。同時IIC總線上的設備檢測到這個停止信號它就知道處理器已經結束了數據傳輸,我們就可以各忙各個的了,如休眠等。
再看數據怎么傳:SDA上傳輸的數據必須在SCL為高電平期間保持穩定:因為外接IIC設備在SCL為高電平的期間采集數據方知SDA是高或低電平。SDA上的數據只能在SCL為低電平期間翻轉變化。
響應信號(ACK):處理器把數據發給外接IIC設備,如何知道IIC設備數據已經收到呢?就需要外接IIC設備回應一個信號給處理器。處理器發完8bit數據后就不再驅動總線了(SDA引腳變輸入),而SDA和SDL硬件設計時都有上拉電阻,所以這時候SDA變成高電平。那么在第8個數據位,如果外接IIC設備能收到信號的話接著在第9個周期把SDA拉低,那么處理器檢測到SDA拉低就能知道外接IIC設備數據已經收到。
IIC數據從最高位開始傳輸。IIC總線是允許掛載多個設備的,如何訪問其中一個設備而不影響其他設備呢?
主機向從機發送7位地址尋址從IIC設備,用7bit表示從地址,那么可以掛載的從設備數是2的7次方128個。處理器想寫的話:先發送起始位,再發一個8bit數據:前7bit表示從地址,第8bit表示讀或者寫。0write是處理器往IIC從設備發,1read是IIC從設備往處理器發。第9個時鐘周期回復響應信號。例如寫過程:
首先發出一個start信號,從設備地址,R/W(0,寫),回應ACK表示有這個從設備存在。這時候是處理器從指定的從設備讀數據的從設備里8bit存儲地址的指定。所以這里R/W是0為寫。ACK回應有這個設備的話,處理器把要訪問的從設備里的8bit存儲地址寫好。ACK對方回應。繼續一個start信號+從設備地址,最低位是高電平表示讀數據(等待ACK回應),回應ACK表示有這個從設備存在。在讀數據的時候,每發出一個時鐘,處理器會SDA上的數據存起來。那么發出8個時鐘后處理器就能得到8位的數據。這時候若想連續讀就不斷回應ACK信號否則就發出停止信號。
讀的過程:start信號,從設備地址,寫,待讀取存儲地址,再一個start信號,從設備地址,讀,8個時鐘,從設備就把對應的數據反饋給處理器。
二、SPI協議:SPI:高速同步串行口,是一種標準的四線同步全雙工串行總線。SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(用于單向傳輸時,也就是半雙工方式)。也是所有基于SPI的設備共有的,它們是SDI(數據輸入),SDO(數據輸出),SCLK(時鐘),CS(片選)。?SPI 主要應用在 EEPROM, Flash, 實時時鐘(RTC), 數模轉換器(ADC), 數字信號處理器(DSP) 以及數字信號解碼器之間. 它在芯片中只占用四根管腳 (Pin) 用來控制以及數據傳輸, 節約了芯片的 pin 數目, 同時為 PCB 在布局上節省了空間. 正是出于這種簡單易用的特性, 現在越來越多的芯片上都集成了 SPI技術.SPI只有主模式和從模式之分,沒有讀和寫的說法,因為實質上每次SPI是主從設備在交換數據。也就是說,你發一個數據必然會收到一個數據;你要收一個數據必須也要先發一個數據。
工作過程:
上升沿發送、下降沿接收、高位先發送;
上升沿到來的時候,SDO上的電平將被發送到從設備的寄存器中;
下降沿到來的時候,SDI上的電平將被接收到主設備的寄存器中。
一個完整的傳送周期是16位,即兩個字節。因為主機首先要發送命令給從機,然后從機根據主機的指令準備數據,所以主機在下一個8位時鐘周期才把數據讀回來。SPI總線有四種工作方式(SP0, SP1, SP2, SP3),其中使用的最為廣泛的是SPI0和SPI3方式。SPI接口有四種不同的數據傳輸時序,取決于CPOL和CPHL這兩位的組合,CPOL是用來決定SCK時鐘信號空閑時的電平,CPOL=0,空閑電平為低電平,CPOL=1時,空閑電平為高電平。CPHA是用來決定采樣時刻的,CPHA=0,在每個周期的第一個時鐘沿采樣,CPHA=1,在每個周期的第二個時鐘沿采樣。
UART:Universal Asynchronous Receiver/Transmitter,通用異步接收/發送裝置,UART是一個并行輸入成為串行輸出的芯片,通常集成在主板上,多數是16550AFN芯片。因為計算機內部采用并行數據,不能直接把數據發到Modem,必須經過UART整理才能進行異步傳輸,其過程為:CPU先把準備寫入串行設備的數據放到UART的寄存器(臨時內存塊)中,再通過FIFO(First Input First Output,先入先出隊列)傳送到串行設備,若是沒有FIFO,信息將變得雜亂無章,不可能傳送到Modem中。它是用于控制計算機與串行設備的芯片。有一點要注意的是,它提供了RS-232C數據終端設備接口,這樣計算機就可以和調制解調器或其它使用RS-232C接口的串行設備通信了。作為接口的一部分,UART還提供以下功能:將由計算機內部傳送過來的并行數據轉換為輸出的串行數據流。將計算機外部來的串行數據轉換為字節,供計算機內部使用并行數據的器件使用。它包括了RS232、RS499、RS423、RS422和RS485等接口標準規范和總線標準規范,即UART是異步串行通信口的總稱。
通信過程:
UART首先將接收到的并行數據轉換成串行數據來傳輸。消息幀從一個低位起始位開始,后面是5~8個數據位,一個可用的奇偶位和一個或幾個高位停止位。接收器發現開始位時它就知道數據準備發送,并嘗試與發送器時鐘頻率同步。如果選擇了奇偶,UART就在數據位后面加上奇偶位。奇偶位可用來幫助錯誤校驗。在接收過程中,UART從消息幀中去掉起始位和結束位,對進來的字節進行奇偶校驗,并將數據字節從串行轉換成并行。UART也產生額外的信號來指示發送和接收的狀態。例如,如果產生一個奇偶錯誤,UART就置位奇偶標志。
數據發送的思想是,當啟動字節發送時,通過TxD先發起始位,然后發數據位和奇偶數效驗位,最后再發停止位,發送過程由發送狀態機控制,每次中斷只發送1個位,經過若干個定時中斷完成1個字節幀的發送。
數據接收的思想是,當不在字節幀接收過程時,每次定時中斷以3倍的波特率監視RxD的狀態,當其連續3次采樣電平依次為1、0、0時,就認為檢測到了起始位,則開始啟動一次字節幀接收,字節幀接收過程由接收狀態機控制,每次中斷只接收1個位,經過若干個定時中斷完成1個字節幀的接收。。UART典型為38400,9600波特 。如下圖1,UART字符格式為1個起始位,5~8個數據位,1個地址位或奇偶位(可選),1個停止位。由于接收器、發送器異步工作,無需聯接接收和發送時鐘。接收器采取對輸入數據流高度采樣方式,通常采樣為16,并根據采樣值確定位值。按慣例,使用16個采樣值的中間三個值。
。
UART
鏈接典型為
38400
,
9600
波特
?
。
如下圖
1
,
UART
字符格式為
1
個起始位,
5~8
個數據位,
1
個地址位或奇偶位
(
可選
)
,
1
個停止
位。
?
?
????
由于接收器、
發送器異步工作,
無需聯接接收和發送時鐘。
接收器采取對輸
入數據流高度采樣方式,通常采樣為
16
,并根據采樣值確定位值。按慣例,使
用
16
個采樣值的中間三個值。
四、三種協議的區別
第一個區別當然是名字:
????SPI(Serial?Peripheral?Interface:串行外設接口);
????I2C(INTER?IC?BUS:意為IC之間總線)
????UART(Universal?Asynchronous?Receiver?Transmitter:通用異步收發器)
第二,區別在電氣信號線上:
????SPI 總線由三條信號線組成:串行時鐘(SCLK)、串行數據輸出(SDO)、串行數據輸入(SDI)。SPI總線可以實現?多個SPI設備互相連接。提供 SPI串行時鐘的SPI設備為SPI主機或主設備(Master),其他設備為SPI從機或從設備(Slave)。主從設備間可以實現全雙工通信,當有多個從設備時,還可以增加一條從設備選擇線。
????如果用通用IO口模擬SPI總線,必須要有一個輸出口(SDO),一個輸入口(SDI),另一個口則視實現的設備類型而定,如果要實現主從設備,則需輸入輸出口,若只實現主設備,則需輸出口即可,若只實現從設備,則只需輸入口即可。
? ? I2C總線是雙向、兩線(SCL、SDA)、串行、多主控(multi-master)接口標準,具有總線仲裁機制,非常適合在器件之間進行近距離、非經常性的數據通信。在它的協議體系中,傳輸數據時都會帶上目的設備的設備地址,因此可以實現設備組網。
????如果用通用IO口模擬I2C總線,并實現雙向傳輸,則需一個輸入輸出口(SDA),另外還需一個輸出口(SCL)。(注:I2C資料了解得比較少,這里的描述可能很不完備)
? ? UART總線是異步串口,因此一般比前兩種同步串口的結構要復雜很多,一般由波特率產生器(產生的波特率等于傳輸波特率的16倍)、UART接收器、UART發送器組成,硬件上由兩根線,一根用于發送,一根用于接收。
????顯然,如果用通用IO口模擬UART總線,則需一個輸入口,一個輸出口。
第三,從第二點明顯可以看出,SPI和UART可以實現全雙工,但I2C不行;
第四,看看牛人們的意見吧!
????wudanyu:I2C 線更少,我覺得比UART、SPI更為強大,但是技術上也更加麻煩些,因為I2C需要有雙向IO的支持,而且使用上拉電阻,我覺得抗干擾能力較弱,一般用于同一板卡上芯片之間的通信,較少用于遠距離通信。SPI實現要簡單一些,UART需要固定的波特率,就是說兩位數據的間隔要相等,而SPI則無所謂,因為它是有時鐘的協議。
????quickmouse:I2C的速度比SPI慢一點,協議比SPI復雜一點,但是連線也比標準的SPI要少。
總結
- 上一篇: Text模式和PDU模式短信的区别
- 下一篇: 在简历中应用STAR法则