【詳解】SPI中的極性CPOL和相位CPHA是什麼以及如何設置
2012-03-0214:34:10| 分類:單片機 | 標籤: |字號大中小 訂閱
版本:2011-08-15
作者:crifan
聯繫方式:green-waste (at) 163.com
【背景】
最近在看關於Silicon Labs的C8051F347的某個驅動中,關於SPI部分初始化的代碼,看到其對於SPI的設置爲CPOL=1,CPHA=0,對於CPOL及CPHA的含義不瞭解,想要搞懂,這兩個參數到底是什麼意思,以及爲何要這麼設置。所以纔去找了SPI的極性和相位的相關資料,整理如下。
【SPI基礎知識簡介】
設備與設備之間通過某種硬件接口通訊,目前存在很多種接口,SPI接口是其中的一種。
SPI中分Master主設備和Slave從設備,數據發送都是由Master控制。
一個master可以接一個或多個slave。
常見用法是一個Master接一個slave,只需要4根線:
SCLK:Serial Clock,(串行)時鐘
MISO:Master In Slave Out,主設備輸入,從設備輸出
MOSI:Master 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,最常見的寫法是CPOL和CPHA,不過也有一些其他寫法,簡單總結如下:
(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的相位和極性】
CPOL和CPHA,分別都可以是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 |
單獨看這張圖,的確很難明白具體含義,所以下面會有更詳細的解釋。
【 CPOL極性】
先說什麼是SCLK時鐘的空閒時刻,其就是當SCLK在數發送8個bit比特數據之前和之後的狀態,於此對應的,SCLK在發送數據的時候,就是正常的工作的時候,有效active的時刻了。
先說英文,其精簡解釋爲:Clock Polarity = IDLE state ofSCK。
再用中文詳解:
SPI的CPOL,表示當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=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對於CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個邊沿:
對於CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;
對於CPOL=1,idle時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;
用圖文形式表示,更加容易看懂:
此處,再多解釋一下可能會遇到的CKP和CKE,其是Microchip的PIC系列芯片中的說法。
(1)CKP是Clock Polarity Select,就是極性=CPOL:
CKP,雖然名字和CPOL不一樣,但是都是指時鐘相位的選擇,定義也一樣:
CKP: Clock Polarity Select bit
1 = Idle state for clock (CK) isa high level
0 = Idle state for clock (CK) isa low level
所以不多解釋。
(2)CKE是Clock Edge Select,就是相位=CPHA:
CKE: SPI Clock Edge Select bit
1 = Transmit occurs on transitionfrom active to Idle clock state
0 = Transmit occurs on transitionfrom Idle to active clock state
意思是
1 =(數據)傳輸發生在時鐘從有效狀態轉到空閒狀態的那一時刻
0 =(數據)傳輸發生在時鐘從空閒狀態轉到有效狀態的那一時刻
其中,數據傳輸的時刻,即圖中標出的“數據transmit傳輸的時刻”,很明顯,該時刻是一個時鐘和下一個時鐘之間交界的地方,對應的不論是上升沿還是下降沿,都與我們前面提到的CPHA=數據採樣的時刻,的邊沿方向所相反。
所以,此處的CKE,正好與CPHA相反。
所以,CKP和CKE所對應的取值的含義爲:
When CKP = 0:
CKE=1 => Data transmitted onrising edge of SCK
CKE=0 => Data transmitted onfalling edge of SCK
When CKP = 1:
CKE=1 => Data transmitted onfalling edge of SCK
CKE=0 => Data transmitted onrising edge of SCK
下面再列出其他一些地方找到的,常見的SPI的四種模式的時序圖,供參考:
【如何看懂和記憶CPOL和CPHA】
所以,關於在其他地方介紹的,看似多麼複雜難懂難記憶的CPOL和CPHA,其實經過上面解釋,就肯容易看懂了:
去看時序圖,如果起始的始終SCLK的電平是0,那麼CPOL=0,如果是1,那麼CPOL=1,
然後看數據採樣時刻,即時序圖數據線上的數據那個矩形區域的中間所對應的位置,對應到上面SCLK時鐘的位置,對應着是第一個邊沿或是第二個邊沿,即CPHA是0或1。(對應的是上升沿還是還是下降沿,要根據對應的CPOL的值,才能確定)。
即:
(1)如何判斷CPOL:SCLK的空閒時候的電壓,是0還是1,決定了CPOL是0還是1;
(2)如何判斷CPHA:而數據採樣時刻對應着的SCLK的電平,是第一個邊沿還是第二個邊沿,對應着CPHA爲0還是1。
SCLK的極性,相位,邊沿之間的內在邏輯關係
SCLK空閒時刻電壓 |
低電平 |
|
CPOL = 0 |
|
高電平 |
|
|
CPOL = 1 |
|
數據採樣時刻,SCLK的edge是第一個還是第二個 |
第一個邊沿 |
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從設備,在空閒的時候,是高電平還是低電平,即決定了CPOL是0還是1;
然後再找到關於設備是在上升沿還是下降沿去採樣數據,這樣就是,在定了CPOL的值的前提下,對應着可以推算出CPHA是0還是1了。
舉例1:
CC2500 - Low-Cost Low-Power 2.4 GHz RFTransceiver的datasheet中SPI的時序圖是:
從圖中可以看到,最開始的SCLK和結束時候的SCLK,即空閒時刻的SCLK,是低電平,推導出CPOL=0,然後可以看到數據採樣的時候,即數據最中間的那一點,對應的是SCLK的第一個邊沿,所以CPHA=0(此時對應的是上升沿)。
舉例2:
SSD1289 - 240 RGB x 320 TFT LCDController Driver的datasheet中提到:
“SDI is shifted into 8-bit shiftregister on every rising edge of SCK in the order of data bit 7, data bit 6 ……data bit 0.”
意思是,數據是在上升沿採樣,所以可以斷定是CPOL=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是至於是哪種模式。
按理來說,接下來應該再去確定SCLK空閒時候是高電平還是低電平,用以確定CPOL是0還是1,但是datasheet中沒有提到這點。
所以,此處,目前不太確定,是兩種模式都支持,還是需要額外找證據卻確定CPOL是0還是1.
(2)可配置的,由軟件自己設定
從設備也是一個SPI控制器,4種模式都支持,此時只要自己設置爲某種模式即可。
然後知道了從設備的模式後,再去將SPI主設備的模式,設置爲和從設備模式一樣,即可。
對於如何配置SPI的CPOL和CPHA的話,不多細說,多數都是直接去寫對應的SPI控制器中對應寄存器中的CPOL和CPHA那兩位,寫0或寫1即可。
舉例:
此處遇到的C8051F347中的SPI就是一個SPI的controller控制器,即支持軟件配置CPOL和CPHA的值,四種模式都支持,此處C8051F347作爲SPI從設備,設置了CPOL=1,CPHA=0的模式,因此,此處對應主芯片Blackfin F537中的SPI控制器,作爲Master主設備,其SPI的模式也要設置爲CPOL=1,CPHA=0。
【待解決問題】
對於軟件去如何設置主設備(和從設備)的CPOL和CPHA的值,是搞懂了,知道兩者要匹配纔可以正常通訊,但是對於CPOL和CPHA這四種模式,不同的模式之間,相對來說有何優缺點,比如是否哪種模式更穩定,數據更不容易出錯等等,還是不清楚,如果有懂行的,還請告知:green-waste (at) 163.com
【總結】
1. IT方面的資料,國內的,還是把問題講明白的太少,想搞懂問題,還是得去找英文的。
2.有問題,指望別人,還是不行的,凡事還是得指望自己,纔有用。
【引用資料】
1. 精解SPI的CPHA時鐘相位與CPLK時鐘極性
http://wenku.baidu.com/view/f493727d27284b73f24250bf.html
2. Serial Peripheral InterfaceBus
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
3. SPI Background
http://www.totalphase.com/support/kb/10045/
4. SPI 的時鐘配置
http://www.cublog.cn/u3/97851/showart_2304968.html
5. SPI CPHA/CPOL confusion
http://mbed.org/forum/mbed/topic/1031/?page=1#comment-4958
6. SPI通信協議
http://blog.csdn.net/huichengongzi/article/details/6621538
7. 68HC08 Serial PeripheralInterface (SPI) Module
http://www.not2fast.com/electronics/6808/09SPI.pdf
8. CC2500 Low-Cost Low-Power 2.4GHz RF Transceiver
http://www.ti.com/lit/ds/symlink/cc2500.pdf
9. SSD1289 240 RGB x 320 TFT LCDController Driver
http://www.micro4you.com/files/STM32/SSD1289.pdf
10. Microchip SPI Overview
http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf
11. MSSP Module Silicon/DataSheet Errata
http://ww1.microchip.com/downloads/en/DeviceDoc/80131e.pdf
12. ECT 357 - Master Synchronous Serial Port(MSSP) Overview
http://academic.udayton.edu/markpatterson/ECT357/Lecture%2013%20SPI.ppt