串行总线协议笔记
?
?
I2C
--INTER-IC串行總線的縮寫,是PHILIPS公司推出的芯片間串行傳輸總線。它以1根串行數(shù)據(jù)線(SDA)和1根串行時(shí)鐘線(SCL)實(shí) 現(xiàn)了雙工的同步數(shù)據(jù)傳輸。具有接口線少,控制方式簡化,器件封裝形式小,通信速率較高等優(yōu)點(diǎn)。? I2C總線是雙向、兩線(SCL、SDA)、串行、多主控(multi-master)接口標(biāo)準(zhǔn),具有總線仲裁機(jī)制,非常適合在器件之間進(jìn)行近距離、非經(jīng)常性的數(shù)據(jù)通信。在主從通信中,可以有多個(gè)I2C總線器件同時(shí)接到I2C總線 上,通過地址來識(shí)別通信對(duì)象。
IIC 接口的協(xié)議里面包括設(shè)備地址信息,可以同一總線上連接多個(gè)從設(shè)備,通過應(yīng)答來互通數(shù)據(jù)及命令。但是傳輸速率有限,標(biāo)準(zhǔn)模式下可達(dá)到100Kbps,快速模式下可達(dá)到400Kbps(我們開發(fā)板一般在130Kbps),高速模式下達(dá)到4Mbps,不能實(shí)現(xiàn)全雙工,不適合傳輸很多的數(shù)據(jù)。
IIC總線是一個(gè)真正的多主機(jī)總線,總線上多個(gè)主機(jī)初始化傳輸,可以通過傳輸檢測和仲裁來防止數(shù)據(jù)被破壞 。
下來詳細(xì)了解IIC總線時(shí)序:
1.1 總線數(shù)據(jù)有效性
IIC總線是單工,因此同一時(shí)刻數(shù)據(jù)只有一個(gè)流向,因此采樣有效時(shí)鐘也是單一的,是在SCL時(shí)鐘的高電平采樣數(shù)據(jù)。
IIC總線上SDA數(shù)據(jù)在SCL時(shí)鐘低電平是可以發(fā)生變化,但是在時(shí)鐘高電平時(shí)必須穩(wěn)定,以便主從設(shè)備根據(jù)時(shí)鐘采樣數(shù)據(jù),如下圖:
1.2 總線空閑條件
IIC總線上設(shè)備都釋放總線(發(fā)出傳輸停止)后,IIC總線根據(jù)上拉電阻變成高電平,SDA SCL都是高電平。
?
1.3 總線數(shù)據(jù)傳輸起始和結(jié)束條件
IIC總線SCL高電平時(shí)SDA出現(xiàn)由高到低的跳變,標(biāo)志總線上數(shù)據(jù)傳輸?shù)拈_始條件
IIC總線SCL高電平時(shí)SDA出現(xiàn)由低到高的跳變,標(biāo)志總線上數(shù)據(jù)傳輸?shù)慕Y(jié)束條件
?
1.4 總線數(shù)據(jù)傳輸順序以及ACK應(yīng)答
IIC總線上數(shù)據(jù)傳輸室MSB在前,LSB在后,從示波器上看,從左向右依次讀出數(shù)據(jù)即可
IIC總線傳輸?shù)臄?shù)據(jù)不收限制,但是每次發(fā)到SDA上的必須是8位,并且主機(jī)發(fā)送8位后釋放總線,從機(jī)收到數(shù)據(jù)后必須拉低SDA一個(gè)時(shí)鐘,回應(yīng)ACK表示數(shù)據(jù)接收成功,我們?nèi)绻静ㄆ魃峡吹降牟ㄐ尉褪敲看?位數(shù)據(jù),8bit+1bit ack。如下:
?
?
?
?
?
從機(jī)收到一字節(jié)數(shù)據(jù)后,如果需要一些時(shí)間處理,則會(huì)拉低SCL,讓傳輸進(jìn)入等待狀態(tài),處理完成,釋放SCL,繼續(xù)傳輸,如下:
?
1.5 總線讀寫時(shí)序
數(shù)據(jù)的傳輸在起始條件之后,發(fā)送一個(gè)7位的從機(jī)地址,緊接著第8位是數(shù)據(jù)方向(R/ W),0-表示發(fā)送數(shù)據(jù)(寫),1-表示接收數(shù)據(jù)(讀)。數(shù)據(jù)傳輸一般由主機(jī)產(chǎn)生的停止位(P)終止。但是如果主機(jī)仍希望在總線上通訊,它可以產(chǎn)生重復(fù)起始條件(Sr),和尋址另一個(gè)從機(jī),而不是首先產(chǎn)生一個(gè)停止條件。在這種傳輸中,可能有不同的讀/寫格式結(jié)合。
IIC總線主設(shè)備讀寫從設(shè)備,一般都是與從設(shè)備的寄存器打交道,這個(gè)可以通過閱讀從設(shè)備的datasheet獲取??偩€寫時(shí)序如下:
master start + master?addr|w + slave ack + master reg|w?+ slave ack + master data + slave ack + master restart。。master data + slave nack + master stop
總線讀時(shí)序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop
總線讀時(shí)序與寫的不同之處在于讀需要2次傳輸才能完成一次讀取,首先要寫寄存器地址到從設(shè)備,其實(shí)是寫到了從設(shè)備的控制寄存器或者命令寄存器,從設(shè)備內(nèi)部會(huì)根據(jù)這個(gè)地址來尋址所要操作的寄存器。
我在讀我們的bios和內(nèi)核時(shí)發(fā)現(xiàn),2者在總線讀時(shí)序上的實(shí)現(xiàn)不太一樣,在于第一次寄存器地址寫入后,一個(gè)發(fā)的是restart,一個(gè)發(fā)的是stop,然后再start開始讀取數(shù)據(jù),示波器抓波形發(fā)現(xiàn)讀取數(shù)據(jù)都正確,說明這2種時(shí)序都是正確的。
IIC總線的讀寫時(shí)序比較固定,設(shè)備通信嚴(yán)格遵循協(xié)議,因此iIC總線設(shè)備驅(qū)動(dòng)程序的編寫也就相對(duì)簡單一些。
主要應(yīng)用的iIc總線設(shè)備有touchscreen rtc 外擴(kuò)io等
http://blog.chinaunix.net/uid-21785445-id-2688689.html
IIC總線協(xié)議最重要的是起始信號(hào),終止信號(hào)和應(yīng)答信號(hào)。起始信號(hào)和終止信號(hào)由主機(jī)產(chǎn)生,應(yīng)答信號(hào)是每次傳輸完成一個(gè)字節(jié)數(shù)據(jù)后必須有的,用于確認(rèn)傳輸是否完成,主機(jī)向設(shè)備發(fā)一個(gè)字節(jié)數(shù)據(jù)后需要設(shè)備作應(yīng)答,確認(rèn)設(shè)備是否收到數(shù)據(jù),主機(jī)收一個(gè)字節(jié)數(shù)據(jù)后需要向設(shè)備發(fā)一個(gè)應(yīng)答信號(hào),告訴設(shè)備數(shù)據(jù)是否收到。
(1) 起始信號(hào):在時(shí)鐘線保持高電平期間,數(shù)據(jù)線出現(xiàn)由高電平向低電平變化時(shí)啟動(dòng)I2C總線;
(2) 終止信號(hào):在時(shí)鐘線保持高電平期間,數(shù)據(jù)線出現(xiàn)由低電平向高電平變化時(shí)停止I2C總線;
(3) 應(yīng)答信號(hào):應(yīng)答信號(hào)在第9個(gè)時(shí)鐘位上出現(xiàn),接收器輸出低電平為應(yīng)答信號(hào)(A),輸出高電平則為非應(yīng)答信號(hào)(/A)。
?
IIC數(shù)據(jù)傳輸:SCL為高電平時(shí)將SDA上數(shù)據(jù)發(fā)走,所以SDA上數(shù)據(jù)必須在SCL為高電平期間保持穩(wěn)定,IIC總線首先傳輸?shù)氖菙?shù)據(jù)最高位,最后是最低位。
?
設(shè)備地址:在起始信號(hào)后,需要向設(shè)備發(fā)送一個(gè)字節(jié)的設(shè)備地址,其中高七位為設(shè)備的地址,表示同哪個(gè)設(shè)備進(jìn)行通信,最低位為數(shù)據(jù)傳輸方向,1表示讀(接收),0表示寫(發(fā)送)。
1.發(fā)送(寫)一個(gè)字節(jié)數(shù)據(jù)流程
a.起始信號(hào)
b.發(fā)送一個(gè)設(shè)備地址,這里為0,表示發(fā)送(寫)),設(shè)備應(yīng)答
c.發(fā)送設(shè)備的寫的基地址,設(shè)備應(yīng)答
d.發(fā)送數(shù)據(jù)到設(shè)備基地址,設(shè)備應(yīng)答
e.停止信號(hào)
?
2.接收(讀)一個(gè)字節(jié)數(shù)據(jù)流程
a.起始信號(hào)
b.發(fā)送一個(gè)設(shè)備地址,這里為0,表示發(fā)送(寫)),設(shè)備應(yīng)答
c.發(fā)送從設(shè)備要讀數(shù)據(jù)的基地址,設(shè)備應(yīng)答
d.起始信號(hào)
e.發(fā)送一個(gè)設(shè)備地址,這里為1,表示接收(讀)),設(shè)備應(yīng)答
f.從設(shè)備基地址處接收到一個(gè)字節(jié)的數(shù)據(jù),主機(jī)應(yīng)答
g.停止信號(hào)
?
從設(shè)備地址讀或?qū)懸粋€(gè)字節(jié)數(shù)據(jù)后,設(shè)備讀寫地址會(huì)自動(dòng)加1
3.連續(xù)發(fā)送(寫)多個(gè)字節(jié)數(shù)據(jù)
a.起始信號(hào)
b.發(fā)送一個(gè)設(shè)備地址,這里為0,表示發(fā)送(寫)),設(shè)備應(yīng)答
c.發(fā)送設(shè)備的寫的基地址,設(shè)備應(yīng)答
d.發(fā)送數(shù)據(jù)到設(shè)備基地址,設(shè)備應(yīng)答
e.發(fā)送數(shù)據(jù)到設(shè)備(基地址+1),設(shè)備應(yīng)答
f.發(fā)送數(shù)據(jù)到設(shè)備(基地址+2),設(shè)備應(yīng)答
g.發(fā)送數(shù)據(jù)到設(shè)備(基地址+n),設(shè)備應(yīng)答
h.停止信號(hào)
?
4.連續(xù)接收(讀)多個(gè)字節(jié)數(shù)據(jù)
a.起始信號(hào)
b.發(fā)送一個(gè)設(shè)備地址,這里為0,表示發(fā)送(寫)),設(shè)備應(yīng)答
c.發(fā)送從設(shè)備要讀數(shù)據(jù)的基地址,設(shè)備應(yīng)答
d.起始信號(hào)
e.發(fā)送一個(gè)設(shè)備地址,這里為1,表示接收(讀)),設(shè)備應(yīng)答
f.從設(shè)備基地址處接收到一個(gè)字節(jié)的數(shù)據(jù),主機(jī)應(yīng)答
g.從設(shè)備(基地址處+1)接收到一個(gè)字節(jié)的數(shù)據(jù),主機(jī)應(yīng)答
h.從設(shè)備(基地址處+2)接收到一個(gè)字節(jié)的數(shù)據(jù),主機(jī)應(yīng)答
i.從設(shè)備(基地址處+n)接收到一個(gè)字節(jié)的數(shù)據(jù),主機(jī)應(yīng)答
j.停止信號(hào)
?
SPI
?? SPI 的通信原理很簡單,它需要至少4根線,事實(shí)上3根也可以。也是所有基于SPI的設(shè)備共有的,它們是SDI(數(shù)據(jù)輸入),SDO(數(shù)據(jù)輸出),SCK(時(shí) 鐘),CS(片選)。其中CS是控制芯片是否被選中的,也就是說只有片選信號(hào)為預(yù)先規(guī)定的使能信號(hào)時(shí)(高電位或低電位),對(duì)此芯片的操作才有效。這就允許 在同一總線上連接多個(gè)SPI設(shè)備成為可能。
接下來就負(fù)責(zé)通訊的3根線了。通訊是通過數(shù)據(jù)交換完成的,這里先要知道SPI是串行通訊協(xié)議,也就是說數(shù)據(jù)是一位一位的傳輸?shù)?。這就是SCK時(shí)鐘線存在的原因,由SCK提供時(shí)鐘脈沖,SDI,SDO則基于此脈沖完成數(shù)據(jù)傳輸。數(shù)據(jù)輸出通過SDO線,數(shù)據(jù)在時(shí)鐘上沿或下沿時(shí)改變,在緊接著的下沿或上沿被讀取。 完成一位數(shù)據(jù)傳輸,輸入也使用同樣原理。這樣,在至少8次時(shí)鐘信號(hào)的改變(上沿和下沿為一次),就可以完成8位數(shù)據(jù)的傳輸。
1) SCLK:串行時(shí)鐘,用來同步數(shù)據(jù)傳輸,由主機(jī)輸出;
?
2) MOSI:主機(jī)輸出從機(jī)輸入數(shù)據(jù)線;
?
3) MISO:主機(jī)輸入從機(jī)輸出數(shù)據(jù)線;
?
4) SS:片選線,低電平有效,由主機(jī)輸出。
?
在SPI總線上,某一時(shí)刻可以出現(xiàn)多個(gè)從機(jī),但只能存在一個(gè)主機(jī),主機(jī)通過片選線來確定要通信的從機(jī)。這就要求從機(jī)的MISO口具有三態(tài)特性,使得該口線在器件未被選通時(shí)表現(xiàn)為高阻抗。
?
?? ?要注意的是,SCK信號(hào)線只由主設(shè)備控制,從設(shè)備不能控制信號(hào)線。同樣,在一個(gè)基于SPI的設(shè)備中,至少有一個(gè)主控設(shè)備。
這樣傳輸?shù)奶攸c(diǎn):這樣的傳輸方式有一個(gè)優(yōu)點(diǎn),與普通的串行通訊不同,普通的串行通訊一次連續(xù)傳送至少8位數(shù)據(jù),而SPI允許數(shù)據(jù)一位一位的傳送,甚至允許暫停,因?yàn)镾CK時(shí)鐘線由主控設(shè)備控制,當(dāng)沒有時(shí)鐘跳變時(shí),從設(shè)備不采集或傳送數(shù)據(jù)。也就是說,主設(shè)備通過對(duì)SCK時(shí)鐘線的控制可以完成對(duì)通訊的控制。
SPI還是一個(gè)數(shù)據(jù)交換協(xié)議:因?yàn)镾PI的數(shù)據(jù)輸入和輸出線獨(dú)立,所以允許同時(shí)完成數(shù)據(jù)的輸入和輸出。
不同的SPI設(shè)備的實(shí)現(xiàn)方式不盡相同,主要是數(shù)據(jù)改變和采集的時(shí)間不同,在時(shí)鐘信號(hào)上沿或下沿采集有不同定義,具體請(qǐng)參考相關(guān)器件的文檔。
? ?? 概述
??? ??
?
? ?? ?上圖只是對(duì) SPI 設(shè)備間通信的一個(gè)簡單的描述, 下面就來解釋一下圖中所示的幾個(gè)組件(Module):
? ?? ? SSPBUF, Synchronous Serial Port Buffer, 泛指 SPI 設(shè)備里面的內(nèi)部緩沖區(qū), 一般在物理上是以 FIFO 的形式, 保存?zhèn)鬏斶^程中的臨時(shí)數(shù)據(jù);
? ?? ? SSPSR, Synchronous Serial Port Register, 泛指 SPI 設(shè)備里面的移位寄存器(Shift Regitser), 它的作用是根據(jù)設(shè)置好的數(shù)據(jù)位寬(bit-width) 把數(shù)據(jù)移入或者移出 SSPBUF;
? ?? ? Controller, 泛指 SPI 設(shè)備里面的控制寄存器, 可以通過配置它們來設(shè)置 SPI 總線的傳輸模式.
? ?? ???通常情況下, 我們只需要對(duì)上圖所描述的四個(gè)管腳(pin) 進(jìn)行編程即可控制整個(gè) SPI 設(shè)備之間的數(shù)據(jù)通信:
??? ???SCK, Serial Clock, 主要的作用是 Master 設(shè)備往 Slave 設(shè)備傳輸時(shí)鐘信號(hào), 控制數(shù)據(jù)交換的時(shí)機(jī)以及速率;
? ?? ???SS/CS, Slave Select/Chip Select, 用于 Master 設(shè)備片選 Slave 設(shè)備, 使被選中的 Slave 設(shè)備能夠被 Master 設(shè)備所訪問;
? ?? ???SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為數(shù)據(jù)的出口, 主要用于 SPI 設(shè)備發(fā)送數(shù)據(jù);
? ?? ???SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被稱為 Rx-Channel, 作為數(shù)據(jù)的入口, 主要用于SPI 設(shè)備接收數(shù)據(jù);
? ?? ???SPI 設(shè)備在進(jìn)行通信的過程中, Master 設(shè)備和 Slave 設(shè)備之間會(huì)產(chǎn)生一個(gè)數(shù)據(jù)鏈路回環(huán)(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制數(shù)據(jù)移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時(shí)鐘信號(hào).
?
SSPSR.
? ?? ?????
?
? ?? ???SSPSR 是 SPI 設(shè)備內(nèi)部的移位寄存器(Shift Register). 它的主要作用是根據(jù) SPI 時(shí)鐘信號(hào)狀態(tài), 往 SSPBUF 里移入或者移出數(shù)據(jù), 每次移動(dòng)的數(shù)據(jù)大小由 Bus-Width 以及 Channel-Width 所決定.
? ?? ???Bus-Width 的作用是指定地址總線到 Master 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝?/span>.
? ?? ???例如, 我們想要往 Master 設(shè)備里面的 SSPBUF 寫入 16 Byte 大小的數(shù)據(jù): 首先, 給 Master 設(shè)備的配置寄存器設(shè)置 Bus-Width 為 Byte; 然后往 Master 設(shè)備的 Tx-Data 移位寄存器在地址總線的入口寫入數(shù)據(jù), 每次寫入 1 Byte 大小的數(shù)據(jù)(使用 writeb 函數(shù)); 寫完 1 Byte 數(shù)據(jù)之后, Master 設(shè)備里面的 Tx-Data 移位寄存器會(huì)自動(dòng)把從地址總線傳來的1 Byte 數(shù)據(jù)移入 SSPBUF 里; 上述動(dòng)作一共需要重復(fù)執(zhí)行 16 次.
? ?? ???Channel-Width 的作用是指定 Master 設(shè)備與 Slave 設(shè)備之間數(shù)據(jù)傳輸?shù)膯挝?/span>. 與 Bus-Width 相似,??Master 設(shè)備內(nèi)部的移位寄存器會(huì)依據(jù) Channel-Width 自動(dòng)地把數(shù)據(jù)從 Master-SSPBUF 里通過 Master-SDO 管腳搬運(yùn)到 Slave 設(shè)備里的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的數(shù)據(jù)移入 Slave-SSPBUF里.
? ?? ???通常情況下, Bus-Width 總是會(huì)大于或等于 Channel-Width, 這樣能保證不會(huì)出現(xiàn)因 Master 與 Slave 之間數(shù)據(jù)交換的頻率比地址總線與 Master 之間的數(shù)據(jù)交換頻率要快, 導(dǎo)致 SSPBUF 里面存放的數(shù)據(jù)為無效數(shù)據(jù)這樣的情況.
?????? ?SSPBUF.
? ?? ?? ???
?
? ?? ?? ? 我們知道, 在每個(gè)時(shí)鐘周期內(nèi), Master 與 Slave 之間交換的數(shù)據(jù)其實(shí)都是 SPI 內(nèi)部移位寄存器從 SSPBUF 里面拷貝的. 我們可以通過往 SSPBUF 對(duì)應(yīng)的寄存器 (Tx-Data / Rx-Data register) 里讀寫數(shù)據(jù), 間接地操控 SPI 設(shè)備內(nèi)部的 SSPBUF.
? ?? ?? ? 例如, 在發(fā)送數(shù)據(jù)之前, 我們應(yīng)該先往 Master 的 Tx-Data 寄存器寫入將要發(fā)送出去的數(shù)據(jù), 這些數(shù)據(jù)會(huì)被 Master-SSPSR 移位寄存器根據(jù) Bus-Width 自動(dòng)移入 Master-SSPBUF 里, 然后這些數(shù)據(jù)又會(huì)被 Master-SSPSR 根據(jù) Channel-Width 從 Master-SSPBUF 中移出, 通過 Master-SDO??管腳傳給 Slave-SDI 管腳,??Slave-SSPSR 則把從??Slave-SDI 接收到的數(shù)據(jù)移入 Slave-SSPBUF 里.??與此同時(shí), Slave-SSPBUF 里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width), 通過 Slave-SDO 發(fā)往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的數(shù)據(jù)移入 Master-SSPBUF.在單次數(shù)據(jù)傳輸完成之后, 用戶程序可以通過從 Master 設(shè)備的 Rx-Data 寄存器讀取 Master 設(shè)備數(shù)據(jù)交換得到的數(shù)據(jù).
? ?? ?Controller.
? ?? ?? ???
?
? ?? ?? ? Master 設(shè)備里面的 Controller 主要通過時(shí)鐘信號(hào)(Clock Signal)以及片選信號(hào)(Slave Select Signal)來控制 Slave 設(shè)備. Slave 設(shè)備會(huì)一直等待, 直到接收到 Master 設(shè)備發(fā)過來的片選信號(hào), 然后根據(jù)時(shí)鐘信號(hào)來工作.
? ?? ?? ? Master 設(shè)備的片選操作必須由程序所實(shí)現(xiàn). 例如: 由程序把 SS/CS 管腳的時(shí)鐘信號(hào)拉低電平, 完成 SPI 設(shè)備數(shù)據(jù)通信的前期工作; 當(dāng)程序想讓 SPI 設(shè)備結(jié)束數(shù)據(jù)通信時(shí), 再把 SS/CS 管腳上的時(shí)鐘信號(hào)拉高電平.
?
?
?
Ps:暫時(shí)用不到的概念:?
CPOL: 時(shí)鐘極性, 表示 SPI 在空閑時(shí), 時(shí)鐘信號(hào)是高電平還是低電平. 若 CPOL 被設(shè)為 1, 那么該設(shè)備在空閑時(shí) SCK 管腳下的時(shí)鐘信號(hào)為高電平. 當(dāng) CPOL 被設(shè)為 0 時(shí)則正好相反.
? ?? ???CPHA: 時(shí)鐘相位, 表示 SPI 設(shè)備是在 SCK 管腳上的時(shí)鐘信號(hào)變?yōu)樯仙貢r(shí)觸發(fā)數(shù)據(jù)采樣, 還是在時(shí)鐘信號(hào)變?yōu)橄陆笛貢r(shí)觸發(fā)數(shù)據(jù)采樣. 若 CPHA 被設(shè)置為 1, 則 SPI 設(shè)備在時(shí)鐘信號(hào)變?yōu)橄陆笛貢r(shí)觸發(fā)數(shù)據(jù)采樣, 在上升沿時(shí)發(fā)送數(shù)據(jù). 當(dāng) CPHA 被設(shè)為 0 時(shí)也正好相反.
轉(zhuǎn)載于:https://www.cnblogs.com/daisyuer/p/5708743.html
總結(jié)
- 上一篇: 计算UILabel带行间距的行高
- 下一篇: centos7 keeplive+lvs