一種運(yùn)行于全雙工模式下的同步串行數(shù)據(jù)SPI總線鏈路介紹
SPI 是由摩托羅拉(Motorola)公司開(kāi)發(fā)的全雙工同步串行總線,是微處理控制單元(MCU)和外圍設(shè)備之間進(jìn)行通信的同步串行端口。主要應(yīng)用在EEPROM、Flash、實(shí)時(shí)時(shí)鐘(RTC)、數(shù)模轉(zhuǎn)換器(ADC)、網(wǎng)絡(luò)控制器、MCU、數(shù)字信號(hào)處理器(DSP)以及數(shù)字信號(hào)解碼器之間。SPI 系統(tǒng)可直接與各個(gè)廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,一般使用4 條線:串行時(shí)鐘線SCK、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI 和低電平有效的從機(jī)選擇線SSEL。
在討論SPI 數(shù)據(jù)傳輸時(shí),必須明確以下兩位的特點(diǎn)及功能:(1) CPOL: 時(shí)鐘極性控制位。該位決定了SPI總線空閑時(shí)SCK 時(shí)鐘線的電平狀態(tài)。CPL=0,當(dāng)SPI總線空閑時(shí),SCK 時(shí)鐘線為低電平。CPL=1,當(dāng)SPI總線空閑時(shí),SCK 時(shí)鐘線為高電平。(2) CPHA: 時(shí)鐘相位控制位。該位決定了SPI總線上數(shù)據(jù)的采樣位置。CPHA=0,SPI總線在時(shí)鐘線的第1個(gè)跳變沿處采樣數(shù)據(jù)。CPHA= 1,SPI總線在時(shí)鐘線的第2個(gè)跳變沿處采樣數(shù)據(jù)。
行外設(shè)接口 (SPI) 總線是一種運(yùn)行于全雙工模式下的同步串行數(shù)據(jù)鏈路。用于在單個(gè)主節(jié)點(diǎn)和一個(gè)或多個(gè)從節(jié)點(diǎn)之間交換數(shù)據(jù)。SPI 總線實(shí)施簡(jiǎn)單,僅使用四條數(shù)據(jù)信號(hào)線和控制信號(hào)線(請(qǐng)參見(jiàn)圖 1)。
圖 1 基本的 SPI 總線
盡管表 1 中的引腳名稱取自 Motorola 公司的 SPI 標(biāo)準(zhǔn),但特殊集成電路的 SPI 端口名稱通常與圖 1 中所標(biāo)示的名稱有所不同。
表 1 SPI 引腳名稱分配
SPI 數(shù)據(jù)速率通常介于 1 到 70 MHz 之間,字節(jié)長(zhǎng)度范圍從 8 位和 12 位到這些數(shù)值的倍數(shù)位。
數(shù)據(jù)傳輸通常會(huì)包含一次數(shù)據(jù)交換。當(dāng)主節(jié)點(diǎn)向從節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),從節(jié)點(diǎn)也會(huì)向主節(jié)點(diǎn)發(fā)送數(shù)據(jù)。為此,主節(jié)點(diǎn)的內(nèi)部移位寄存器和從節(jié)點(diǎn)被設(shè)置成環(huán)形(請(qǐng)參見(jiàn)圖 2)。
圖 2 兩個(gè)移位寄存器形成一個(gè)內(nèi)部芯片環(huán)形緩沖器
在數(shù)據(jù)交換之前,主節(jié)點(diǎn)和從節(jié)點(diǎn)使其內(nèi)部移位寄存器加載存儲(chǔ)器數(shù)據(jù)。產(chǎn)生時(shí)鐘信號(hào)時(shí),主節(jié)點(diǎn)會(huì)通過(guò) MOSI 線同步輸出其移位寄存器。同時(shí),從節(jié)點(diǎn)在 SIMO 處從主節(jié)點(diǎn)讀取第一位,并將其存儲(chǔ)到存儲(chǔ)器中,然后通過(guò) SOMI 輸出 MSB。主節(jié)點(diǎn)會(huì)在 MISO 處讀取從節(jié)點(diǎn)的第一位,并將其存儲(chǔ)到存儲(chǔ)器中以待稍后處理。整個(gè)過(guò)程將一直持續(xù),直至交換完所有數(shù)據(jù)位,然后主節(jié)點(diǎn)使時(shí)鐘空閑并通過(guò) /SS 禁用從節(jié)點(diǎn)。
除設(shè)置時(shí)鐘頻率之外,主節(jié)點(diǎn)還會(huì)配置相對(duì)于數(shù)據(jù)的時(shí)鐘極性和時(shí)鐘相位。這兩個(gè)選項(xiàng)分別稱作 CPOL 和 CPHA,能夠允許時(shí)鐘信號(hào)實(shí)現(xiàn) 180 度相移且數(shù)據(jù)延遲半個(gè)時(shí)鐘周期。圖 3 顯示了相應(yīng)的時(shí)序圖。
圖 3 時(shí)鐘極性和相位的時(shí)序圖
CPOL = 0 時(shí),時(shí)鐘在邏輯 0 處空閑:
如果 CPHA = 0,數(shù)據(jù)會(huì)在 SCK 的上升沿上讀取,在下降沿上變化。
如果 CPHA = 1,數(shù)據(jù)會(huì)在 SCK 的下降沿上讀取,在上升沿上變化。
CPOL = 1時(shí),時(shí)鐘在邏輯高電平處空閑:
如果 CPHA = 0,數(shù)據(jù)會(huì)在 SCK的下降沿上讀取,在上升沿上變化。
如果 CPHA = 1,數(shù)據(jù)會(huì)在 SCK 的上升沿上讀取,在下降沿上變化。
圖 4 主節(jié)點(diǎn)與獨(dú)立從節(jié)點(diǎn)(左)以及菊花鏈?zhǔn)綇墓?jié)點(diǎn)(右)進(jìn)行通信
從節(jié)點(diǎn)獨(dú)立尋址時(shí),主節(jié)點(diǎn)必須提供多個(gè)從選擇信號(hào)。該結(jié)構(gòu)一般用在數(shù)據(jù)采集系統(tǒng)中,其中的多個(gè)模數(shù)轉(zhuǎn)換器 (ADC) 和數(shù)模轉(zhuǎn)換器 (DAC) 都必須單獨(dú)接入。
菊花鏈?zhǔn)綇墓?jié)點(diǎn)需要主節(jié)點(diǎn)提供唯一的從選擇信號(hào),因此該結(jié)構(gòu)要求同時(shí)啟用所有從節(jié)點(diǎn),以確保菊花鏈內(nèi)通過(guò)所有移位寄存器的數(shù)據(jù)流不會(huì)中斷。典型的應(yīng)用為工業(yè)級(jí) I/O 模塊中的級(jí)聯(lián)多通道輸入串行器和輸出驅(qū)動(dòng)器。
目前的項(xiàng)目中使用了SPI總線接口的FLASH存儲(chǔ)器存儲(chǔ)圖像數(shù)據(jù)。FLASH的SPI總線頻率高達(dá)66M,但MCU的頻率較低,晶振頻率 7.3728M,SPI最大頻率為主頻1/2。對(duì)于320*240*16的圖像讀取時(shí)間為333ms,而且還忽略了等待SPI傳輸完成、寫顯存、地址坐標(biāo)設(shè)定等時(shí)間。實(shí)際測(cè)試約為1s。成為GUI設(shè)計(jì)的極大瓶頸。由于TFT驅(qū)動(dòng)是自己FPGA設(shè)計(jì)的,資源尚有余量,決定把SPI控制器(主)及寫圖像部分邏輯放入FPGA中用硬件完成。
首先接觸到的是SPI的SCK時(shí)鐘頻率問(wèn)題。FPGA的頻率是48M,未使用PLL。能否以此頻率作為SCK頻率呢?要知道所有的MCU提供的 SPI頻率最大為主頻的1/2!為什么呢?查過(guò)一些資料后發(fā)現(xiàn),SPI從機(jī)接收數(shù)據(jù)并不是以SCK為時(shí)鐘的,而是以主頻為時(shí)鐘對(duì)SCK和MISO進(jìn)行采樣,由采樣原理得知SCK不能大于1/2主頻,也就有了MCU提供最大master頻率是1/2主頻,最大slaver頻率是1/4主頻。FPGA在只作為主機(jī)時(shí)能否實(shí)現(xiàn)同主頻一樣頻率的SCK呢??答案貌似是肯定的!但我還是有點(diǎn)擔(dān)心,用組合邏輯控制SCK會(huì)不會(huì)出現(xiàn)較大毛刺影響系統(tǒng)穩(wěn)定性呢?