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