一種運行于全雙工模式下的同步串行數(shù)據(jù)SPI總線鏈路介紹
SPI 是由摩托羅拉(Motorola)公司開發(fā)的全雙工同步串行總線,是微處理控制單元(MCU)和外圍設備之間進行通信的同步串行端口。主要應用在EEPROM、Flash、實時時鐘(RTC)、數(shù)模轉換器(ADC)、網(wǎng)絡控制器、MCU、數(shù)字信號處理器(DSP)以及數(shù)字信號解碼器之間。SPI 系統(tǒng)可直接與各個廠家生產(chǎn)的多種標準外圍器件直接接口,一般使用4 條線:串行時鐘線SCK、主機輸入/從機輸出數(shù)據(jù)線MISO、主機輸出/從機輸入數(shù)據(jù)線MOSI 和低電平有效的從機選擇線SSEL。
在討論SPI 數(shù)據(jù)傳輸時,必須明確以下兩位的特點及功能:(1) CPOL: 時鐘極性控制位。該位決定了SPI總線空閑時SCK 時鐘線的電平狀態(tài)。CPL=0,當SPI總線空閑時,SCK 時鐘線為低電平。CPL=1,當SPI總線空閑時,SCK 時鐘線為高電平。(2) CPHA: 時鐘相位控制位。該位決定了SPI總線上數(shù)據(jù)的采樣位置。CPHA=0,SPI總線在時鐘線的第1個跳變沿處采樣數(shù)據(jù)。CPHA= 1,SPI總線在時鐘線的第2個跳變沿處采樣數(shù)據(jù)。
行外設接口 (SPI) 總線是一種運行于全雙工模式下的同步串行數(shù)據(jù)鏈路。用于在單個主節(jié)點和一個或多個從節(jié)點之間交換數(shù)據(jù)。SPI 總線實施簡單,僅使用四條數(shù)據(jù)信號線和控制信號線(請參見圖 1)。

圖 1 基本的 SPI 總線
盡管表 1 中的引腳名稱取自 Motorola 公司的 SPI 標準,但特殊集成電路的 SPI 端口名稱通常與圖 1 中所標示的名稱有所不同。

表 1 SPI 引腳名稱分配
SPI 數(shù)據(jù)速率通常介于 1 到 70 MHz 之間,字節(jié)長度范圍從 8 位和 12 位到這些數(shù)值的倍數(shù)位。
數(shù)據(jù)傳輸通常會包含一次數(shù)據(jù)交換。當主節(jié)點向從節(jié)點發(fā)送數(shù)據(jù)時,從節(jié)點也會向主節(jié)點發(fā)送數(shù)據(jù)。為此,主節(jié)點的內部移位寄存器和從節(jié)點被設置成環(huán)形(請參見圖 2)。

圖 2 兩個移位寄存器形成一個內部芯片環(huán)形緩沖器
在數(shù)據(jù)交換之前,主節(jié)點和從節(jié)點使其內部移位寄存器加載存儲器數(shù)據(jù)。產(chǎn)生時鐘信號時,主節(jié)點會通過 MOSI 線同步輸出其移位寄存器。同時,從節(jié)點在 SIMO 處從主節(jié)點讀取第一位,并將其存儲到存儲器中,然后通過 SOMI 輸出 MSB。主節(jié)點會在 MISO 處讀取從節(jié)點的第一位,并將其存儲到存儲器中以待稍后處理。整個過程將一直持續(xù),直至交換完所有數(shù)據(jù)位,然后主節(jié)點使時鐘空閑并通過 /SS 禁用從節(jié)點。
除設置時鐘頻率之外,主節(jié)點還會配置相對于數(shù)據(jù)的時鐘極性和時鐘相位。這兩個選項分別稱作 CPOL 和 CPHA,能夠允許時鐘信號實現(xiàn) 180 度相移且數(shù)據(jù)延遲半個時鐘周期。圖 3 顯示了相應的時序圖。

圖 3 時鐘極性和相位的時序圖
CPOL = 0 時,時鐘在邏輯 0 處空閑:
如果 CPHA = 0,數(shù)據(jù)會在 SCK 的上升沿上讀取,在下降沿上變化。
如果 CPHA = 1,數(shù)據(jù)會在 SCK 的下降沿上讀取,在上升沿上變化。
CPOL = 1時,時鐘在邏輯高電平處空閑:
如果 CPHA = 0,數(shù)據(jù)會在 SCK的下降沿上讀取,在上升沿上變化。
如果 CPHA = 1,數(shù)據(jù)會在 SCK 的上升沿上讀取,在下降沿上變化。

圖 4 主節(jié)點與獨立從節(jié)點(左)以及菊花鏈式從節(jié)點(右)進行通信
從節(jié)點獨立尋址時,主節(jié)點必須提供多個從選擇信號。該結構一般用在數(shù)據(jù)采集系統(tǒng)中,其中的多個模數(shù)轉換器 (ADC) 和數(shù)模轉換器 (DAC) 都必須單獨接入。
菊花鏈式從節(jié)點需要主節(jié)點提供唯一的從選擇信號,因此該結構要求同時啟用所有從節(jié)點,以確保菊花鏈內通過所有移位寄存器的數(shù)據(jù)流不會中斷。典型的應用為工業(yè)級 I/O 模塊中的級聯(lián)多通道輸入串行器和輸出驅動器。
目前的項目中使用了SPI總線接口的FLASH存儲器存儲圖像數(shù)據(jù)。FLASH的SPI總線頻率高達66M,但MCU的頻率較低,晶振頻率 7.3728M,SPI最大頻率為主頻1/2。對于320*240*16的圖像讀取時間為333ms,而且還忽略了等待SPI傳輸完成、寫顯存、地址坐標設定等時間。實際測試約為1s。成為GUI設計的極大瓶頸。由于TFT驅動是自己FPGA設計的,資源尚有余量,決定把SPI控制器(主)及寫圖像部分邏輯放入FPGA中用硬件完成。
首先接觸到的是SPI的SCK時鐘頻率問題。FPGA的頻率是48M,未使用PLL。能否以此頻率作為SCK頻率呢?要知道所有的MCU提供的 SPI頻率最大為主頻的1/2!為什么呢?查過一些資料后發(fā)現(xiàn),SPI從機接收數(shù)據(jù)并不是以SCK為時鐘的,而是以主頻為時鐘對SCK和MISO進行采樣,由采樣原理得知SCK不能大于1/2主頻,也就有了MCU提供最大master頻率是1/2主頻,最大slaver頻率是1/4主頻。FPGA在只作為主機時能否實現(xiàn)同主頻一樣頻率的SCK呢??答案貌似是肯定的!但我還是有點擔心,用組合邏輯控制SCK會不會出現(xiàn)較大毛刺影響系統(tǒng)穩(wěn)定性呢?