今天接到面試電話,很是激動,bulabulabulabula說了一堆,開始面試了,問了一些問題,都答上來了,然后說什么應聘嵌入式硬件工程師,我說軟件工程師,然后就開始問軟件了,就問了spi(泥煤,半年多都沒怎么寫軟件程序了,立馬答不上來了,bulabu又是一會,對不起你面試不通過),哎,沒通過也就算了,突然覺得備受打擊,其實也凸顯自身的不足,軟件放下那么久,好多都忘了,要慢慢再撿起來了,下面就復習一下SPI了。
串行外設接口 (SPI) 總線是一種運行於全雙工模式下的同步串行數據鏈路。用於在單個主節點和一個或多個從節點之間交換數據。
SPI 總線實施簡單,僅使用四條數據信號線和控制信號線(請參見圖 1)。
圖 1 基本的 SPI 總線
盡管表 1 中的引腳名稱取自 Motorola 公司的 SPI 標准,但特殊集成電路的 SPI 端口名稱通常與圖 1 中所標示的名稱有所不同。
表 1 SPI 引腳名稱分配
SPI 數據速率通常介於 1 到 70 MHz 之間,字節長度范圍從 8 位和 12 位到這些數值的倍數位。
數據傳輸通常會包含一次數據交換。當主節點向從節點發送數據時,從節點也會向主節點發送數據。為此,主節點的內部移位寄存器和從節點被設置成環形(請參見圖 2)。
圖 2 兩個移位寄存器形成一個內部芯片環形緩沖器
在數據交換之前,主節點和從節點使其內部移位寄存器加載存儲器數據。產生時鍾信號時,主節點會通過 MOSI 線同步輸出其移位寄存器。同時,從節點在 SIMO 處從主節點讀取第一位,並將其存儲到存儲器中,然后通過 SOMI 輸出 MSB。主節點會在 MISO 處讀取從節點的第一位,並將其存儲到存儲器中以待稍后處理。整個過程將一直持續,直至交換完所有數據位,然后主節點使時鍾空閑並通過 /SS 禁用從節點。
除設置時鍾頻率之外,主節點還會配置相對於數據的時鍾極性和時鍾相位。這兩個選項分別稱作 CPOL 和 CPHA,能夠允許時鍾信號實現 180 度相移且數據延遲半個時鍾周期。圖 3 顯示了相應的時序圖。
圖 3 時鍾極性和相位的時序圖
CPOL = 0 時,時鍾在邏輯 0 處空閑:
- 如果 CPHA = 0,數據會在 SCK 的上升沿上讀取,在下降沿上變化。
- 如果 CPHA = 1,數據會在 SCK 的下降沿上讀取,在上升沿上變化。
CPOL = 1時,時鍾在邏輯高電平處空閑:
- 如果 CPHA = 0,數據會在 SCK的下降沿上讀取,在上升沿上變化。
- 如果 CPHA = 1,數據會在 SCK 的上升沿上讀取,在下降沿上變化。
圖 4 主節點與獨立從節點(左)以及菊花鏈式從節點(右)進行通信
從節點獨立尋址時,主節點必須提供多個從選擇信號。該結構一般用在數據采集系統中,其中的多個模數轉換器 (ADC) 和數模轉換器 (DAC) 都必須單獨接入。
SPI總線協議介紹(詳見http://blog.csdn.net/ce123_zhouwei/article/details/6897293)
SPI接口是Motorola 首先提出的全雙工三線同步串行外圍接口,采用主從模式(Master Slave)架構;支持多slave模式應用,一般僅支持單Master。時鍾由Master控制,在時鍾移位脈沖下,數據按位傳輸,高位在前,低位在后(MSB first);SPI接口有2根單向數據線,為全雙工通信,目前應用中的數據速率可達幾Mbps的水平。總線結構如下圖所示。

SPI接口共有4根信號線,分別是:設備選擇線、時鍾線、串行輸出數據線、串行輸入數據線。

(2)MISO:主器件數據輸入,從器件數據輸出
(3)SCLK :時鍾信號,由主器件產生
(4)/SS:從器件使能信號,由主器件控制
三、內部結構

在SPI操作中,最重要的兩項設置就是時鍾極性(CPOL或UCCKPL)和時鍾相位(CPHA或UCCKPH)。時鍾極性設置時鍾空閑時的電平,時鍾相位設置讀取數據和發送數據的時鍾沿。
主機和從機的發送數據是同時完成的,兩者的接收數據也是同時完成的。所以為了保證主從機正確通信,應使得它們的SPI具有相同的時鍾極性和時鍾相位。
SPI接口時鍾配置心得:在主設備這邊配置SPI接口時鍾的時候一定要弄清楚從設備的時鍾要求,因為主設備這邊的時鍾極性和相位都是以從設備為基准的。因此在時鍾極性的配置上一定要搞清楚從設備是在時鍾的上升沿還是下降沿接收數據,是在時鍾的下降沿還是上升沿輸出數據。
SPI接口在內部硬件實際上是兩個簡單的移位寄存器,傳輸的數據為8位,在主器件產生的從器件使能信號和移位脈沖下,按位傳輸,高位在前,低位在后。如下圖所示,在SCLK的下降沿上數據改變,上升沿一位數據被存入移位寄存器。

在一個SPI時鍾周期內,會完成如下操作:
1) 主機通過MOSI線發送1位數據,從機通過該線讀取這1位數據;
2) 從機通過MISO線發送1位數據,主機通過該線讀取這1位數據。
這是通過移位寄存器來實現的。如下圖所示,主機和從機各有一個移位寄存器,且二者連接成環。隨着時鍾脈沖,數據按照從高位到低位的方式依次移出主機寄存器和從機寄存器,並且依次移入從機寄存器和主機寄存器。當寄存器中的內容全部移出時,相當於完成了兩個寄存器內容的交換。

六、優缺點
SPI接口具有如下優點:
1) 支持全雙工操作;
2) 操作簡單;
3) 數據傳輸速率較高。
同時,它也具有如下缺點:
1) 需要占用主機較多的口線(每個從機都需要一根片選線);
2) 只支持單個主機。
3) 沒有指定的流控制,沒有應答機制確認是否接收到數據。SPI時序詳解(詳見http://blog.csdn.net/ce123_zhouwei/article/details/6895408)
SPI總線有四種工作方式(SP0, SP1, SP2, SP3),其中使用的最為廣泛的是SPI0和SPI3方式。SPI模塊為了和外設進行數據交換,根據外設工作要求,其輸出串行同步時鍾極性和相位可以進行配置,時鍾極性(CPOL)對傳輸協議沒有重大的影響。 如果CPOL=0,串行同步時鍾的空閑狀態為低電平; 如果CPOL=1,串行同步時鍾的空閑狀態為高電平。 時鍾相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行數據傳輸。 如果 CPHA=0,在串行同步時鍾的第一個跳變沿(上升或下降)數據被采樣; 如果CPHA=1,在串行同步時鍾的第二個跳變沿(上升或下降)數據被采樣。



詳解SPI中的極性CPOL和相位CPHA(http://blog.csdn.net/ce123_zhouwei/article/details/6923293)
(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,分別稱為:
(1)Leading edge=前一個邊沿=第一個邊沿,對於開始電壓是1,那么就是1變成0的時候,對於開始電壓是0,那么就是0變成1的時候;
(2)Trailing edge=后一個邊沿=第二個邊沿,對於開始電壓是1,那么就是0變成1的時候(即在第一次1變成0之后,才可能有后面的0變成1),對於開始電壓是0,那么就是1變成0的時候;
本博文采用如下用法:
- 極性=CPOL
- 相位=CPHA
- SCLK=時鍾
- 第一個邊沿和第二個邊沿


CPOL極性
先說什么是SCLK時鍾的空閑時刻,其就是當SCLK在發送8個bit比特數據之前和之后的狀態,於此對應的,SCLK在發送數據的時候,就是正常的工作的時候,有效active的時刻了。其英文精簡解釋為:Clock Polarity = IDLE state of SCK。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時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;

如何判斷CPOL和CPHA
(2)如何判斷CPHA:而數據采樣時刻對應着的SCLK的電平,是第一個邊沿還是第二個邊沿,對應着CPHA為0還是1。

