《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > CAN總線在野外地震數(shù)據(jù)傳輸中的應(yīng)用
CAN總線在野外地震數(shù)據(jù)傳輸中的應(yīng)用
來(lái)源:電子技術(shù)應(yīng)用2013年第9期
陳 瑛,宋俊磊,王典洪
中國(guó)地質(zhì)大學(xué)(武漢) 機(jī)械與電子信息學(xué)院,湖北 武漢430074
摘要: 野外地震數(shù)據(jù)傳輸和組網(wǎng)技術(shù)是地震臺(tái)網(wǎng)建設(shè)中的重要組成部分,關(guān)系著地震數(shù)據(jù)的實(shí)時(shí)性、有效性等問(wèn)題。采用CAN總線連接分散的地震采集點(diǎn),并利用ARM微處理器、多任務(wù)操作系統(tǒng)Linux和應(yīng)用程序框架Qt共同構(gòu)建地震臺(tái)網(wǎng)局部管理系統(tǒng),大大簡(jiǎn)化了流動(dòng)站管理任務(wù),為組建更大規(guī)模的流動(dòng)采集站提供了可能。
關(guān)鍵詞: ARM CAN總線 野外傳輸 Linux QT
中圖分類號(hào): TH762
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2013)09-0034-04
Application of CAN bus in field seismic data transmission
Chen Ying,Song Junlei,Wang Dianhong
Faculty of Mechanical & Electronic Information,China University of Geosciences,Wuhan 430074,China
Abstract: Technology of transmission and networking on field seismic data is an important part of seismic network,which concerns real-time and effectivity of seismic data.Design of connecting dispersed data acquisition nodes via CAN bus is detailed. A local seismic management system is constructed based on ARM microprocessor, multitask operating system Linux as well as application framework Qt,that simplifies management tasks of mobile station and makes it possible to construct larger-scale mobile station.
Key words : CAN bus;field communication;ARM;Linux;Qt

    目前,地震預(yù)報(bào)的信息來(lái)源主要依靠遍布在各處的地震觀測(cè)臺(tái)站所監(jiān)測(cè)到的地震數(shù)據(jù)。隨著地震觀測(cè)臺(tái)網(wǎng)規(guī)模日益擴(kuò)大,實(shí)時(shí)性和數(shù)據(jù)量的要求也在不斷提高。除了固定的地方地震觀測(cè)臺(tái)站以外,還有大量野外流動(dòng)地震觀測(cè)站。流動(dòng)觀測(cè)站主要對(duì)一定時(shí)間和地區(qū)內(nèi)的數(shù)據(jù)進(jìn)行強(qiáng)化觀測(cè),用以提高監(jiān)測(cè)能力和異常跟蹤能力,并可以針對(duì)多種物理量進(jìn)行采集,將數(shù)據(jù)反饋到臺(tái)網(wǎng)中心[1]。因此,一個(gè)流動(dòng)站常常會(huì)布置數(shù)量眾多而又分散的采集點(diǎn),而如何將這些分散的采集點(diǎn)的數(shù)據(jù)傳輸?shù)降卣鹋_(tái)網(wǎng),是野外流動(dòng)觀測(cè)技術(shù)的關(guān)鍵之一。

    在野外復(fù)雜環(huán)境中,通常將采集節(jié)點(diǎn)數(shù)據(jù)匯總至流動(dòng)站,再由流動(dòng)站統(tǒng)一接入互聯(lián)網(wǎng)。局部數(shù)據(jù)的傳輸方式可有多種選擇,需要綜合考慮距離、便捷性、可靠性及成本等多種因素。本文中設(shè)計(jì)了一種采用控制器局域網(wǎng)(CAN)進(jìn)行地震數(shù)據(jù)傳輸?shù)姆绞?,以滿足分散的采集點(diǎn)能在相對(duì)較廣范圍內(nèi)進(jìn)行組網(wǎng)通信的要求。
1 系統(tǒng)框架
    本文以激光多普勒地震儀項(xiàng)目為背景進(jìn)行系統(tǒng)構(gòu)建,主要解決將分散的采集點(diǎn)進(jìn)行集中管理的問(wèn)題。由于野外采集點(diǎn)數(shù)量眾多,且安裝位置較分散,若都與流動(dòng)站之間直接組建局部網(wǎng)絡(luò)連接,則無(wú)論采用何種組網(wǎng)方式,都必將加重人力、物力的投入,同時(shí)也會(huì)加重流動(dòng)站的管理負(fù)擔(dān)。因此,本文采用中繼站的思想,將一定區(qū)域內(nèi)的采集點(diǎn)利用總線方式匯總到主控機(jī)上,再由主控機(jī)統(tǒng)一將數(shù)據(jù)傳輸?shù)搅鲃?dòng)站,系統(tǒng)結(jié)構(gòu)如圖1所示。采用這種分布式結(jié)構(gòu),一方面可以降低采集點(diǎn)組建網(wǎng)絡(luò)的成本,另一方面主控機(jī)可以取代部分流動(dòng)站的功能,對(duì)本局域網(wǎng)內(nèi)的采集點(diǎn)進(jìn)行管理和監(jiān)控,便于組成規(guī)模更大的野外流動(dòng)站。

    系統(tǒng)采用的控制器局域網(wǎng)(CAN)是一種ISO國(guó)際標(biāo)準(zhǔn)化的串行通信協(xié)議,能有效支持具有很高安全等級(jí)的分布實(shí)時(shí)控制。相對(duì)于其他總線,CAN總線具有傳輸距離遠(yuǎn)、速度較快、抗干擾能力強(qiáng)、介質(zhì)簡(jiǎn)單、可靠性高等優(yōu)勢(shì)[2-3],適合野外無(wú)人值守的環(huán)境。
2 采集節(jié)點(diǎn)的CAN通信實(shí)現(xiàn)
    項(xiàng)目中采集點(diǎn)的主控芯片采用TI公司C54系列DSP,因芯片不帶CAN控制端口,所以要在DSP平臺(tái)上實(shí)現(xiàn)CAN通信節(jié)點(diǎn)的設(shè)計(jì)。
2.1 基于DSP的傳輸節(jié)點(diǎn)設(shè)計(jì)
    項(xiàng)目選取SPI接口的獨(dú)立控制器MCP2515作為總線控制端,收發(fā)器采用帶有隔離的總線收發(fā)器ADM3054,該芯片直接將隔離器和收發(fā)器集成到一起,省去了控制器與收發(fā)器之間的光耦隔離,同時(shí)也可解決控制器與收發(fā)器之間的電平匹配問(wèn)題,簡(jiǎn)化外圍電路設(shè)計(jì)。
    將DSP的多通道緩沖串行口(McBSP)配置成SPI兼容模式,這種模式下每一幀的長(zhǎng)度是固定的。但MCP2515的SPI控制指令長(zhǎng)度并不統(tǒng)一,因此,采取折中方案以最長(zhǎng)的指令位數(shù)來(lái)配置串行口。
    使用SPI模式通信時(shí),關(guān)鍵的問(wèn)題是時(shí)序的匹配,因?yàn)镈SP的工作時(shí)鐘頻率遠(yuǎn)高于SPI傳輸時(shí)鐘頻率,所以需要在讀操作時(shí)加入足夠長(zhǎng)的延時(shí)。圖2中的(a)、(b)可反映這一情況,采用控制器的環(huán)回模式進(jìn)行測(cè)試,DataSend數(shù)組中存放的是發(fā)送的8 B數(shù)據(jù),RecvBuff數(shù)組中存放的則是通過(guò)SPI讀取接收數(shù)據(jù)寄存器得到的值。圖2(a)是沒(méi)有加入足夠延時(shí)的讀操作,從虛線框標(biāo)出的數(shù)據(jù)看出,讀操作在時(shí)間上發(fā)生了錯(cuò)位,當(dāng)前的讀操作實(shí)際讀到的是上一個(gè)指令傳送回來(lái)的數(shù)據(jù),而圖2(b)在加入了足夠長(zhǎng)的延時(shí)之后,能在時(shí)間上對(duì)應(yīng),讀到正確的數(shù)值。

2.2 節(jié)點(diǎn)的通信策略
    CAN協(xié)議所采用的對(duì)報(bào)文進(jìn)行地址編碼的方式便于在總線上增刪節(jié)點(diǎn)。在本項(xiàng)目中,由于各個(gè)節(jié)點(diǎn)都只與主控機(jī)進(jìn)行通信,所以,充分利用CAN報(bào)文幀ID識(shí)別碼的特性,將發(fā)送幀的識(shí)別碼、本節(jié)點(diǎn)的編碼以及本節(jié)點(diǎn)接收濾波器的識(shí)別碼相統(tǒng)一。而主控機(jī)的節(jié)點(diǎn)則可以讀取所有總線上的報(bào)文,所采用的通信策略如圖3所示,這樣的設(shè)計(jì)實(shí)際上就將原先總線式的拓?fù)浣Y(jié)構(gòu)轉(zhuǎn)換成了類似星形拓?fù)涞慕Y(jié)構(gòu),便于主機(jī)管理所有節(jié)點(diǎn)。

3 主控制點(diǎn)的設(shè)計(jì)
    相對(duì)于采集節(jié)點(diǎn)單一的采集處理任務(wù)而言,主控機(jī)需要實(shí)現(xiàn)更多的功能,單任務(wù)的MCU則無(wú)法滿足要求。因此,本文選用嵌入式微處理器ARM11作為主控機(jī)的硬件平臺(tái),ARM處理器具有豐富的外設(shè)接口和良好的實(shí)時(shí)控制性能,無(wú)論從尋址空間還是處理性能上,都要優(yōu)于一般的單片機(jī),適合充當(dāng)小型控制中心。
3.1 Linux下CAN網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)
    項(xiàng)目中移植了Linux 3.0.1版本內(nèi)核作為軟件運(yùn)行的系統(tǒng)平臺(tái),內(nèi)核會(huì)為驅(qū)動(dòng)提供統(tǒng)一的接口。在較新版本的內(nèi)核中,CAN設(shè)備已經(jīng)不再簡(jiǎn)單定義成字符設(shè)備,而是定義成網(wǎng)絡(luò)設(shè)備,這更接近于CAN是一種局域網(wǎng)的本質(zhì),從而可以使用Socket套接字操作CAN設(shè)備,并使用內(nèi)核提供的高級(jí)功能。
    對(duì)內(nèi)核已提供的MCP2515的驅(qū)動(dòng)文件進(jìn)行修改以符合硬件平臺(tái)的實(shí)現(xiàn)。通過(guò)定義mcp251x_priv結(jié)構(gòu)體來(lái)管理設(shè)備所有的信息,如下所示:
struct mcp251x_priv {
    struct can_priv       can;
    struct net_device *net;
    struct spi_device *spi;
    ……
};
    以上3個(gè)結(jié)構(gòu)體變量分別存放了設(shè)備需要使用的協(xié)議層、網(wǎng)絡(luò)層和硬件層的相關(guān)信息。通常,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊主要包括網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動(dòng)功能層和網(wǎng)絡(luò)設(shè)備與媒介層4層[4],各部分模塊在內(nèi)核中的結(jié)構(gòu)關(guān)系如圖4所示。設(shè)備通過(guò)SPI子系統(tǒng)來(lái)實(shí)現(xiàn)硬件層操作,網(wǎng)絡(luò)設(shè)備與SPI設(shè)備之間的連接橋梁是驅(qū)動(dòng)功能層struct net_device_ops,通過(guò)它向上層提供網(wǎng)絡(luò)設(shè)備的底層硬件操作接口函數(shù):
struct net_device_ops mcp251x_netdev_ops = {
    .ndo_open = mcp251x_open,
    .ndo_stop = mcp251x_stop,
    .ndo_start_xmit = mcp251x_hard_start_xmit,
};

    采用“頂半部”和“底半部”的機(jī)制來(lái)處理中斷,可以解決在中斷中讀寫(xiě)SPI耗時(shí)的問(wèn)題,這種機(jī)制將耗時(shí)過(guò)長(zhǎng)的中斷程序放到更安全的時(shí)段中運(yùn)行,以使系統(tǒng)能及時(shí)響應(yīng)其他的中斷請(qǐng)求[5]。因此,僅僅在中斷函數(shù)中喚醒一個(gè)處理函數(shù)的工作隊(duì)列:schedule_work(&priv->irq_
work),而將真正的處理程序放到這個(gè)工作隊(duì)列中運(yùn)行,以保證系統(tǒng)實(shí)時(shí)響應(yīng)的性能。
    運(yùn)行驅(qū)動(dòng)還需要向內(nèi)核注冊(cè)必要的硬件信息,如晶振頻率(.oscillator_frequency)、SPI總線號(hào)(.bus_num)、硬件中斷號(hào)(.irq)等硬件信息。其中設(shè)備名(.modalias)必須要和驅(qū)動(dòng)中定義的設(shè)備名相同,否則內(nèi)核無(wú)法把這些信息傳遞到驅(qū)動(dòng)中。
struct mcp251x_platform_data mcp251x_info = {
    .oscillator_frequency = 8000000,
    .board_specific_setup = mcp251x_ioSetup,
    ……
};
struct spi_board_info spi_mcp251x_info[] = {
    {    .modalias = "mcp2515",
        .platform_data = &mcp251x_info,
        .irq = IRQ_EINT(16),
        .bus_num = 1,
    ……
    },
};
3.2 基于Qt的控制應(yīng)用程序開(kāi)發(fā)
    上層應(yīng)用程序是實(shí)現(xiàn)主控制點(diǎn)所有功能的入口,也是人機(jī)交互的平臺(tái)。項(xiàng)目采用跨平臺(tái)的C++應(yīng)用程序開(kāi)發(fā)框架Qt來(lái)實(shí)現(xiàn)圖形化用戶界面程序的開(kāi)發(fā),其具有良好的適應(yīng)性和可移植性[6]。
    本系統(tǒng)中移植了4.8.0版本的Qt庫(kù),如圖5所示。項(xiàng)目應(yīng)用程序的主要框架通過(guò)窗體部件類QWidget來(lái)構(gòu)建。為了使界面更直觀,加入了對(duì)標(biāo)簽窗體類QTabWidget的支持。同時(shí),主控機(jī)的Socket CAN通信功能由多線程來(lái)實(shí)現(xiàn),多線程機(jī)制可以使Qt程序在同時(shí)運(yùn)行多個(gè)阻塞式任務(wù)時(shí),不會(huì)影響用戶界面的響應(yīng)。

 

 

    子線程類RecvThrd主要實(shí)現(xiàn)對(duì)CAN口的監(jiān)聽(tīng)任務(wù),并通過(guò)信號(hào)-槽機(jī)制將數(shù)據(jù)傳給主線程,重寫(xiě)虛成員函數(shù)void RecvThrd :: run( )加載新的線程任務(wù)。Socket CAN的使用類似于其他網(wǎng)絡(luò)協(xié)議操作,主要包括建立套接字、綁定端口和監(jiān)聽(tīng)等,不同的是CAN通信不需要與對(duì)方建立連接,主要實(shí)現(xiàn)方式如下:

void RecvThrd :: run( )
{
    rv_sk=socket(PF_CAN,SOCK_RAW,CAN_RAW);
    recv_addr.can_family = AF_CAN;
    recv_addr.can_ifindex = 0;
    bind(rv_sk, (struct sockaddr *)&recv_addr, len);
    recvfrom(rv_sk,(void*)&recv_frame,sizeof(struct can_frame),0,(struct sockaddr *)&recv_addr, &len);
    ……
}
    如圖6所示,使用繪圖類QPainter在子窗口Graph中實(shí)時(shí)顯示動(dòng)態(tài)數(shù)據(jù)曲線和坐標(biāo)。繪制坐標(biāo)曲線時(shí)首先要使用QPainter的視窗轉(zhuǎn)換函數(shù)將Qt中默認(rèn)的繪圖坐標(biāo)原點(diǎn)從屏幕的左上角移到左下角。動(dòng)態(tài)曲線采用折線方式繪制,當(dāng)曲線超過(guò)一定寬度后,會(huì)實(shí)時(shí)向左平移。由于在Qt中使用專門(mén)定義的數(shù)據(jù)類型,所以C中的通用數(shù)據(jù)類型都需經(jīng)過(guò)特定轉(zhuǎn)換后才能供Qt使用和顯示。管理數(shù)據(jù)和文件時(shí)使用流操作可有效減少系統(tǒng)調(diào)用次數(shù),提高運(yùn)行速度[7]。
4 測(cè)試與總結(jié)
    將Qt應(yīng)用程序交叉編譯后,下載到ARM平臺(tái)上運(yùn)行,產(chǎn)生圖6中的標(biāo)簽式窗口界面。在構(gòu)造主窗體時(shí)傳入Qt :: FramelessWindowHint參數(shù),可以讓界面不產(chǎn)生標(biāo)題欄,使窗口界面能準(zhǔn)確并完整地顯示在液晶屏上。
    當(dāng)主線程檢測(cè)到新的地震采集節(jié)點(diǎn)號(hào)時(shí),會(huì)彈出消息框通知用戶處理,新節(jié)點(diǎn)會(huì)被加入每個(gè)子窗口的設(shè)備列表中,或被丟棄。引入Qt的互斥鎖QMutex機(jī)制,可以有效避免因命令沒(méi)有得到及時(shí)處理而導(dǎo)致重復(fù)添加相同ID號(hào)的情況。在另外兩個(gè)子窗口中可以瀏覽接收的數(shù)據(jù)以及管理對(duì)應(yīng)節(jié)點(diǎn)。

    測(cè)試表明,基于ARM平臺(tái)的主控機(jī)可以滿足數(shù)據(jù)收發(fā)、實(shí)時(shí)顯示、節(jié)點(diǎn)監(jiān)控以及異常記錄等多任務(wù)要求,在不影響與地震采集節(jié)點(diǎn)間通信的前提下,實(shí)現(xiàn)良好的人機(jī)交互和實(shí)時(shí)控制性能,在整個(gè)網(wǎng)絡(luò)系統(tǒng)中起中繼站的作用,方便了流動(dòng)站對(duì)分散的地震采集節(jié)點(diǎn)的控制和管理。
    本文設(shè)計(jì)了一種采用CAN總線通信技術(shù)在地震數(shù)據(jù)采集點(diǎn)與流動(dòng)站之間進(jìn)行數(shù)據(jù)傳輸?shù)姆绞?,利用CAN總線通信傳輸距離長(zhǎng)、抗干擾能力強(qiáng)、易于施工布線的特點(diǎn),以及微處理器ARM優(yōu)越的實(shí)時(shí)控制能力和良好的通信能力,在地震采集節(jié)點(diǎn)與流動(dòng)站之間構(gòu)建中間控制點(diǎn),以星形拓?fù)涞姆绞綄⒁欢ǚ秶鷥?nèi)分散的采集點(diǎn)集中控制。同時(shí),通過(guò)在ARM硬件平臺(tái)上構(gòu)建Linux多任務(wù)系統(tǒng)平臺(tái),采用Qt嵌入式應(yīng)用程序框架搭建人機(jī)交互界面,實(shí)現(xiàn)了良好的實(shí)時(shí)控制和管理功能。這種基于CAN總線和嵌入式技術(shù)的地震數(shù)據(jù)傳輸方式,既便于野外環(huán)境中網(wǎng)絡(luò)的組建和拓展,也有利于減輕流動(dòng)站的管理任務(wù)。
參考文獻(xiàn)
[1] 王晨,滕云田,王曉美,等.地震前兆野外流動(dòng)觀測(cè)無(wú)線組網(wǎng)系統(tǒng)[J].地球物理學(xué)進(jìn)展,2012,27(3):945-949.
[2] 郭成鎮(zhèn),何迪.CAN總線的PLC通信網(wǎng)絡(luò)的研究[J].通信技術(shù),2012,45(7):51-53,74.
[3] 梁金芝.CAN總線協(xié)議在嵌入式系統(tǒng)中的應(yīng)用[J].電腦知識(shí)與技術(shù),2011,7(20):5003-5004.
[4] 宋寶華.Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解(第2版)[M].北京:人民郵電出版社,2010.
[5] CORBET J,RUBIN A,KROAH-HARTMAN G.Linux設(shè)備驅(qū)動(dòng)程序(第3版)[M].魏永明,耿岳,鐘書(shū)毅,譯.北京:中國(guó)電力出版社,2005.
[6] BLANCHETTE J,SUMMERFIELD M.C++ GUI Qt 4編程(第2版)[M].閆鋒欣,譯.北京:電子工業(yè)出版社,2008.
[7] MATTHEW N,STONES R.Linux程序設(shè)計(jì)(第4版)[M].陳健,宋健建,譯.北京:人民郵電出版社,2010.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。