引言
SPI(Serial peripheral interface——串行設(shè)備接口)是摩托羅拉公司推出的一種同步串行通信接口。用于MCU和外圍擴(kuò)展芯片之間的串行連接,現(xiàn)已發(fā)展成為一種工業(yè)標(biāo)準(zhǔn) 。一路SPI數(shù)據(jù)總線只占用3或4個(gè)I/O(Master Output Slave Input,MOSI; Master InputSlave Output, MISO;Serial Clock,SCK;Chip Select,CS)端口,可以簡(jiǎn)化電路設(shè)計(jì),節(jié)省端口資源,提高設(shè)計(jì)可靠性 。SPI總線主要特點(diǎn):全雙工;可以當(dāng)作主機(jī)或者從機(jī)工作;提供頻率可編程時(shí)鐘;發(fā)送結(jié)束中斷標(biāo)志;寫沖突保護(hù);總線競(jìng)爭(zhēng)保護(hù)等?;谝陨咸攸c(diǎn)結(jié)合FPGA的特性,通過將SPI總線與FPGA相結(jié)合,可使SPI總線的應(yīng)用更加靈活多變,為解決通信技術(shù)問題提供更好的選擇和可行方案。
結(jié)合已交付的項(xiàng)目的經(jīng)驗(yàn)(項(xiàng)目中主設(shè)備采用ARM芯片,從設(shè)備采用FPGA),探討基于FPGA的SPI總線傳輸方案在實(shí)際中的應(yīng)用,拓展SPI技術(shù)的應(yīng)用范圍,同時(shí)對(duì)設(shè)計(jì)中遇到的具體問題提出了有效的解決方案。
1、系統(tǒng)分析和設(shè)計(jì)
系統(tǒng)的SPI總線連接如圖1所示。系統(tǒng)中的各從設(shè)備可以按照實(shí)際需要,實(shí)時(shí)采集不同的狀態(tài)數(shù)據(jù)信息,并按SPI總線通信方式上報(bào)給主設(shè)備,主設(shè)備將最終的處理結(jié)果上報(bào)PC端,從而實(shí)現(xiàn)對(duì)系統(tǒng)的實(shí)時(shí)監(jiān)控。
從設(shè)備需要采集的數(shù)據(jù)種類繁多,相對(duì)于使用單片機(jī)的單線程串行的工作方式來進(jìn)行多種數(shù)據(jù)采集處理的工作方案,使用FPGA的工作方式顯然是更優(yōu)的選擇(并行處理能力、運(yùn)行速度快、管腳多、體積小,同時(shí)具有處理復(fù)雜問題的邏輯功能),從集成性、可靠性、兼容性等方面綜合考慮,很明顯最佳的設(shè)計(jì)方案就是從設(shè)備使用FPGA進(jìn)行數(shù)據(jù)采集、處理。
主設(shè)備主要向從設(shè)備發(fā)送查詢指令,同時(shí)將采集到的數(shù)據(jù)進(jìn)行有效性判斷并上傳電腦。相對(duì)于從設(shè)備來說,主設(shè)備處理過程比較簡(jiǎn)單,選擇較靈活、功耗低的ARM嵌入式最為合適。并且ARM具有現(xiàn)成的SPI接口驅(qū)動(dòng)供開發(fā)者使用,大大降低了開發(fā)成本。
2、系統(tǒng)時(shí)序
時(shí)序是通信系統(tǒng)中首要考慮的因素之一,時(shí)序無誤才能保證數(shù)據(jù)在傳輸、處理過程中的有效性,使系統(tǒng)保持正常的工作狀態(tài)。根據(jù)時(shí)序的不同,SPI總線有4種工作模式(SPI0,SPI1,SPI2,SPI3),見圖2,其中SPI0和SPI3兩種工作模式使用的最廣泛。通過配置系統(tǒng)的SPI總線的時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)可得到滿足傳輸要求的工作模式。
當(dāng)CPOL=0,串行同步時(shí)鐘的空閑狀態(tài)為低電平;當(dāng)CPOL=1,串行同步時(shí)鐘的空閑狀態(tài)為高電平??梢?,CPOL對(duì)于SPI總線傳輸協(xié)議沒有較大的影響。
傳輸協(xié)議的模式選擇主要通過配置時(shí)鐘相位(CPHA)實(shí)現(xiàn)。當(dāng)CPHA=0,在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;當(dāng)CPHA=1,在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。確保SPI主、從設(shè)備之間的正常通信,就必須滿足二者的時(shí)鐘相位和時(shí)鐘極性一致 [4] 。
現(xiàn)以某項(xiàng)目(采用SPI0模式)為例,選擇其中1路SPI總線并對(duì)其時(shí)序進(jìn)行詳細(xì)闡述。時(shí)序圖如圖3。
片選信號(hào)cs在主設(shè)備發(fā)送數(shù)據(jù)前跳變?yōu)榈碗娖?,使被選中的從設(shè)備SPI通信端口開啟;從設(shè)備完成數(shù)據(jù)發(fā)送的一段時(shí)間后,片選信號(hào)cs跳變回高電平,從設(shè)備SPI通信端口關(guān)閉。主設(shè)備發(fā)送查詢/控制命令的數(shù)據(jù)幀長(zhǎng)度為a個(gè)字節(jié),每個(gè)字節(jié)包含8位有效數(shù)據(jù),每位數(shù)據(jù)占用一個(gè)時(shí)鐘脈沖信號(hào);當(dāng)有數(shù)據(jù)發(fā)送時(shí),sck伴有對(duì)應(yīng)的同步時(shí)鐘信號(hào),無數(shù)據(jù)發(fā)送則無時(shí)鐘脈沖信號(hào)。同時(shí),相鄰字節(jié)間存在時(shí)間間隔t,在t時(shí)間內(nèi)sck無時(shí)鐘脈沖,即同步時(shí)鐘信號(hào)是一份一份的,每份包含8個(gè)時(shí)鐘脈沖。
因此,一幀完整的查詢/控制指令,其數(shù)據(jù)中的每個(gè)字節(jié)占用8個(gè)時(shí)鐘信號(hào),主設(shè)備發(fā)送一條幀長(zhǎng)度為a字節(jié)的數(shù)據(jù)需要8×a個(gè)時(shí)鐘脈沖信號(hào);假設(shè)從設(shè)備的緩存模塊fifo和發(fā)送模塊datatx完成對(duì)應(yīng)的數(shù)據(jù)反饋過程所需最少時(shí)鐘脈沖信號(hào)個(gè)數(shù)為8×n。為保證系統(tǒng)的通信功能正常,sck傳輸?shù)臅r(shí)鐘脈沖數(shù)應(yīng)不少于該SPI總線完成一次查詢/控制所需時(shí)鐘信號(hào)個(gè)數(shù)(8×(a+n))。
3、技術(shù)難點(diǎn)及解決方案
3.1 數(shù)據(jù)同步
從圖3的SPI時(shí)序圖可看出,有數(shù)據(jù)才有時(shí)鐘脈沖,總線的時(shí)鐘不是連續(xù)而是一份一份的(每份為8個(gè)連續(xù)時(shí)鐘信號(hào)),為了保證系統(tǒng)能正常通訊,必須確保數(shù)據(jù)在主、從設(shè)備中同步傳輸,這就增加了系統(tǒng)在數(shù)據(jù)傳輸過程中的難度。
就從設(shè)備而言,必須滿足從設(shè)備在接收/發(fā)送狀態(tài)下,經(jīng)過每一份時(shí)鐘信號(hào)中接收/發(fā)送的都是的一個(gè)完整且有效的字節(jié)。即主設(shè)備發(fā)送數(shù)據(jù)的每個(gè)有效字節(jié)的第1位都是在第(8×x-7)個(gè)時(shí)鐘信號(hào)(x為整數(shù),0《x《a)被從設(shè)備的接收模塊采樣(上升沿采樣,下同),然后依次采樣直至該字節(jié)的最后一位在第(8×x)個(gè)時(shí)鐘信號(hào)被采樣。同時(shí),要求主設(shè)備接收數(shù)據(jù)的每個(gè)字節(jié)的第1位都是在第(8×y-7)個(gè)時(shí)鐘信號(hào)輸出(y為整數(shù),n》y》a),然后依次采樣直至該字節(jié)的最后一位在第(8×y)個(gè)時(shí)鐘信號(hào)輸出完畢,如圖5所示。
為了實(shí)現(xiàn)數(shù)據(jù)同步,可以采用如下方式:
(1) 從設(shè)備利用片選信號(hào)cs復(fù)位清零。通過片選信號(hào)cs的下降沿,觸發(fā)從設(shè)備中的數(shù)據(jù)采集模塊datarx、數(shù)據(jù)緩存模塊fifo及數(shù)據(jù)發(fā)送模塊datatx的計(jì)數(shù)清零,確保系統(tǒng)在片選有效后的第一個(gè)時(shí)鐘脈沖開始計(jì)數(shù),避免因計(jì)數(shù)錯(cuò)誤造成數(shù)據(jù)采樣失效。若采用第一個(gè)時(shí)鐘脈沖進(jìn)行計(jì)數(shù)清零,會(huì)使數(shù)據(jù)的采集滯后1位,以致采集到無效數(shù)據(jù),造成通訊失效。
(2) 利用時(shí)鐘信號(hào)sck計(jì)數(shù)。本文SPI總線采用SPI0工作模式,利用時(shí)鐘信號(hào)sck的上升沿觸發(fā)采集模塊內(nèi)部計(jì)數(shù)器計(jì)數(shù),確保模塊的數(shù)據(jù)采樣同步,獲得有效數(shù)據(jù)。
(3) 從設(shè)備中的數(shù)據(jù)發(fā)送模塊datatx提前發(fā)送數(shù)據(jù)。
假設(shè)數(shù)據(jù)發(fā)送模塊datatx在數(shù)據(jù)發(fā)送過程中,某字節(jié)的第1位在第(8×y-7)個(gè)時(shí)鐘信號(hào)輸出(y為整數(shù),n》y》a,時(shí)鐘信號(hào)的上升沿輸出數(shù)據(jù),下同),第八位在第(8×y)個(gè)時(shí)鐘信號(hào)輸出,那么將會(huì)出現(xiàn)如圖6所示的情況。
由于總線采用SPI0工作模式,那么主設(shè)備將通過同步時(shí)鐘信號(hào)的上升沿觸發(fā)數(shù)據(jù)采集,此時(shí)采集到的數(shù)據(jù)正處于電平跳變中,以致主設(shè)備采集到不確定的無效數(shù)據(jù)。
結(jié)合圖6可以發(fā)現(xiàn),datatx模塊通過提前發(fā)送數(shù)據(jù),能有效的解決該問題,數(shù)據(jù)傳輸示意圖如下。
當(dāng)datatx模塊在發(fā)送某個(gè)字節(jié)時(shí),利用上一字節(jié)的最后一個(gè)時(shí)鐘脈沖(第(8×y-8)個(gè)時(shí)鐘脈沖)的下降沿觸發(fā)該字節(jié)第1位的發(fā)送,第(8×y-7)個(gè)時(shí)鐘脈沖的下降沿觸發(fā)該字節(jié)第2位的發(fā)送,直至該字節(jié)第8位在第(8×y-1)個(gè)時(shí)鐘脈沖的下降沿發(fā)送完畢。使用這種方法,主設(shè)備在每個(gè)sck時(shí)鐘信號(hào)的上升沿都能同步采集到正確的數(shù)據(jù),確??偩€通信正常。
3.2 多個(gè)從設(shè)備并聯(lián)的問題
筆者在調(diào)試過程中,系統(tǒng)連接板上只接入1臺(tái)主設(shè)備和1臺(tái)從設(shè)備,系統(tǒng)能正常運(yùn)行。但在接入多個(gè)從設(shè)備后(從設(shè)備的接口類型一致),會(huì)出現(xiàn)一個(gè)或者幾個(gè)從設(shè)備工作失效。具體表現(xiàn)為從設(shè)備沒有任何信息反饋,且故障無規(guī)律可循:
a)與從設(shè)備插入插槽的位置沒有特定規(guī)律。例如,有A、B兩臺(tái)從設(shè)備,連接板有5個(gè)插槽(編號(hào)1-5)。A插入1,B插入2,此時(shí)B失效。將B依次換至剩余插槽,可能會(huì)出現(xiàn)B失效、A失效,甚至兩者失效的情況。然而,在A、B都能正常運(yùn)行的情況下,互調(diào)A、B位置,也可能出現(xiàn)上述三種失效現(xiàn)象。或者將從設(shè)備B換成完全相同的從設(shè)備C,這種新的組合相較于之前A+B的組合,在接入方式完全相同的情況下又可能產(chǎn)生不同的結(jié)果。
b)與從設(shè)備的插入數(shù)量沒有特定規(guī)律。連接板上從設(shè)備數(shù)量的增加或者減少,對(duì)整個(gè)系統(tǒng)的好壞并沒有特定方向的影響。加上插槽位置對(duì)系統(tǒng)工作的影響也很復(fù)雜。
為了解決這個(gè)問題,筆者做過如下依次嘗試,但情況并沒有發(fā)生好轉(zhuǎn),從設(shè)備依舊沒有任何信號(hào)輸出:
a)將待機(jī)狀態(tài)的從設(shè)備輸出置高阻;
b)I/O設(shè)置上/下拉電阻;
最終筆者通過對(duì)設(shè)備內(nèi)部的信號(hào)輸入至信號(hào)處理部份采用SIGNALTAP進(jìn)行實(shí)時(shí)分析、觀察,發(fā)現(xiàn)數(shù)據(jù)處理模塊fifo在固定位置丟失一個(gè)同步時(shí)鐘脈沖(fifo的所有觸發(fā)只與同步時(shí)鐘sck有關(guān))。經(jīng)過分析,決定在fifo中加入異步時(shí)鐘參與觸發(fā)和計(jì)數(shù),故障現(xiàn)象沒有再次發(fā)生,多個(gè)從設(shè)備并聯(lián)的問題得到了有效解決。
4、結(jié)論
利用ARM+FPGA模式搭建了SPI總線,使SPI接口技術(shù)的使用更加靈活多變,豐富了系統(tǒng)的I/O數(shù)量,增強(qiáng)了系統(tǒng)的數(shù)據(jù)處理能力,拓展了SPI技術(shù)的應(yīng)用范圍,實(shí)現(xiàn)了系統(tǒng)數(shù)據(jù)的長(zhǎng)期可靠傳輸,為后端用戶的決策提供了穩(wěn)定可靠的理論依據(jù)。
責(zé)任編輯:gt
評(píng)論
查看更多