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