劉 超,張永龍
(1.航天江南集團有限公司,貴陽 550009;2.貴州航天電子科技有限公司,貴陽 550009)
數據串口通信主要是計算機和外設間或主機系統之間的數據串行傳送。串口通信的數據傳輸的安全性比較高,有著比較強的抗干擾能力。采取基于單片機的數據串口通信方式,正是因其集成度比較高,嵌套也較為方便以及經濟性等特點[1]。通過從理論層面對單片機的數據串口通信進行展開研究分析,就能為單片機數據串口通信的實踐提供依據[2]。串行通信方式具有使用方便、傳輸可靠、信號線數量少等優點,因而倍受青睞[1]。
本課題源于某型調溫控制系統,在調溫系統內部采用了基于FPGA+C8051單片機架構的控制模塊作為內部控制器的核心器件,在FPGA和單片機之間使用串口進行數據交互。在該調溫系統設計中,出現了調溫系統上位機控制軟件從FPGA+C8051單片機模塊中獲取的測溫數據、工作狀態信息數據等出現數據錯誤等異?,F象,使得該調溫系統工作不能達到預期設計要求。為了獲取該調溫系統內部引起數據錯位的原因,開展了該課題的研究。
在該調溫系統設計中,上位機控制軟件通過ModBus TCP通信協議先FPGA+C8051單片機模塊發送控制指令或查詢數據,實現對該調溫系統的自動或手動調溫操作,并通過查詢指令實時監測調溫系統的工作狀態。在該系統設計中,C8051單片機通過控制CP2200實現與上位機控制軟件的通信,FPGA通過控制調溫系統的其他設備,實現系統調溫功能。在FPGA與C8051之間,使用串口進行數據交互,當上位機控制軟件通過以太網通信總線向C8051單片機模塊發送控制指令后,單片機控制串口將控制指令發送FPGA,FPGA控制軟件對指令進行解析后,輸出調溫控制信號,實現調溫控制。同時,在FPGA工作過程中,需要獲取調溫系統的測溫溫度數據和工作狀態信息,故障碼信息等,并通過串口以一定的周期實時向單片機發送。單片機接收到FPGA通過串口發送過來的調溫系統數據信息后,通過以太網數據幀封裝后,將數據發送至上位機控制軟件。
在單片機內部,采用串口接收中斷對串口數據進行處理,當一個串口數據到達時,單片機串口接收中斷標識置位為1,單片機進入中斷處理程序實現對當前串口數據的接收和處理;同時單片機控制CP2200接收上位機的以太網數據信息時,啟動了一個優先級更高的中斷,當該單片機軟件接收到上位機數據后,直接進入以太網接收處理,若此時串口中斷正在執行,則該中斷就被高優先級的中斷打斷,出現中斷嵌套現象,且進入以太網接收中斷處理后,單片機軟件將串口接收中斷關閉,這使得未能實現一幀完整數據接收的單片機控制軟件出現了數據幀拼接,導致數據錯位等異?,F象的出現。
本課題的主要研究單片機串口關閉對一幀完整串口數據幀接收帶來的影響,并通過實驗監測手段驗證串口關閉導致串口數據幀錯位的異?,F象的原因。為使用串口通信的模塊的軟件設計中具有串口關閉的處理措施提供解決方案的借鑒。
在FPGA+C8051控制模塊設計中,FPGA 控制軟件控制軟件作為調溫系統各模塊控制和各模塊信息處理的處理器,FPGA控制軟件采用內嵌軟核CPU(MicroBlaze軟核)實現對FPGA底層邏輯模塊對AD采樣的數據進行浮點計算處理和串口通信控制等處理,FPGA底層邏輯控制模塊實現對調溫系統控制模塊的IO輸入輸出信號控制及AD采集處理等操作。單片機控制軟件通過控制以太網控制芯片CP2200實現對狀態監控計算機1和狀態監控計算機2的上位機軟件的網絡通信,單片機控制軟件與FPGA控制軟件之間采用串口RS232進行短距數據交互。其中,狀態監控計算機的上位機軟件通過以太網接口向單片機控制軟件發送控制指令后,單片機控制軟件將解析后的指令通過RS232接口發送至FPGA控制軟件實現調溫控制。FPGA控制軟件接收到控制指令后,對控制指令進行解析處理,實現對調溫系統的自動調溫或手動調溫控制。FPGA控制軟件的底層,邏輯控制模塊通過采集測溫模塊的溫度信號其其他模塊的工作反饋信號后,組成了調溫系統工作狀態信息,FPGA控制軟件通過RS232總線,以一定的周期,實時向單片機控制軟件發送調溫狀態信息。單片機控制軟件接收到調溫狀態信息后,通過以太網數據幀封裝后,將調溫狀態信息發送至上位機軟件。FPGA和單片機C8051串口通信架構處理模塊如圖1所示。

圖1 FPGA+C8051串口通信架構圖
在本系統設計中,使用美國Silabs公司推出的C8051F系列單片機C8051F040作為通信控制、DA信息轉化、EEPROM存儲數據處理,使用FPGA控制調溫系統的溫度信號采集處理、高速光耦脈沖計數處理,調溫控制信號I/O輸出等操作。
該系統硬件設計中,單片機控制CP2200實現ModBus TCP通信。CP2200集成了IEEE 802.3以太網媒體訪問控制器(MAC)、10Base-T物理層(PHY)和8KB非易失性FLASH存儲器的單芯片以太網控制器。CP2200的8KB片內FLASH存儲器,用于存儲用戶常數、Web服務器內容或作為通用非易失性存儲器。FLASH存儲器的最后6個存儲單元是工廠預編程的唯一48位MAC地址。
單片機通過控制DAC7800實現數模轉換處理,將經過溫度修正處理后的溫度數據輸出到控制臺進行顯示。單片機通過控制微芯公司生產的24LC32存儲芯片實現對調溫系統的調溫修正參數、系統檔案信息、交付測試信息等進行存儲。
在該系統中采用美國Xilinx公司生產的Spartan6系列的XC6SLX16處理芯片進行AD處理、高速光耦脈沖信號檢測處理、I/O控制信號輸出。Spartan6特別適合于高容量的邏輯設計、面向用戶的DSP設計、低成本設計:
1)每個SLICE包含4個LUT和8個flip-flops;
2)每個DSP48A1 slice包含1個18×18乘法器、1個48bit累加器、1個加法器;
3)每個18 KB的Block RAM可以用作2個9 KB的Block RAM;
4)每個CMT包含2個DCM和1個PLL;
5)在-3N 速度等級的器件里沒有存儲器接口(DDR接口)。
FPGA控制AD7606模數轉換芯片,實現對溫度信號的處理,這里選擇了8通道輸出的AD7606模塊,實現多測溫模塊檢測信號的處理,能多維度獲取調溫系統所在的環境溫度的情況,并通過對測溫模塊的溫度綜合處理后,輸出降溫或加熱的控制指令,實現調溫系統對所在環境溫度的控制。
在單片機和FPGA之間使用RS232進行板內通信,該接口用于傳輸單片機通過CP2200從網絡接收的控制指令、存儲器調溫輸出的調溫修正參數等信息;同時,在FPGA控制模塊對測溫溫度和調溫控制狀態信息處理后,通過該串口向單片機模塊發送相應的信息。該系統的硬件設計如圖2所示。

圖2 系統硬件組成框圖
該系統的控制軟件由單片機控制軟件和FPGA控制軟件組成。其中,單片機控制軟件通過CP2200的物理層進行初始處理及DA模塊、EEPROM模塊的初始化處理后,開始讀取EEPROM內存中的溫度修正參數,并通過RS232將溫度修正參數發送至FPGA,FPGA接收溫度修正參數后,實現對讀取AD7606的溫度數據進行修正處理,并將溫度數據、調溫系統的工作狀態信息打包后,通過RS232發送至單片機。單片機控制軟件在接收到CP2200的中斷信息后,進入網絡中斷處理程序,將CP2200網絡物理層緩沖區內的數據讀取后,根據以太網協議對信息進行解析處理,若信息無錯誤,則將信息傳至鏈路層處理模塊進行處理,之后依次將數據經過網絡層(IP層)、傳輸層(TCP層)、應用層(Modbus層)進行解析和處理;若信息為調溫系統控制信息,則單片機將控制信息通過RS232發送至FPGA,FPGA接收控制指令后,對控制指令進行解析,若控制指令為自動控制指令,則調溫系統工作在自動工作狀態下;若指令為手動控制指令,則調溫系統工作在手動工作狀態下。FPAG根據指令輸出調溫系統的控制信號,并檢測調溫系統的反饋信號,生成調溫系統工作狀態信息。在接收到調溫系統查詢指令時,將調溫系統的溫度數據和工作狀態信息通過以太網數據幀封裝后,將數據發送上位機軟件。系統軟件控制流程如圖3所示。

圖3 系統軟件控制框圖
在網絡控制中,單片機C8051F040通過對CP2200復位初始化可以確保設備正常工作。復位開始時,首先要等待復位引腳升高,然后等待振蕩器初始化完成,振蕩器初始化完成后會發送一個中斷信號。通過檢測INT0中斷狀態寄存器確定CP2200初始化是否完成。
在CP2200初始化結束后,單片機通過檢測CP2200的中斷信號,獲取以太網數據,在進入以太網接收中斷程序內,單片機通過讀取CP2200緩沖區內的數據,獲取以太網物理層數據信息。通過對數據信息解析,將數據信息發送至鏈路層進行解析處理,并檢測信息是IP數據包、ARP數據包還是RARP數據包,并通過不同的處理方式對相應的數據包進行處理。若數據包為IP包,則需要判讀數據包為TCP數據包還是ICMP數據包,若為ICMP數據包,則通過Ping程序處理模塊應答處理;若為TCP數據包,則通過應用層的ModBus應用層解析處理后,將數據包根據每一次數據幀的格式進行封裝處理,將數據層層封裝后,通過物理層將數據信息發送至上位機。調溫系統網絡數據包解析流程如圖4所示。

圖4 調溫系統網絡數據包處理流程圖
單片機通過CP2200與上位機進行網絡數據交互過程中,在中斷觸發物理層數據信息接收后,單片機需要定時對TCP層應答信息是否超時進行處理,若出現超時,則需要進行TCP重傳處理。若連接調溫設備的網絡設備在預定的時間沒有與調溫系統進行數據交互,則表示該設備不活動,需要將該設備網絡連接信息清除。對ARP地址解析信息超時,也啟動重傳處理。在ARP緩沖區內,對于MAC地址需要進行超時老化更新的機制,保證ARP地址池空間的使用滿足要求。單片機對網絡信息處理流程如圖5所示。

圖5 網絡信息交互處理流程圖
單片機接收上位機控制指令后,通過RS232將控制指令發送至FPGA,FPGA對指令解析后,輸出調溫系統的控制信號。當控制指令為自動指令時,則FPGA控制調溫系統工作在自動工作狀態下,并通過讀取AD7606的溫度數據進行修正后,將溫度數據作為自動調溫控制的條件,當溫度低于-20 ℃時,則開啟加熱設備實現加熱操作。當溫度數據高于40 ℃時,FPGA輸出壓縮機、風機的工作控制信號,實現降溫操作。調溫系統工作流程如圖6所示。

圖6 系統工作控制流程圖
單片機串口接收數據時,若接收到串口數據,串口接收中斷標志置位,單片機軟件進入串口接收中斷處理程序。在中斷程序內將串口接收中斷標志清零,讀取串口緩沖內的數據,若讀出的數據為第一個幀頭數據正確,則等待進入下一次中斷;若第二個幀頭數據也正確,則進入串口數據保存處理程序塊,串口數據保存在recdata[num]數組內;每次中斷保存一個串口數據,并將recdata[num]數組下標(num)加1,即num+1(檢查中發現在上電初始化中也使用num變量,num的值可能不為零,導致第一次接收數據會出現異常),用于保存下一次中斷接收的數據;當接收和保存12個字節的串口數據后,進入幀尾判讀處理;若幀尾(0xea)正確,則清除接收一幀串口數據的標志和數組下標(bz、num),將保存在數組內的溫度數據和故障碼賦值給以太網數據幀。串口接收中斷處理程序如圖7所示。

圖7 串口接收中斷執行程序圖
在使用FPGA+C8051架構的控制模塊實驗中,出現串口數據幀錯位現象,其異常現象如下:
1)異?,F象一
正常通訊時接收的數據為:00 eb 00 00;
異常通訊時接收的數據為:00 00 eb 00;
2)異常現象二
正常通訊時接收的數據為:00 ec 00 00;
異常通訊時接收的數據為:00 ec ec 00;
為實現串口數據幀錯位問題的解決,系統軟件進行排查和分析處理。
對串口通信數據錯位分析如下:
1)第一種數據異?,F象分析:若串口接收中斷在未接收完一幀完整串口數據幀時,串口接收中斷關閉,在重新開啟串口接收中斷后,則現串口接收數據幀拼接。若拼接數據中出現與幀尾字節相同的數據字,則拼接數據幀異常,出現第一種數據錯位異常機理如圖8所示;(在第1幀數據和第n幀數據中灰色數據為拼接數據,其他數據丟失);

圖8 第一種數據錯位機理圖
2)第二種數據異常現象分析:若串口接收中斷在未接收完一幀完整串口數據幀時,串口接收中斷關閉,在重新開啟串口接收中斷后,則出現串口接收數據幀拼接,且拼接數據與關閉中斷前的數據一致,拼接數據中出現與幀尾一致的數據字,則拼接后的數據形成一幀完整的數據。如圖9所示。

圖9 第二種數據錯位機理圖
通過分析,當單片機接收到查詢指令之后,關閉串口接收中斷。如果關閉中斷時,串口接收中斷未接收一幀完整數據,待串口中斷重新開啟后,后續接收串口數據與關閉中斷前數據出現拼接。當后面的拼接數據中包含有與幀尾標志一致的數據,且拼接后該數據恰好落在幀尾上,則形成一幀完整數據。
由于串口數據幀由15個字節組成,其中包括兩個幀頭和一個幀尾,每接收一個字節產生一次中斷,每次串口接收中斷的間隔時間約為1 ms,接收一幀完整的數據幀(共15個字節)使用的時間約為17.2 ms(如圖10所示)。

圖10 串口數據幀接收時間圖
通過測試,串口進入中斷后,中斷處理程序的最大處理時間為2.7 μs,如圖11所示,中斷處理最大時間遠小于串口數據間隔時間1 ms,不影響下一次串口中斷的觸發,因此排除因素E2。

圖11 串口接收中斷最大處理時間
在處理完一次串口中斷程序后,單片機返回主程序執行。若此時接收到狀態監控計算機的查詢指令,單片機關閉串口中斷(串口中斷允許位清零),將接收的查詢指令通過串口發送至FPGA。進行以太網數據幀封裝,并啟動以太網發送模塊,將以太網數據幀發送至狀態監控計算機。當以太網數據幀發送完畢后,再次開啟中斷。
通過測試,單片機接收到查詢指令后,從串口中斷關閉到中斷開啟的時間約為17 ms,如圖12所示。

圖12 中斷關閉時間圖
在中斷關閉過程中,單片機依次執行了將查詢指令發送至FPGA、封裝以太網數據幀、發送以太網數據幀等操作,其中單片機向FPGA發送查詢指令的時間約為16.5 ms,如圖13所示。

圖13 單片機發送查詢指令至FPGA的時間
將單片機向FPGA發送查詢指令程序段屏蔽后,單片機從接收查詢指令及應答的時間約為300 μs,如圖14所示。

圖14 關閉串口發送后以太網應答時間
通過對以上測試數據分析,單片機接收到狀態計算機的查詢指令后,單片機通過串口向FPGA發送查詢指令,占用了以太網數據幀的應答響應大部分時間。該過程中串口接收中斷處于關閉狀態,不能接收FPGA串口發送的數據幀。當串口接收中斷處理程序未完整接收一幀數據時,如果關閉串口接收中斷就會導致串口接收中斷數據異常。表現為串口中斷將不同的數據幀拼接為一幀完整的數據,導致數據幀異常。為檢查中斷對串口數據接收的影響,單片機程序中,修改程序為:收到幀尾時將P12管腳置位,收到第一個幀頭時P12管腳復位。中斷影響效果如圖15所示。上面波形為接收到也太網數據后,發送到FPGA的串口數據,可表征這個時刻單片機關閉了中斷。

圖15 查詢指令對串口中斷影響圖
通過對以上測試數據的排查和分析,在接收到狀態監控計算機查詢指令后,單片機關閉接收中斷。若關閉中斷時,單片機串口未能接收完一幀完整的數據,導致開啟中斷后,串口中斷將不同的數據幀拼接為一幀完整的數據。如果后面的拼接數據中包含有與幀尾標志(0xea)一致的數據,且正好落入第15個字節上時,則形成一幀正常的完整數據,導致數據異常。
根據串口數據幀的定義,在FPGA串口數據幀中寫入一個與幀尾0xea一致的數據,進行通信試驗驗證。
通過排查分析,串口接收中斷關閉異常和溫度數據中有與幀尾數據(0xea)一致的數據則會出現數據異常,為增加故障頻率,將FPGA內發送到單片機的數據幀更改如下:
bf 80 00 00 00 00 00 00 00 eb 00 00 00 ea ea
4.4.1 故障現象一復現
為加快故障復現,將狀態監控計算機查詢周期5s更改為250 ms,在單片機串口接收中斷幀尾設置監控程序,第一種故障異常的監控程序如下:
if((recdata[8] &0xfe) != 0x00)
P12 = 1;//監控信號置位
else
P12 = 0;//監控信號復位
通過示波器監控單片機P12輸出的波形圖,可以得出在第一種異常數據發生的頻率,通過約20s數據監測,發送第一種數據異常的次數為58次,如圖16所示。由圖16所示,在2s時間間隔內最多出現6次數據異常,最少出現2次數據異常。

圖16 第一種故障出錯頻次圖
在單片機內串口接收中斷幀尾設置如下監控程序,可得出保存串口的數組內的數據:
while(((recdata[8] &0xfe) != 0x00);//故障出現后死循環
通過試驗監測,在單片機軟件內監測,得到異常數據如圖17所示,其中溫度數據和故障碼數據為:00 00 eb 00,與故障現象一致。

圖17 數據錯位1通訊數據包截圖
4.4.2 故障現象二復現
在單片機串口接收中斷幀尾設置監控程序(狀態監控計算機的查詢指令周期為250 ms),第二種故障異常的監控程序如下:
if((recdata[6] == 0x00) &&(recdata[7] == 0xeb) &&((recdata[8] &0xfe) != 0x00))
P12 = 1;//監控信號置位
else
P12 = 0;//監控信號復位
通過示波器監控單片機P12輸出的波形圖,可以得出在第二種異常數據發生的頻率,通過約20s的數據監測,該異常數據共發生41次,監測圖如圖18所示。根據圖18所示,在2 s的時間間隔最多發生6次數據異常,最少發生0次數據異常。

圖18 第二種故障出錯頻次圖
在單片機串口接收中斷幀尾設置如下監控程序,可得出保存串口的數組內的數據:
while((recdata[6] == 0x00) &&(recdata[7] == 0xeb) &&((recdata[8] &0xfe) != 0x00));// 故障出現后死循環
通過試驗監測,在單片機軟件內監測,得到異常數據如圖19所示,其中溫度數據和故障碼數據為:00 eb eb 00,與故障現象一致。

圖19 數據錯位2通訊數據包截圖
根據以上兩種數據異?,F象的分析和試驗驗證,異?,F象分析與試驗現象一致,故障復現。通過串口數據幀中含有與幀尾0xea一致的數據,重新拼接數據幀能形成一幀完整的串口現象,導致串口數據幀錯位。
通過降低串口數據幀中斷關閉時間,僅在串口數據幀將幀內溫度和故障碼數據賦值給以太網數據幀的過程中關閉串口接收中斷。由于串口接收中斷的間隔時間為1 ms,更改后的軟件在中斷關閉時間內僅執行4個字節更新操作,關閉中斷的時間由原來的17.2 ms變為2.7 μs,不影響串口數據的連續接收,不會出現數據幀拼接,有效解決通信數據錯位的異?,F象。
對軟件進行更改后再進行驗證。采用與出現故障時的驗證方法一致,對軟件進行驗證。通過3天的時間進行試驗監測,未檢測到數據幀拼接的現象,串口數據幀監測如圖20所示。

圖20 串口數據幀未出現拼接圖
該異?,F象由關閉串口中斷,導致串口接收數據拼接,單片機控制軟件內除串口接收中斷外,還有定時器0(1 ms定時中斷)和定時器2(16.384 ms定時中斷)兩個中斷。通過對定時器0和定時器2復查和測試,這兩個中斷沒有被關閉現象,同時中斷執行時間均小于20 μs,遠小于串口數據間隔時間1 ms,不會干擾串口中斷的正常執行。通過軟件更改后,可以有效避免該問題。
通過對異常情況處理和驗證后,對調溫系統的工作情況進行實驗驗證,通過上位機軟件向調溫系統發送控制自動控制指令后,調溫系統工作在自動狀態下,在溫度為-21 ℃時,實現了加熱操作,當溫度低于-20 ℃依次實驗,自動加熱均得到驗證。在溫度高于40 ℃時,調溫系統工作在制冷狀態。之后進行手動測試,依次完成了手動加熱、手動制冷測試,均得到驗證。在上位機軟件發送調溫系統查詢軟件,上位機軟件獲取到調溫系統的溫度信息和工作狀態信息。經過以上實驗驗證,調溫系統工作正常,設計功能性能得到驗證。
本文通過優化FPGA+C8051控制模塊串口中斷關閉時間的處理,有效實現了因串口中斷關閉時間過長導致串口數據幀拼接錯位的技術問題。在該模塊的通信數據中,由于單片機串口接收中斷被關閉時間大于一幀串口數據幀接收的時間,導致接收的串口數據幀出現數據幀拼接、錯位的異常情況。通過對串口通信處理方式進行了優化,并減小(小于2.7 μs)關閉串口接收中斷的時間,有效解決了數據幀拼接的異?,F象;提高了對串口接收中斷數據幀拼接異常處理,并進行了系統實驗驗證,FPGA+C8051控制模塊的功能性能均滿足設計要求。該系統設計及驗證的成功,為串口數據幀通信中的拼接異常提供了借鑒。