基于CAN總線的老化測試系統(tǒng)的設計方案
1.2 軟件設計
1.2.1 串行通信程序設計
通信模塊一方面通過串行通信接收上位機的命令,主要命令有啟動、停止和參數(shù)設置命令。用戶通過參數(shù)設置命令為系統(tǒng)設置不同參數(shù),可以保證老化的正確進行。另一方面通過串行通信向上位機發(fā)送檢測到的數(shù)據(jù)。為簡化設計,通信模塊和上位機的串行通信采用固定長度的信息幀格式,一幀信息包括幀頭、有效數(shù)據(jù)或命令、 CRC16校驗位等。通信模塊接收上位機信息通過中斷方式實現(xiàn)。在中斷服務程序中,每接收到一個幀頭后,開始接收后面若干字節(jié)的信息,經(jīng) CRC16校驗有效后,就認為是一個有效的信息幀,按照約定的串行通信協(xié)議解析該信息幀,取出其中的有效命令。通信模塊每收到一個有效命令幀,向上位機發(fā)送一幀應答信息。為保證通信正確,上位機軟件對通信采用超時機制。
由于通信模塊接收命令和處理命令速度的不同步,為保證上位機發(fā)來的每條命令得到執(zhí)行,需要將有效命令放入到命令緩存隊列的隊尾。該命令緩存隊列采用環(huán)形結構,接收的有效命令被放到隊尾,而主程序從命令緩存隊列的頭部取出一條命令,進行后期處理。為方便從命令緩存隊列存放或存取一條命令,在實現(xiàn)命令緩存隊列時,采用了二維數(shù)組結構,即數(shù)組的每一個元素為一條固定長度的有效命令。通過選取適當?shù)年犃虚L度,可以保證在正常工作中,保證命令緩存隊列不會產(chǎn)生溢出。本設計中,命令緩存隊列的數(shù)據(jù)結構如下:
unsigned char s_queue[QUEUE_LEN][CMD_PACK_LEN];
unsigned char s_front;
unsigned char s_rear;}
通信模塊向上位機發(fā)送檢測數(shù)據(jù)時,按照約定的串行通信協(xié)議把一組完整的檢測數(shù)據(jù)組裝成一個信息幀發(fā)送。為簡化設計,該信息幀的發(fā)送不采用中斷方式,而是采用查詢方式完成。為減少 C8051F040的等待時間,結合 C8051F040的時鐘頻率,串行通信采用了的波特率為 57600bps。經(jīng)過在現(xiàn)場測試,在此波特率下進行串口通信,沒有引起通信的錯誤。
1.2.2 CAN通信程序設計
通信模塊與 10個檢測模塊及 1個溫控模塊通過 CAN總線連接。理論上,在 CAN總線上,任意一個檢測模塊都可以向通信模塊發(fā)送檢測到的數(shù)據(jù),通信控制板模塊可以同時向 10個檢測模塊發(fā)送命令。 CAN總線上的發(fā)送的數(shù)據(jù)幀帶有 ID字段,ID字段的值決定每個數(shù)據(jù)幀的優(yōu)先級,數(shù)據(jù)幀的 ID值越小,該數(shù)據(jù)幀的優(yōu)先級越高。同一時間,在 CAN總線上,不同的節(jié)點,不能發(fā)送相同 ID值的數(shù)據(jù)幀。否則會造成通信錯誤。在本設計中,分配每個檢測模塊 1個固定的 ID值,可以看作該設備的地址編號。這樣不同的設備發(fā)出的數(shù)據(jù)幀具有不同的優(yōu)先級。這樣導致一個問題:如果任由每個檢測模塊主動向通信模塊發(fā)送數(shù)據(jù)幀,會造成 ID值較大的數(shù)據(jù)幀因優(yōu)先級低,而不能發(fā)出。另外,每個檢測模塊的設計也采用了 C8051F040的作為控制核心,一方面完成信號檢測,另一方面完成與通信模塊的 CAN通信。
在 C8051F040的 CAN控制器內(nèi)部有 32個緩沖區(qū),每個緩沖區(qū)為 8字節(jié),每個緩沖區(qū)需要指定一個固定的 ID值。每個緩沖區(qū)可以被設置為發(fā)送緩沖區(qū)或接收緩沖區(qū)。當某個緩沖區(qū)被設置為發(fā)送緩沖區(qū)時,該數(shù)據(jù)幀在底層帶有 ID值。當該緩沖區(qū)被設置為接收緩沖區(qū)時,則僅接收 CAN總線上具有相同 ID值的數(shù)據(jù)幀。
在設計中,通信模塊的 CAN控制器的 32個緩沖區(qū)與 ID值分配如下:第 1至第 10緩沖區(qū)為發(fā)送緩沖區(qū),對應的 ID值 21至 30。第 1緩沖區(qū)用于向第 1個檢測模塊發(fā)送數(shù)據(jù)幀,依次類推,第 10緩沖區(qū)用于向第 10個檢測模塊發(fā)送數(shù)據(jù)幀。第 11緩沖區(qū)為發(fā)送緩沖區(qū),對應 ID值為 31,用于向溫控模塊發(fā)送數(shù)據(jù)幀。第 20緩沖區(qū)至第 30緩沖區(qū)為接收緩沖區(qū),對應 ID值 50至 60。與此對應,則 10個檢測模塊的 CAN控制器的 32個緩沖區(qū)內(nèi)的第 1緩沖區(qū)均為接收緩沖區(qū),分別對應的 ID值是 21至 30。第 2緩沖區(qū)至第 11緩沖區(qū)均為發(fā)送緩沖區(qū),對應的 ID值 50至 60。即 10個檢測模塊發(fā)送的 CAN數(shù)據(jù)幀具有相同的 ID值。采用上述分配的原因在于:每個檢測模塊同時檢測 10個被測電路板,每次有 10個數(shù)據(jù)幀要同時向通信模塊發(fā)送。前提條件,10個檢測模塊不能同時向通信模塊發(fā)送數(shù)據(jù)。
通信控制板和檢測模塊之間通信采用主從應答通信方式。在工作過程中,通信模塊從串口命令緩沖隊列的隊首取出一條命令,進行協(xié)議轉(zhuǎn)換,組裝成 8字節(jié)的 CAN信息幀。其中最后 1個字節(jié)值設為前 7個字節(jié)的 CRC8校驗值,雖然 CAN總線本身具有 CRC校驗,在應用層再次進行校驗,可以提高通信的可靠性。
通信模塊將該 CAN信息幀通過 CAN內(nèi)部第 1緩沖區(qū)發(fā)送,這樣 CAN總線上的第 1個檢測模塊收到該信息幀,該檢測模塊校驗信息幀,如果通過校驗,進一步解析該信息幀。如果是參數(shù)設置命令,則檢測設備提取其中的參數(shù),然后向通信模塊發(fā)送 1個信息幀作為響應。如果是讀數(shù)據(jù)命令,則將 10個被測電路板的參數(shù)組裝成 10個 CAN數(shù)據(jù)幀,分別通過檢測設備的 CAN緩沖區(qū)的第 2至第 11緩沖區(qū)向外發(fā)送,該 10個數(shù)據(jù)幀,僅被總線上的通信模塊接收,分別放在第 20至第 30緩沖區(qū)。通信模塊將這些信息通過串口向上位機發(fā)送。按照同樣的方式,通信模塊與其它 9個檢測模塊及 1個溫控模塊完成 CAN通信,實現(xiàn)了命令的設置與測試信息的獲取。
評論