李漢青
(徐州科亞機(jī)電有限公司 江蘇省徐州市 221700)
串行通信是通信雙方使用一條信號(hào)線對(duì)二進(jìn)制位進(jìn)行傳輸?shù)囊环N通信方法。串行通信作為一種靈活、方便、可靠的通信技術(shù),長(zhǎng)期以來被廣泛應(yīng)用在信息技術(shù)及工業(yè)控制領(lǐng)域。串行通信要求通信雙方遵守相同的串口協(xié)議。一般來講,串行通信方式一次只能實(shí)現(xiàn)兩個(gè)設(shè)備之間的點(diǎn)對(duì)點(diǎn)傳輸,若需要局部端的多個(gè)設(shè)備和主機(jī)端的一個(gè)設(shè)備進(jìn)行通信則需要主機(jī)端的設(shè)備依次和局部端的設(shè)備連接實(shí)現(xiàn),通常使用專用的器件來實(shí)現(xiàn)該需求,但由于串行通信標(biāo)準(zhǔn)多,靈活性大,就目前而言,還不能夠提供將局部端多路串行數(shù)據(jù)合成一路發(fā)送給主機(jī)端,將主機(jī)端的一路高速串行數(shù)據(jù)分解成多路并自動(dòng)發(fā)給局部端指定設(shè)備的收發(fā)器件。為此,本文介紹一種基于FPGA 的一對(duì)多路的串行通信方法及系統(tǒng)。
整個(gè)系統(tǒng)要實(shí)現(xiàn)的功能是將局部端的多路數(shù)據(jù),一般是多個(gè)功能模塊采集的數(shù)據(jù)在本地端進(jìn)行處理,將這些數(shù)據(jù)合并成一路數(shù)據(jù),通過一路高速串行通信借口發(fā)送到主機(jī)端。同時(shí),主機(jī)端的數(shù)據(jù),通過高速串行通信接口發(fā)送到本地端,本地端對(duì)接收到的數(shù)據(jù)進(jìn)行分析、處理,并將數(shù)據(jù)發(fā)送給主機(jī)指定的各個(gè)模塊中。這樣就實(shí)現(xiàn)了一路對(duì)多路的雙向通信。
本文所介紹的系統(tǒng)是實(shí)現(xiàn)的1 路對(duì)8 路的系統(tǒng)。在設(shè)計(jì)中,本地端負(fù)責(zé)處理8 個(gè)模塊和主機(jī)端的數(shù)據(jù),8 個(gè)模塊和主機(jī)端都是串行通信接口,因此,本地端需要9 個(gè)UART,其中8 個(gè)和多路的模塊通信,1 個(gè)和主機(jī)通信。對(duì)于通用的MCU 芯片,一般外設(shè)有2對(duì)UART,要實(shí)現(xiàn)9 個(gè)或更多的UART,MCU 無能為力。不過,這樣的需求可以在FPGA 上輕松實(shí)現(xiàn),理論上,只要FPGA 的資源充足,可以實(shí)現(xiàn)足夠多的UART 和其他外設(shè)。本文所介紹的設(shè)計(jì)中采用ALTERA 公司的EP3C10 器件,可以使用Quartus II 開發(fā)軟件包。Quartus II 還包含一個(gè)SOPCBulid 設(shè)計(jì)平臺(tái),用戶可以在該平臺(tái)上設(shè)計(jì)自定義的NIOS II 嵌入式軟核處理器。通過SOPCBuild 的設(shè)置,可以在EP3C10 上實(shí)現(xiàn)一個(gè)有9 個(gè)UARTR 外設(shè)的軟核處理器,正好滿足一對(duì)多的通信需求。
前文中描述了實(shí)現(xiàn)一對(duì)多通信中多個(gè)UART 的總體思想。本部分描述如何在基于FPGA 的NIOS ii 軟核上進(jìn)行數(shù)據(jù)的處理及轉(zhuǎn)發(fā)。
圖1 是要在FPGA 上實(shí)現(xiàn)的系統(tǒng)組成圖。該系統(tǒng)包括兩種端口,主機(jī)端端口和局部端端口。主機(jī)端端口包括主機(jī)端接收器、主機(jī)端發(fā)送器、主機(jī)端接收緩存、主機(jī)端發(fā)送緩存,主機(jī)端數(shù)據(jù)處理控制單元、主機(jī)數(shù)據(jù)處理單元、主機(jī)端發(fā)送控制單元。局部端端口包括8 個(gè)局部端接收器、8 個(gè)局部端發(fā)送器、8 個(gè)局部端接收緩存、8 個(gè)局部端發(fā)送緩存、局部端數(shù)據(jù)處理控制單元、局部數(shù)據(jù)處理單元、局部端發(fā)送控制單元。主機(jī)端端口和局部端端口的接收器、發(fā)送器由NIOS ii 的UART 外設(shè)實(shí)現(xiàn),主機(jī)端和局部端的接收緩存、發(fā)送緩存由NIOS ii 的FIFO 實(shí)現(xiàn),主機(jī)端和局部端的處理單元由基于NIOS II 的C 代碼實(shí)現(xiàn)。
圖1:系統(tǒng)組成圖
圖2:?jiǎn)温沸盘?hào)流示意圖
接收器和發(fā)送器用來收發(fā)數(shù)據(jù),接收緩存用來暫時(shí)存放收到的還未處理的數(shù)據(jù),發(fā)送緩存用來存放處理好將要發(fā)送的數(shù)據(jù)。接收緩存和發(fā)送緩存的大小要結(jié)合數(shù)據(jù)傳輸速率、FPGA 邏輯單元的資源合理設(shè)置。局部端數(shù)據(jù)處理控制單元作用是將接收的數(shù)據(jù)放到各自對(duì)應(yīng)的接收緩存中,并監(jiān)測(cè)各個(gè)接收緩存中的數(shù)據(jù)量,達(dá)到一定數(shù)量時(shí),將數(shù)據(jù)轉(zhuǎn)給局部數(shù)據(jù)處理單元。局部數(shù)據(jù)處理單元按照和主機(jī)約定的協(xié)議打包,并將數(shù)據(jù)存放到主機(jī)發(fā)送緩存中。主機(jī)端發(fā)送控制單元監(jiān)測(cè)主機(jī)發(fā)送緩存中的數(shù)據(jù),當(dāng)數(shù)量達(dá)到某個(gè)值時(shí)就將數(shù)據(jù)寫入主機(jī)端發(fā)送器,數(shù)據(jù)便通過發(fā)送器傳輸?shù)街鳈C(jī)端。主機(jī)根據(jù)協(xié)議可以確認(rèn)接收到的數(shù)據(jù)來自哪個(gè)局部端的模塊。系統(tǒng)和主機(jī)的連接可根據(jù)傳輸?shù)木嚯x選擇合適的串行通信方式,比如RS232、RS485 或CAN 等方式。
圖3:系統(tǒng)工作流程
同樣的,主機(jī)端數(shù)據(jù)處理控制單元負(fù)責(zé)將主機(jī)發(fā)過來的數(shù)據(jù)放入主機(jī)端緩存中,監(jiān)測(cè)其中的數(shù)據(jù)量,達(dá)到一定量的時(shí)候交由主機(jī)數(shù)據(jù)處理單元對(duì)接收的數(shù)據(jù)進(jìn)行解析,根據(jù)協(xié)議對(duì)數(shù)據(jù)進(jìn)行分類,確認(rèn)收到的數(shù)據(jù)是哪個(gè)局部端端口的,并將數(shù)據(jù)寫入對(duì)應(yīng)端口的發(fā)送緩存中。局部端發(fā)送控制單元監(jiān)測(cè)發(fā)送緩存中的數(shù)據(jù),達(dá)到一定量時(shí)寫入對(duì)應(yīng)的發(fā)送器。中。局部端的收發(fā)器對(duì)應(yīng)分散在不同地方的多個(gè)數(shù)據(jù)采集控制模塊,系統(tǒng)和各個(gè)局部端模塊的連接也可以使用多種串行通信方式。
在這種通信方式下,系統(tǒng)和主機(jī)間的協(xié)議保證了數(shù)據(jù)轉(zhuǎn)發(fā)的可靠性。局部端數(shù)據(jù)發(fā)給主機(jī)前的打包中需要包含包頭、長(zhǎng)度、通道標(biāo)識(shí)等信息。主機(jī)通過通道標(biāo)識(shí)來確認(rèn)數(shù)據(jù)是來自于局部端的哪個(gè)設(shè)備。同樣的,主機(jī)接收緩存中的數(shù)據(jù)也是包含了通道標(biāo)識(shí)的數(shù)據(jù)包,主機(jī)數(shù)據(jù)處理單元在解析的時(shí)候根據(jù)通道標(biāo)識(shí),將解析好的數(shù)據(jù)寫入對(duì)應(yīng)的局部發(fā)送緩存中。
局部端發(fā)送控制單元和主機(jī)端發(fā)送控制單元既監(jiān)測(cè)發(fā)送緩存中的數(shù)據(jù)量,同時(shí)監(jiān)測(cè)發(fā)送器狀態(tài),只有在數(shù)據(jù)量達(dá)到設(shè)定值同時(shí)發(fā)送器空閑時(shí)才將數(shù)據(jù)傳給發(fā)送器,向外發(fā)送數(shù)據(jù)。
在主機(jī)端和局部端同時(shí)工作時(shí)就實(shí)現(xiàn)了數(shù)據(jù)的雙向通信。
以下結(jié)合圖2 單路信號(hào)流示意圖、圖3 系統(tǒng)工作流程圖來描述系統(tǒng)工作的過程。主機(jī)接收器或局部接收器對(duì)相應(yīng)的主機(jī)端接口和局部端接口進(jìn)行監(jiān)測(cè),監(jiān)測(cè)接口是否有數(shù)據(jù),沒有數(shù)據(jù)時(shí)則繼續(xù)監(jiān)測(cè)。當(dāng)局部端接口或主機(jī)端接口有數(shù)據(jù)的時(shí)候,接收數(shù)據(jù),并將接收的數(shù)據(jù)傳送到主機(jī)接收緩存或局部端接口對(duì)應(yīng)的緩存中,由局部數(shù)據(jù)處理控制單元或主機(jī)數(shù)據(jù)處理單元監(jiān)測(cè)局部接收緩存和主機(jī)接收緩存中的數(shù)據(jù)量是否達(dá)到設(shè)定值,若沒達(dá)到設(shè)定值,主機(jī)接收緩存和局部接收緩存繼續(xù)接收數(shù)據(jù)。當(dāng)數(shù)據(jù)量達(dá)到設(shè)定值時(shí),將局部接收緩存或主機(jī)接收緩存中的數(shù)據(jù)傳送至局部數(shù)據(jù)處理單元或主機(jī)數(shù)據(jù)處理單元,并由局部數(shù)據(jù)處理單元或主機(jī)數(shù)據(jù)處理單元對(duì)數(shù)據(jù)進(jìn)行處理,并將處理的數(shù)據(jù)發(fā)送至主機(jī)大宋緩存或局部發(fā)送緩存中。同時(shí),主機(jī)數(shù)據(jù)發(fā)送控制單元或局部數(shù)據(jù)發(fā)送控制單元監(jiān)測(cè)主機(jī)發(fā)送緩存或局部發(fā)送緩存中是否有接收到的數(shù)據(jù),若沒有接收到數(shù)據(jù)則繼續(xù)監(jiān)測(cè)。當(dāng)監(jiān)測(cè)到有數(shù)據(jù)時(shí),由局部數(shù)據(jù)處理單元或主機(jī)數(shù)據(jù)處理大怒眼控制主機(jī)發(fā)送緩存或局部發(fā)送緩存中的數(shù)據(jù)發(fā)送至主機(jī)發(fā)送器或局部發(fā)送器,然后由局部數(shù)據(jù)發(fā)送控制單元或主機(jī)數(shù)據(jù)發(fā)送控制單元將主機(jī)發(fā)送器或局部發(fā)送器接收的數(shù)據(jù)發(fā)送到主機(jī)端接口或局部端接口,并通過主機(jī)端接口或著局部端接口將數(shù)據(jù)傳送至微處理器進(jìn)行處理。當(dāng)局部端的多個(gè)局部接收器同時(shí)有數(shù)據(jù)接收時(shí),微處理器控制多個(gè)設(shè)備的數(shù)據(jù)將以中斷方式分別寫入各自對(duì)用的局部接收緩存中,而局部數(shù)據(jù)處理控制單元或主機(jī)數(shù)據(jù)處理控制單元將不剪短的對(duì)局部接收緩存或主機(jī)接收緩存中的數(shù)據(jù)量進(jìn)行查詢和計(jì)算,若某個(gè)或多個(gè)局部接收緩存或主機(jī)緩存中的數(shù)據(jù)量達(dá)到設(shè)定值時(shí)(可根據(jù)緩存大小和傳輸速率設(shè)置為10bytes 左右)。此時(shí)需要啟動(dòng)局部端和主機(jī)端的通信協(xié)議,在數(shù)據(jù)前加上包頭、長(zhǎng)度、和通道標(biāo)識(shí)等信息,完成打包,然后將該完整的數(shù)據(jù)包發(fā)送至主機(jī)發(fā)送緩存或局部發(fā)送緩存中。
由于局部端有多條數(shù)據(jù)傳輸通道,這些通道的數(shù)據(jù)都要發(fā)送到主機(jī)發(fā)送緩存中,因此主機(jī)發(fā)送緩存的空間應(yīng)該盡量大一些,可以容納多個(gè)局部端通道發(fā)送的數(shù)據(jù)。主機(jī)端的主機(jī)發(fā)送控制單元監(jiān)測(cè)主機(jī)發(fā)送緩存和主機(jī)發(fā)送器的工作狀態(tài),當(dāng)主機(jī)發(fā)送緩存中有數(shù)據(jù)且主機(jī)發(fā)送器空閑時(shí),主機(jī)發(fā)送控制單元控制主機(jī)反射緩存將數(shù)據(jù)傳輸給主機(jī)發(fā)送器,并控制主機(jī)發(fā)送器將數(shù)據(jù)發(fā)到主機(jī)端接口。主機(jī)接口通過串行通信方式傳輸給微處理器進(jìn)行處理,微處理器收到數(shù)據(jù)后進(jìn)行解析,根據(jù)通道標(biāo)識(shí)確定收到的數(shù)據(jù)來自于哪個(gè)局部端的設(shè)備。
同時(shí),主機(jī)接收器若接收到主機(jī)端接口的數(shù)據(jù),同樣以中斷方式寫入到主機(jī)接收緩存中,當(dāng)該主機(jī)接收緩存中有數(shù)據(jù),并達(dá)到設(shè)定值時(shí),主機(jī)數(shù)據(jù)處理控制單元啟動(dòng)主機(jī)數(shù)據(jù)處理單元,使主機(jī)數(shù)據(jù)處理單元讀取主機(jī)接收緩存中的數(shù)據(jù),并對(duì)該接收的數(shù)據(jù)進(jìn)行處理,讀出的數(shù)據(jù)中包括包頭、長(zhǎng)度、通道標(biāo)識(shí)等,主機(jī)數(shù)據(jù)處理單元依據(jù)通信協(xié)議對(duì)數(shù)據(jù)包解析,并根據(jù)解析出的通道標(biāo)識(shí)將該包中的數(shù)據(jù)發(fā)送到與指定通道對(duì)應(yīng)的局部發(fā)送緩存中。
當(dāng)主機(jī)端和局部端的數(shù)據(jù)通路同時(shí)工作,實(shí)現(xiàn)雙工通信,而且,多個(gè)局部接收器可以同時(shí)工作來接收局部端的數(shù)據(jù),實(shí)現(xiàn)多路通信。主機(jī)收發(fā)器采用高波特率以實(shí)現(xiàn)高速通信。
這種基于在FPGA 中實(shí)現(xiàn)外設(shè)和NIOSII 內(nèi)核的方式實(shí)現(xiàn)一對(duì)多串行通信的系統(tǒng),具有很高的靈活性、而且成本低廉。理論上,只要FPGA 資源足夠可實(shí)現(xiàn)任意多個(gè)串行接口和多個(gè)設(shè)備連接。
在實(shí)驗(yàn)中的系統(tǒng)中,采用常見的低成本EP3C10 器件實(shí)現(xiàn)了10個(gè)本地設(shè)備端和一個(gè)主機(jī)端的通信,主機(jī)端以5Mbuad 的速率可以可靠運(yùn)行。