劉夢(mèng)影,王芬芬
(中國(guó)電子科技集團(tuán)公司第五十八研究所,江蘇無(wú)錫 214072)
現(xiàn)如今,數(shù)字技術(shù)高速發(fā)展,許多芯片或作為核心器件用于數(shù)據(jù)交換,具有承上啟下的數(shù)據(jù)交換樞紐作用,或用于集成電路之間進(jìn)行數(shù)據(jù)存儲(chǔ)和顯示等[1]。為適應(yīng)通信環(huán)境和高速的通信速率要求,通常使用多個(gè)微處理器完成信號(hào)的收發(fā)處理,因此需要一種高效的數(shù)據(jù)總線快速有效地完成它們之間大量的數(shù)據(jù)交換。因此,設(shè)計(jì)一個(gè)高效快速的通信接口是至關(guān)重要的[2]。
串行外圍設(shè)備接口SPI總線技術(shù)是Motorola公司推出的一種微處理器、微控制器以及外設(shè)間的串行數(shù)據(jù)接口標(biāo)準(zhǔn)[3],主要用于擴(kuò)展外設(shè)和進(jìn)行數(shù)據(jù)交換[4]。SPI接口連線簡(jiǎn)單,配置靈活,傳輸效率高[5],因此應(yīng)用廣泛,很多器件如E2PROM、FLASH、實(shí)時(shí)時(shí)鐘、A/D轉(zhuǎn)換器等都用到了SPI接口[6]。郭艾華[7]設(shè)計(jì)了一種可靈活配置為主/從設(shè)備,設(shè)置傳輸速率,支持DMA功能并適用于多種時(shí)鐘模式的SPI協(xié)議IP核,但從機(jī)片選信號(hào)只可由主機(jī)輸出,存在一定的局限性。李琦、賀明等[8]以微處理器S3C2440和嵌入式Linux操作系統(tǒng)組成的嵌入式系統(tǒng)作為開(kāi)發(fā)平臺(tái),設(shè)計(jì)了一款基于ARM嵌入式系統(tǒng)的SPI驅(qū)動(dòng)程序,該設(shè)計(jì)存在兩組8位移位寄存器,支持傳輸8位數(shù)據(jù),但未有效地運(yùn)用硬件資源。王玨文、金偉信等[9]將FPGA編程的靈活性和SPI總線的易用性結(jié)合,實(shí)現(xiàn)了FLASH的存取功能,SPI支持的工作模式較為單一。史星晟、王黎明[10]等采用msp430f149系列單片機(jī)作為主控,將數(shù)據(jù)通過(guò)SPI接口高速傳輸給無(wú)線傳輸模塊,該SPI接口僅支持8位數(shù)據(jù)流與外設(shè)相互通信。朱道山[2]提出一種新型的可復(fù)用SPI接口設(shè)計(jì)方案,解決了SPI無(wú)法由從設(shè)備發(fā)起通信以及傳輸無(wú)反饋的不足,該設(shè)計(jì)僅驗(yàn)證了SPI作為發(fā)送端或接收端的通信,未實(shí)現(xiàn)全雙工通信。為實(shí)現(xiàn)MCU和外部設(shè)備的高速通信,本文基于APB總線設(shè)計(jì)的一種SPI接口解決了上述設(shè)計(jì)中存在的問(wèn)題。
文章首先簡(jiǎn)要闡述SPI的功能特點(diǎn);其次描述了SPI模塊的設(shè)計(jì)框架,且較為詳細(xì)地分析主要子模塊的工作原理,本文設(shè)計(jì)的SPI接口具有1個(gè)16位復(fù)用移位寄存器,節(jié)省硬件資源的同時(shí)提高了數(shù)據(jù)傳輸?shù)恼w速率,而且主設(shè)備根據(jù)狀態(tài)機(jī)控制產(chǎn)生時(shí)鐘,工作更加靈活。此外該設(shè)計(jì)不僅可配置為主/從設(shè)備,支持多種通信模式,結(jié)合多樣性的通信格式和通信時(shí)序能滿足更為復(fù)雜的外設(shè)通信要求。最后,采用Verilog HDL語(yǔ)言進(jìn)行RTL設(shè)計(jì),通過(guò)仿真驗(yàn)證了該設(shè)計(jì)的有效性和高效性。
SPI總線系統(tǒng)是一種同步串行外設(shè)接口,其允許MCU和外部設(shè)備同步串行通信,支持半雙工通信、全雙工通信和簡(jiǎn)單通信等工作模式,從而進(jìn)行數(shù)據(jù)接收與發(fā)送,將串行數(shù)據(jù)轉(zhuǎn)化為并行數(shù)據(jù),或?qū)⒉⑿袛?shù)據(jù)轉(zhuǎn)化為串行數(shù)據(jù)。通常,SPI通過(guò)4個(gè)引腳與外部設(shè)備連接。MISO為主設(shè)備輸入引腳或從設(shè)備輸出引腳,通常用于從設(shè)備的數(shù)據(jù)發(fā)送或主設(shè)備的數(shù)據(jù)接收;MOSI為主設(shè)備輸出或從設(shè)備輸入引腳,此引腳一般用于主設(shè)備的數(shù)據(jù)發(fā)送或從設(shè)備的數(shù)據(jù)接收;SCK作為主設(shè)備的串行時(shí)鐘輸出引腳或從設(shè)備串行時(shí)鐘輸入引腳;NSS則為從設(shè)備的片選引腳。
SPI模塊與外部設(shè)備進(jìn)行通信時(shí),根據(jù)工作要求可配置MASTR設(shè)定SPI工作為主設(shè)備或從設(shè)備;配置BIDIMODE、BIDIOE和RXONLY設(shè)定SPI的通信模式為全雙工模式、半雙工僅發(fā)送、半雙工僅接收、簡(jiǎn)單通信僅發(fā)送或簡(jiǎn)單通信僅接收。主設(shè)備可配置BR進(jìn)而控制數(shù)據(jù)傳輸頻率。
此外,時(shí)鐘信號(hào)的極性(CPOL)和相位(CPHA)的任意配置致使SPI擁有4種傳輸時(shí)序,傳輸時(shí)序見(jiàn)圖1。當(dāng)CPOL=1、CPHA=1,即數(shù)據(jù)采樣點(diǎn)位時(shí)鐘上升沿,該時(shí)刻的數(shù)據(jù)為有效數(shù)據(jù);當(dāng)CPOL=0、CPHA=1,時(shí)鐘下降沿的采樣數(shù)據(jù)為有效數(shù)據(jù)。
圖1 數(shù)據(jù)傳輸時(shí)序圖
本文基于APB接口設(shè)計(jì)SPI,MCU可通過(guò)APB總線對(duì)SPI模塊進(jìn)行寄存器配置、數(shù)據(jù)讀寫(xiě)和中斷處理等操作,SPI接口則能夠使MCU與外設(shè)接口進(jìn)行數(shù)據(jù)串行通信。
SPI接口的系統(tǒng)結(jié)構(gòu)如圖2所示,包括發(fā)送數(shù)據(jù)寄存器、接收數(shù)據(jù)寄存器、移位寄存器、主設(shè)備時(shí)鐘生成器以及控制邏輯部分?;谠撓到y(tǒng)結(jié)構(gòu)設(shè)計(jì)SPI電路,本文設(shè)計(jì)的SPI架構(gòu)如圖3所示,端口信號(hào)包括APB總線信號(hào)以及4個(gè)引腳的輸入信號(hào)、輸出信號(hào)及其輸出使能信號(hào),其中主要子模塊包括APB接口模塊、控制邏輯模塊。SPI內(nèi)部寄存器及功能描述在表1中簡(jiǎn)要列出。
圖2 系統(tǒng)結(jié)構(gòu)圖
圖3 設(shè)計(jì)架構(gòu)圖
表1 SPI寄存器描述
APB接口模塊主要負(fù)責(zé)SPI寄存器的讀寫(xiě)操作;控制邏輯模塊的功能則較為復(fù)雜,主要涉及主設(shè)備產(chǎn)生串行時(shí)鐘,移位寄存器串并轉(zhuǎn)換數(shù)據(jù)、端口信號(hào)控制和狀態(tài)信號(hào)控制等。
3.2.1 主設(shè)備時(shí)鐘發(fā)生器控制
當(dāng)且僅當(dāng)SPI工作于主設(shè)備,則可產(chǎn)生并輸出串行時(shí)鐘SCK。如果該主模設(shè)備發(fā)送數(shù)據(jù),且Tx_DR中已存入待發(fā)數(shù)據(jù),那么主設(shè)備產(chǎn)生并輸出時(shí)鐘,否則無(wú)時(shí)鐘產(chǎn)生;如果該模塊僅接收數(shù)據(jù),則連續(xù)產(chǎn)生并輸出時(shí)鐘。由于SPI工作模式存在多樣性以及數(shù)據(jù)發(fā)送存在隨機(jī)性,因此本文設(shè)計(jì)了一個(gè)狀態(tài)機(jī)控制主機(jī)產(chǎn)生時(shí)鐘與否。主模塊時(shí)鐘發(fā)生器狀態(tài)圖如圖4所示。該狀態(tài)機(jī)共包括6個(gè)狀態(tài),分別為:IDEL空閑狀態(tài);READY準(zhǔn)備狀態(tài),即該SPI配置為主模式,但還未使能;TRANS_TX數(shù)據(jù)發(fā)送狀態(tài),即SPI工作為發(fā)送端或全雙工模式時(shí),數(shù)據(jù)經(jīng)過(guò)移位寄存器通過(guò)總線與接收端進(jìn)行通信;TRANS_RX數(shù)據(jù)接收狀態(tài),即SPI工作為接收端;STOP_PRE即將進(jìn)入停止?fàn)顟B(tài),即SPI被關(guān)閉,但數(shù)據(jù)傳輸還未完全結(jié)束;STOP停止?fàn)顟B(tài)。
圖4 主機(jī)時(shí)鐘發(fā)生狀態(tài)機(jī)
如果當(dāng)前狀態(tài)為T(mén)RANS_TX或TRANS_RX或STOP_PRE,則允許主設(shè)備產(chǎn)生時(shí)鐘。狀態(tài)之間的跳轉(zhuǎn)及其跳轉(zhuǎn)條件在表2中簡(jiǎn)要地進(jìn)行了闡述。
表2 狀態(tài)機(jī)跳轉(zhuǎn)條件
3.2.2 移位寄存器傳輸控制
移位寄存器傳輸結(jié)構(gòu)不僅受SPI工作模式影響,且與數(shù)據(jù)幀格式相關(guān)。
如果配置數(shù)據(jù)收發(fā)順序?yàn)镸SB首先收發(fā)(LSBFIRST=0),那么移位寄存器傳輸結(jié)構(gòu)如圖5所示。假設(shè)SPI工作模式配置為主設(shè)備的全雙工模式,數(shù)據(jù)幀位寬N,待發(fā)送數(shù)據(jù)從移位寄存器的第N-1位串行輸出至MOSI_OUT;同時(shí),待接收數(shù)據(jù)串行通過(guò)MISO_IN輸入至移位寄存器第0位。經(jīng)過(guò)N-1個(gè)有效時(shí)鐘周期,移位寄存器完成移位;最終發(fā)送數(shù)據(jù)串行輸出至MOSI_OUT,且待接收數(shù)據(jù)并行鎖存置Rx_DR,從而完成數(shù)據(jù)串/并轉(zhuǎn)換。
圖5 移位寄存器傳輸結(jié)構(gòu)(LSBFIRST=0)
如果配置數(shù)據(jù)收發(fā)順序?yàn)長(zhǎng)SB首先收發(fā)(LSBFIRST=1),那么移位寄存器傳輸結(jié)構(gòu)則在圖6中繪出。工作原理與上述情況相似,但是接收的數(shù)據(jù)從移位寄存器的第15位串行輸入,而待發(fā)送的數(shù)據(jù)則從移位寄存器第(15-N+1)位串行輸出。
圖6 位寄存器傳輸結(jié)構(gòu)(LSBFIRST=1)
3.2.3 端口信號(hào)控制
結(jié)合模塊引腳和圖3,SPI模塊4個(gè)引腳可由對(duì)應(yīng)輸入信號(hào)、輸出信號(hào)以及輸出使能信號(hào)共同控制。各端口信號(hào)表示含義及其信號(hào)允許輸入或輸出的工作模式在表3中簡(jiǎn)要列出。
本設(shè)計(jì)采用Verilog HDL編寫(xiě),使用ModelSim軟件進(jìn)行功能仿真,并用Debussy軟件聯(lián)合調(diào)試并觀察波形。為實(shí)現(xiàn)主從設(shè)備通信仿真,例化一個(gè)SPI與外設(shè)進(jìn)行通信。針對(duì)SPI的全雙工通信、半雙工通信和簡(jiǎn)單通信三種工作模式,同時(shí)結(jié)合不同的通信格式和時(shí)序,分別進(jìn)行仿真。
表3 端口信號(hào)控制描述
圖7為SPI配置為主設(shè)備、全雙工通信的仿真波形,片選信號(hào)NSS由軟件配置,數(shù)據(jù)位寬為8位。配置CPOL=0,CPHA=0,因此在SPI_SCK上升沿采樣數(shù)據(jù)。從仿真圖中可發(fā)現(xiàn),從機(jī)片選信號(hào)由軟件配置,未占用NSS端口;此外,主設(shè)備不連續(xù)地發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸時(shí)進(jìn)入TRANS_TX狀態(tài)并產(chǎn)生SCK時(shí)鐘,否則進(jìn)入READY狀態(tài)等待新的數(shù)據(jù)發(fā)送且不產(chǎn)生SPI_SCK時(shí)鐘;主設(shè)備將spi_tdr的數(shù)據(jù)通過(guò)SPI_MOSI向從機(jī)串行發(fā)送數(shù)據(jù),主設(shè)備通過(guò)SPI_MISO接收從機(jī)發(fā)送的數(shù)據(jù)并存入spi_rdr,主設(shè)備的spi_tdr與spi_rdr的數(shù)據(jù)分別與從設(shè)備的spi_rdr和從機(jī)的spi_tdr數(shù)據(jù)一致。
圖7 全雙工仿真波形
當(dāng)SPI配置為主設(shè)備半雙工僅發(fā)送模式,NSS由硬件配置并使能CRC計(jì)算功能,數(shù)據(jù)位寬為16位,配置CPOL=1,CPHA=0,因此在SPI_SCK下降沿采樣數(shù)據(jù)。其仿真波形如圖8所示,主設(shè)備通過(guò)SPI_NSS輸出低電平至從設(shè)備,且連續(xù)發(fā)送數(shù)據(jù)和時(shí)鐘,因此一直處于TRANS_TX狀態(tài),主設(shè)備通過(guò)SPI_MOSI將spi_tdr中的數(shù)據(jù)串行向從設(shè)備發(fā)送,最后一個(gè)數(shù)據(jù)則發(fā)送txcrc中的CRC校驗(yàn)碼,從設(shè)備能夠正確接收到主設(shè)備發(fā)送的數(shù)據(jù)以及與自身計(jì)算一致的CRC校驗(yàn)碼。
如果SPI配置為從設(shè)備簡(jiǎn)單通信僅接收模式,數(shù)據(jù)位寬 16位,配置 CPOL=0,CPHA=1,因此在SPI_SCK下降沿采樣數(shù)據(jù)。從圖9的波形可發(fā)現(xiàn),從設(shè)備的狀態(tài)一致處于IDEL,未產(chǎn)生時(shí)鐘,且能夠正確地接收來(lái)自外設(shè)主設(shè)備的數(shù)據(jù)并存入spi_rdr。
圖8 半雙工仿真波形
圖9 簡(jiǎn)單通信仿真波形
本文運(yùn)用Verilog HDL設(shè)計(jì)并實(shí)現(xiàn)了基于APB總線的SPI接口,通過(guò)SPI總線實(shí)現(xiàn)高速通信的系統(tǒng)。本文設(shè)計(jì)的SPI接口具有1個(gè)16位復(fù)用移位寄存器,不僅節(jié)省硬件資源,更能夠提升數(shù)據(jù)通信的整體速率。此外,該SPI接口允許全雙工、半雙工和簡(jiǎn)單通信等多種工作模式,并支持多樣化通信格式和通信時(shí)序,確保通信可靠性的同時(shí)具有更靈活的通信方式,能夠滿足復(fù)雜多變的外設(shè)通信要求;最后通過(guò)仿真驗(yàn)證了該設(shè)計(jì)的可靠性。
參考文獻(xiàn):
[1]易志明,林凌,郝麗宏,李樹(shù)靖.SPI串行總線接口及其實(shí)現(xiàn)[J].自動(dòng)化與儀器儀表,2002,6(104)∶45-48.
[2]朱道山.一種可復(fù)用的SPI接口設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù),2017,50(2)∶389-392.
[3]高谷剛,羅春.可復(fù)用SPI模塊IP核的設(shè)計(jì)與驗(yàn)證[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2004(11)∶5-8.
[4]趙新雨,許忠仁,付貴增,朱文偉.基于FPGA與單片機(jī)的SPI接口的實(shí)現(xiàn)[J].工業(yè)儀表與自動(dòng)化裝置,2010(2)∶32-33.
[5]汪永琳,丁一.一種3線制半雙工SPI接口設(shè)計(jì)[J].集成電路設(shè)計(jì)與開(kāi)發(fā),2010,35(5)∶482-484.
[6]匡春雨,馬琪,陳科明.用于SoC的SPI接口設(shè)計(jì)與驗(yàn)證[J].現(xiàn)代電子技術(shù),2013,36(24)∶149-151.
[7]郭艾華.基于APB總線接口的SPI協(xié)議IP核的設(shè)計(jì)與驗(yàn)證[J].無(wú)線互聯(lián)科技,2013(11)∶132-134.
[8]李琦,賀明,董利民,董健.基于ARM嵌入式系統(tǒng)的SPI驅(qū)動(dòng)程序[J].微型機(jī)與應(yīng)用,2011,30(5)∶5-8.
[9]王玨文,金偉信,蔡一兵,顏莉萍.基于FPGA的SPI總線接口的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010,33(14)∶102-104.
[10]史星晟,王黎明,韓焱,姚金杰,王飛.基于硬件SPI總線的高速無(wú)線傳輸系統(tǒng)的設(shè)計(jì)[J].算法設(shè)計(jì)與應(yīng)用,2012,20(12)∶3315-3316.