1. 程式人生 > >SPI匯流排之CPOL CPHA

SPI匯流排之CPOL CPHA

SPI基礎知識簡介】

裝置與裝置之間通過某種硬體介面通訊,目前存在很多種介面,SPI介面是其中的一種。

SPI中分Master主裝置和Slave從裝置,資料傳送都是由Master控制。

一個master可以接一個或多個slave

常見用法是一個Master接一個slave,只需要4根線:

SCLKSerial Clock,(序列)時鐘

MISOMaster In Slave Out,主裝置輸入,從裝置輸出

MOSIMaster Out  Slave In,主裝置輸出,從裝置輸入

SS:          Slave Select,選中從裝置,片選


SPI由於介面相對簡單(只需要4根線),用途算是比較廣泛,主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字訊號處理器和數字訊號解碼器之間。
即一個SPI的Master通過SPI與一個從裝置,即上述的那些Flash,ADC等,進行通訊。
而主從裝置之間通過SPI進行通訊,首先要保證兩者之間時鐘SCLK要一致,互相要商量好了,要匹配,否則,就沒法正常通訊了,即保證時序上的一致才可正常訊。
而這裡的SPI中的時鐘和相位,指的就是SCLk時鐘的特性,即保證主從裝置兩者的時鐘的特性一致了,以保證兩者可以正常實現SPI通訊。

SPI相關的縮寫或說法】

先簡單說一下,關於SPI中一些常見的說法:

SPI的極性Polarity和相位Phase,最常見的寫法是CPOLCPHA,不過也有一些其他寫法,簡單總結如下:

(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時鐘)極性

(2) CKPHA (Clock Phase)   = CPHA = PHA = Phase = (時鐘)相位

(3) SCK=SCLK=SPI的時鐘

(4) Edge=邊沿,即時鐘電平變化的時刻,即上升沿(rising edge)或者下降沿(falling edge)

對於一個時鐘週期內,有兩個

edge,分別稱為:

Leading edge=前一個邊沿=第一個邊沿,對於開始電壓是1,那麼就是1變成0的時候,對於開始電壓是0,那麼就是0變成1的時候;

Trailing edge=後一個邊沿=第二個邊沿,對於開始電壓是1,那麼就是0變成1的時候(即在第一次1變成0之後,才可能有後面的0變成1),對於開始電壓是0,那麼就是1變成0的時候;


本文采用如下用法:

極性=CPOL

相位=CPHA

SCLK=時鐘

第一個邊沿和第二個邊沿


SPI的相位和極性】

CPOLCPHA,分別都可以是0或時1,對應的四種組合就是:

Mode 0 CPOL=0, CPHA=0
Mode 1 CPOL=0, CPHA=1
Mode 2 CPOL=1, CPHA=0
Mode 3 CPOL=1, CPHA=1

image001.png

單獨看這張圖,的確很難明白具體含義,所以下面會有更詳細的解釋。

 CPOL極性】

先說什麼是SCLK時鐘的空閒時刻,其就是當SCLK在數傳送8bit位元資料之前和之後的狀態,於此對應的,SCLK在傳送資料的時候,就是正常的工作的時候,有效active的時刻了。


先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK

再用中文詳解:

SPICPOL,表示當SCLK空閒idle的時候,其電平的值是低電平0還是高電平1

CPOL=0,時鐘空閒idle時候的電平是低電平,所以當SCLK有效的時候,就是高電平,就是所謂的active-high

CPOL=1,時鐘空閒idle時候的電平是高電平,所以當SCLK有效的時候,就是低電平,就是所謂的active-low


 CPHA相位】

首先說明一點,capture strobe = latch = read = sample,都是表示資料取樣,資料有效的時刻。

相位,對應著資料取樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,0對應著第一個邊沿,1對應著第二個邊沿。

對於:

CPHA=0,表示第一個邊沿:

對於CPOL=0idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;

對於CPOL=1idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;

CPHA=1,表示第二個邊沿:

對於CPOL=0idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;

對於CPOL=1idle時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;



用圖文形式表示,更加容易看懂:

image002.jpg

此處,再多解釋一下可能會遇到的CKPCKE,其是MicrochipPIC系列晶片中的說法。

1CKPClock Polarity Select,就是極性=CPOL

CKP,雖然名字和CPOL不一樣,但是都是指時鐘相位的選擇,定義也一樣:

CKP: Clock Polarity Select bit

1 = Idle state for clock (CK) is a high level

0 = Idle state for clock (CK) is a low level

所以不多解釋。

2CKEClock Edge Select,就是相位=CPHA

CKE: SPI Clock Edge Select bit

1 = Transmit occurs on transition from active to Idle clock state

0 = Transmit occurs on transition from Idle to active clock state

意思是

1 =(資料)傳輸發生在時鐘從有效狀態轉到空閒狀態的那一時刻

0 =(資料)傳輸發生在時鐘從空閒狀態轉到有效狀態的那一時刻


其中,資料傳輸的時刻,即圖中標出的“資料transmit傳輸的時刻”,很明顯,該時刻是一個時鐘和下一個時鐘之間交界的地方,對應的不論是上升沿還是下降沿,都與我們前面提到的CPHA=資料取樣的時刻,的邊沿方向所相反。

所以,此處的CKE,正好與CPHA相反。


所以,CKPCKE所對應的取值的含義為:

When CKP = 0:

CKE=1 => Data transmitted on rising edge of SCK

CKE=0 => Data transmitted on falling edge of SCK

When CKP = 1:

CKE=1 => Data transmitted on falling edge of SCK

CKE=0 => Data transmitted on rising edge of SCK


下面再列出其他一些地方找到的,常見的SPI的四種模式的時序圖,供參考:

image003.jpg

image004.jpg

【如何看懂和記憶CPOLCPHA

所以,關於在其他地方介紹的,看似多麼複雜難懂難記憶的CPOLCPHA,其實經過上面解釋,就肯容易看懂了:

去看時序圖,如果起始的始終SCLK的電平是0,那麼CPOL=0,如果是1,那麼CPOL=1

然後看資料取樣時刻,即時序圖資料線上的資料那個矩形區域的中間所對應的位置,對應到上面SCLK時鐘的位置,對應著是第一個邊沿或是第二個邊沿,即CPHA01。(對應的是上升沿還是還是下降沿,要根據對應的CPOL的值,才能確定)。

即:

1)如何判斷CPOLSCLK的空閒時候的電壓,是0還是1,決定了CPOL0還是1

2)如何判斷CPHA:而資料取樣時刻對應著的SCLK的電平,是第一個邊沿還是第二個邊沿,對應著CPHA0還是1

SCLK的極性,相位,邊沿之間的內在邏輯關係

SCLK空閒時刻電壓 低電平 CPOL = 0
高電平 CPOL = 1
資料取樣時刻,SCLKedge是第一個還是第二個 第一個邊沿 CPHA = 0 上升沿(開始的電平是低電壓0,而第一個邊沿,只能是從0變到1,即上升沿) 下降沿
第二個邊沿 CPHA = 1 下降沿 上升沿(開始電平是高電平1,第二個邊沿,肯定是從低電平0變到高電平1,因為第一個邊沿肯定是從高電平1,變到低電平0

【軟體中如何設定SPI的極性和相位】

SPI分主裝置和從裝置,兩者通過SPI協議通訊。

而設定SPI的模式,是從裝置的模式,決定了主裝置的模式。

所以要先去搞懂從裝置的SPI是何種模式,然後再將主裝置的SPI的模式,設定和從裝置相同的模式,即可正常通訊。

對於從裝置的SPI是什麼模式,有兩種:

1)固定的,有SPI從裝置硬體決定的

SPI從裝置,具體是什麼模式,相關的datasheet中會有描述,需要自己去datasheet中找到相關的描述,即:

關於SPI從裝置,在空閒的時候,是高電平還是低電平,即決定了CPOL0還是1

然後再找到關於裝置是在上升沿還是下降沿去取樣資料,這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA0還是1了。

舉例1

CC2500 - Low-Cost Low-Power 2.4 GHz RF TransceiverdatasheetSPI的時序圖是:

image006.jpg

從圖中可以看到,最開始的SCLK和結束時候的SCLK,即空閒時刻的SCLK,是低電平,推匯出CPOL=0,然後可以看到資料取樣的時候,即資料最中間的那一點,對應的是SCLK的第一個邊沿,所以CPHA=0(此時對應的是上升沿)。

舉例2

SSD1289 - 240 RGB x 320 TFT LCD Controller Driverdatasheet中提到:

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.

意思是,資料是在上升沿取樣,所以可以斷定是CPOL=0CPHA=0,或者CPOL=1CPHA=1的模式,但是至於是哪種模式。

按理來說,接下來應該再去確定SCLK空閒時候是高電平還是低電平,用以確定CPOL0還是1,但是datasheet中沒有提到這點。

所以,此處,目前不太確定,是兩種模式都支援,還是需要額外找證據卻確定CPOL0還是1.

2)可配置的,由軟體自己設定

從裝置也是一個SPI控制器,4種模式都支援,此時只要自己設定為某種模式即可。

然後知道了從裝置的模式後,再去將SPI主裝置的模式,設定為和從裝置模式一樣,即可。

對於如何配置SPICPOLCPHA的話,不多細說,多數都是直接去寫對應的SPI控制器中對應暫存器中的CPOLCPHA那兩位,寫0或寫1即可。

舉例:

此處遇到的C8051F347中的SPI就是一個SPIcontroller控制器,即支援軟體配置CPOLCPHA的值,四種模式都支援,此處C8051F347作為SPI從裝置,設定了CPOL=1CPHA=0的模式,因此,此處對應主晶片Blackfin F537中的SPI控制器,作為Master主裝置,其SPI的模式也要設定為CPOL=1CPHA=0

【待解決問題】

對於軟體去如何設定主裝置(和 從裝置)的CPOLCPHA的值,是搞懂了,知道兩者要匹配才可以正常通訊,但是對於CPOLCPHA這四種模式,不同的模式之間,相對來說有何優缺點,比如是否哪種模式更穩定,資料更不容易出錯等等,還是不清楚