摘 要: 設(shè)計了一種基于CAN總線的PC機與單片機多點通信系統(tǒng)。系統(tǒng)包括PC機、STC89S52單片機、CAN接口控制器、串行收發(fā)器等。介紹了USB轉(zhuǎn)CAN通信接口的通信節(jié)點設(shè)計方案,給出了各通信節(jié)點的硬件電路和軟件設(shè)計,最后進行了系統(tǒng)通信實驗,結(jié)果表明該系統(tǒng)具有可靠性高、抗干擾能力強等特點。
關(guān)鍵詞: CAN總線;單片機;多點通信
0 引言
傳統(tǒng)的單片機串口通信中大多采用RS232或RS485串口,因其傳輸速率和距離(小于1.5 km)的限制,已漸漸不能滿足用戶系統(tǒng)需求,而CAN總線因其卓越的性能,被廣泛應(yīng)用到汽車工業(yè)、自動控制、樓宇自動化、醫(yī)學(xué)設(shè)備等各個領(lǐng)域[1]。CAN(Controller Area Network,控制器局域網(wǎng))屬于現(xiàn)場總線的范疇,是一種有效支持分布式控制或?qū)崟r控制的串行通信網(wǎng)絡(luò),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一[2-3]。CAN可以組建多主對等的總線通信系統(tǒng);具有非破壞性總線仲裁技術(shù),讓優(yōu)先級高的信息得到更快速的處理;具有強大的錯誤檢測機制,可以檢測到總線上的任何錯誤;采用短幀結(jié)構(gòu)、位填充和CRC校驗等措施,使傳輸具有高可靠性。這些優(yōu)點使得CAN總線特別適用于工業(yè)過程監(jiān)控設(shè)備的互聯(lián)。在所有的CAN轉(zhuǎn)接口中,USB速度快,即插即用,使用更加廣泛,采用USB轉(zhuǎn)CAN總線實現(xiàn)單片機與上位機的通信具有一定的研究與應(yīng)用意義[4]。
1 系統(tǒng)硬件設(shè)計
1.1 系統(tǒng)總體設(shè)計
系統(tǒng)的總體結(jié)構(gòu)如圖1所示,硬件電路主要包括USB轉(zhuǎn)CAN通信接口以及各個通信節(jié)點,每個節(jié)點由CAN收發(fā)器TJA1050、CAN控制器SJA1000和單片機STC89S52組成,CAN總線兩端應(yīng)串接120 ?贅的電阻,該電阻對于匹配總線阻抗起著重要作用。系統(tǒng)主要實現(xiàn)的功能為:PC機通過USB轉(zhuǎn)CAN通信接口向CAN總線發(fā)送一幀CAN總線數(shù)據(jù),相應(yīng)節(jié)點在接收到CAN消息后,存儲在SJA1000的接收緩沖區(qū)中,并向單片機發(fā)送中斷信號,單片機在中斷子程序中讀取SJA1000接收緩沖區(qū)中的數(shù)據(jù),當(dāng)需要向上位機發(fā)送數(shù)據(jù)時,先由單片機將一幀CAN消息寫入到SJA1000的發(fā)送緩沖區(qū),再將其發(fā)送到CAN總線上,PC機調(diào)用接收子函數(shù)以實現(xiàn)CAN消息的接收。
1.2 USB轉(zhuǎn)CAN模塊硬件設(shè)計
該部分硬件框圖如圖2所示。此部分對應(yīng)于圖1中的USB轉(zhuǎn)CAN通信接口模塊。USB控制芯片采用CP2102,該芯片是一種高度集成的USB轉(zhuǎn)UART橋接器,包含USB2.0全速功能控制器,符合USB2.0規(guī)范的要求。USB收發(fā)器內(nèi)含512 B接收緩沖器和512 B發(fā)送緩沖器,振蕩器和帶有全部的調(diào)制解調(diào)器控制信號的異步串行數(shù)據(jù)總線,CP2102內(nèi)置有與計算機通信的USB協(xié)議,PC機通過USB控制芯片CP2102向單片機發(fā)送CAN消息,再由單片機通過SJA1000將數(shù)據(jù)送到CAN總線上。所提供的COM口器件驅(qū)動器允許一個基于CP2102的產(chǎn)品作為PC機的一個COM口使用,可以像操作通用串行口的控制方式來使用這個COM口。
1.3 CAN模塊節(jié)點硬件設(shè)計
CAN節(jié)點的通信核心芯片為CAN控制器和CAN驅(qū)動收發(fā)器,各節(jié)點電路圖如圖3所示。CAN控制器SJA1000是一種獨立控制器,是PHILIPS半導(dǎo)體PCA82C200 CAN控制器(BasicCAN)的替代品,而且它增加了一種新的工作模式(PeliCAN),這種模式支持具有很多新特性的CAN2.0B協(xié)議[5-6]。TJA1050 符合ISO 11898標(biāo)準(zhǔn),協(xié)議控制器通過一條串行數(shù)據(jù)輸出線TxD和一條串行數(shù)據(jù)輸入線RxD連接到收發(fā)器,而收發(fā)器則通過它的兩個有差動接收和發(fā)送能力的總線終端CANH和CANL連接到總線線路。它的引腳S用于模式控制,參考輸出電壓Vef提供一個Vcc/2的額定輸出電壓,這個電壓是作為帶有模擬Rx輸入的CAN控制器的參考電平。由于SJA1000具有數(shù)字輸入,因此它不需要這個電壓。收發(fā)器使用5 V的額定電源電壓。
微處理器采用STC公司生產(chǎn)的STC89S52,它是一種低功耗、高性能CMOS 8位微控制器,具有8 KB Flash,512 B RAM,3個16位定時器/計數(shù)器,4個外部中斷[7]。
CAN控制器的CS片選端連接到單片機的通用I/O口上,由圖3可知SJA1000基址SJA_BaseAdr即為0x7F00,數(shù)據(jù)端AD0~AD7連接到單片機的P0.0~P0.7以實現(xiàn)數(shù)據(jù)的交換,SJA1000的INT是終端信號輸出端,在中斷允許的情況下,有中斷發(fā)生時,INT出現(xiàn)由高電平到低電平的跳變,因此此腳與單片機的外部中斷輸入腳INT0相連,從而使單片機可通過外部中斷的方式訪問SJA1000。
2 系統(tǒng)軟件設(shè)計
2.1 各節(jié)點單片機控制程序
單片機主函數(shù)流程如圖4所示。
這里單片機主要完成CAN控制器SJA1000的初始化,初始化程序中需要設(shè)置時鐘分頻寄存器、驗收代碼寄存器、驗收定時寄存器和總線定時寄存器,以及數(shù)據(jù)的接收和發(fā)送。首先,微處理器關(guān)閉SJA1000的中斷,然后寫SJA1000的模式寄存器,將模式寄存器中的RM位置1,進入復(fù)位模式,接下來在時鐘寄存器里確定使用BasicCAN模式還是PeliCAN模式,本系統(tǒng)采用了PeliCAN模式,驗收代碼寄存器和驗收屏蔽寄存器的設(shè)置決定了各個節(jié)點的地址,在通信過程中起到重要作用,可以讓單片機選擇性地接收響應(yīng)節(jié)點CAN消息,通信波特率在總線定時寄存器BTR0和BTR1中進行設(shè)置,輸出寄存器配置輸出位流的電平驅(qū)動形式,通過中斷寄存器IR和中斷使能寄存器IER設(shè)置正確的中斷模式以實現(xiàn)CAN數(shù)據(jù)的正確收發(fā)處理,最后將模式寄存器RM位請求清0,進入工作模式。初始化程序的流程圖如圖5所示,關(guān)鍵部分程序如下:
EA=0;//關(guān)總中斷
BCAN_ENTER_RETMODEL();//進入復(fù)位模式
BCAN_CREATE_COMMUNATION();//接口檢測
BCAN_SET_OUTCLK(0x88);//Pelican模式
BCAN_SET_OBJECT(0x01,0x01,0x00,0x20,0xff,0xff,0x00,0x00);//驗收碼和屏蔽碼
BCAN_SET_BANDRATE(ByteRate_125k);//設(shè)置波特率
REG_OCR=0x1a;//設(shè)置輸出控制寄存器
REG_INTENABLE=0x1D;//設(shè)置中斷,接收
BCAN_SET_CONTROL(0x08);
SJA=REG_CONTROL;
*SJA=*SJA&0xfe;
if(*SJA!=0x00)
return 0;//退出復(fù)位模式
發(fā)送過程單片機將要發(fā)送的數(shù)據(jù)以CAN協(xié)議規(guī)定的幀格式構(gòu)成數(shù)據(jù)幀,存入SJA1000的發(fā)送緩沖區(qū),然后寫發(fā)送命令,在把數(shù)據(jù)寫入發(fā)送緩沖區(qū)前,先判斷SJA1000的工作狀態(tài),再決定是否發(fā)送,其發(fā)送一個數(shù)據(jù)幀的過程如圖6所示,發(fā)送數(shù)據(jù)子程序如下:
Void SendMessage(unsigned char CAN_TX_data,unsigned char length1)
loop:
SJA=REG_STATUS;
temptt=*SJA;
if((temptt&0x04)==0x00)goto loop;//循環(huán)檢測等待
{
SJA=REG_RXBuffer1;//發(fā)送緩沖區(qū)1
*SJA=length1;
*SJA=CAN_TX_data;
BCAN_CMD_PRG(TR_CMD);//請求發(fā)送
}
接收數(shù)據(jù)采用接收中斷方式,單片機在中斷程序中從數(shù)據(jù)口讀取CAN消息,具有較高的實時性,接收數(shù)據(jù)子程序如下:
void ex0_int(void)interrupt 0 using 1
{
unsigned char tt,tt1,length,i;
SJA=REG_INTERRUPT;
if((*SJA)&0x01)//產(chǎn)生接收中斷
{
SJA=REG_RXBuffer1;
tt=*SJA;
tt1=*SJA;
length=tt1&0x0F;
if ((tt&0x40)!=0x40)
//將幀格式設(shè)置為數(shù)據(jù)幀
{
SJA=REG_RXBuffer4;
memcpy(RevceData,SJA_BCANAdr,length);
//將接收到的數(shù)據(jù)存入RevceData數(shù)組中
}
BCAN_CMD_PRG(RRB_CMD);
//釋放SJA1000接收緩沖區(qū)
}
}
2.2 上位機軟件設(shè)計
上位機軟件基于C++語言,采用Windows API函數(shù)實現(xiàn)串口通信,API函數(shù)在通信任務(wù)較復(fù)雜的系統(tǒng)中具有優(yōu)勢,適合多線程編程,且通信穩(wěn)定,串口的打開、關(guān)閉、讀取和寫入所用的函數(shù)與操作文件的函數(shù)完全一致。通過調(diào)用CreateFile()函數(shù)打開串口,CreateFile()函數(shù)會返回一個句柄,在隨后的寫串口操作中,只需在WriteFile()函數(shù)中設(shè)置相應(yīng)的入口參數(shù),將數(shù)據(jù)轉(zhuǎn)換成CAN消息格式并打包發(fā)送即可。讀串口操作則是通過ReadFile()函數(shù)實現(xiàn),對接收到的CAN消息數(shù)據(jù)包解包后提取出數(shù)據(jù)段,其上位機軟件工作流程如圖7所示,其中發(fā)送子程序關(guān)鍵部分程序如下:
CAN_msg msg;//CAN消息結(jié)構(gòu)體,
//結(jié)構(gòu)體成員包括CAN數(shù)據(jù)地址及類型等
CAN.SendCANMessage(&msg);//發(fā)送CAN消息,
SendCANMessage()函數(shù)定義如下:其中pMsg為CAN消息數(shù)據(jù)包,dwTimeout為超時時間,如果發(fā)送錯誤,系統(tǒng)將返回錯誤信息。
CAN_ERROR RT_CAN::
SendCANMessage(CAN_msg*pMsg,DWORD dwTimeout)
{
if(pMsg==NULL)return CAN_ERR_PARAM;
if(pMsg->ch==CAN_CONFIG_CHANNEL)
return CAN_ERR_CHANNEL;
if(WritePackage((BYTE*)pMsg,sizeof(CAN_msg),dwTimeout)==0)
return CAN_ERR_TRANS;
return CAN_OK;
}
接收子程序關(guān)鍵部分如下:
RecvCANMessage(CAN_msg*pMsg,DWORD dwTimeout)
{
if(pMsg==NULL)
return CAN_ERR_PARAM;
if(WAIT_TIMEOUT==WaitForSingleObject(m_hRecvMsgEvnet,dwTimeout))
return CAN_ERR_TIMEOUT;
*pMsg=m_CANRecvMsg;
return CAN_OK;
}
在數(shù)據(jù)發(fā)送或接收完畢后,調(diào)用CloseHandle()函數(shù)關(guān)閉串口。上位機整體界面設(shè)計如圖8所示。
3 系統(tǒng)實驗
為驗證系統(tǒng)通信的可靠性和穩(wěn)定性,實驗中擬將一幀CAN消息設(shè)置為ID:01(十六進制),消息長度為8,采用標(biāo)準(zhǔn)數(shù)據(jù)幀傳輸一個十六進制數(shù)據(jù),下位機采用數(shù)碼管顯示的方式來判斷數(shù)據(jù)傳輸?shù)恼_性。當(dāng)下位機接收到消息后,將會把此消息重新返回給上位機。經(jīng)過幾次反復(fù)實驗,系統(tǒng)通信穩(wěn)定、可靠。
4 結(jié)束語
由于CAN總線通信可靠、性能穩(wěn)定,具有易開發(fā)和低成本等特點,近年來在自動控制等很多領(lǐng)域得到了越來越廣泛的應(yīng)用。在一些復(fù)雜系統(tǒng)中,不可避免地存在多點通信的情況。本文設(shè)計的基于CAN總線的PC機與單片機多點通信系統(tǒng),在所有的CAN轉(zhuǎn)接口中,通過USB連接到CAN總線,簡化了硬件接口,提高了開發(fā)效率,具有很好的應(yīng)用前景。
參考文獻
[1] 李真花,崔健.CAN總線輕松入門與實踐[M].北京:北京航空航天大學(xué)出版社,2011.
[2] 劉維弋,金遠平.基于CAN總線的通信系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機技術(shù)與發(fā)展,2007,17(12):207-209.
[3] 楊春杰,王曙光,亢紅波.CAN總線技術(shù)[M].北京:北京航空航天大學(xué)出版社,2010.
[4] 張念淮.USB總線接口開發(fā)指南[M].北京:國防工業(yè)出版社,2001.
[5] 孫兵,何瑾,陳廣廈.基于DSP的CAN總線與以太網(wǎng)互聯(lián)系統(tǒng)研制[J].儀器儀表學(xué)報,2008,29(2):377-380.
[6] 王平,江華麗,何花.基于單片機的CAN總線通訊應(yīng)用設(shè)計[J].電子測量技術(shù),2009,32(9):131-135.
[7] 郭天祥.新概念51單片機C語言教程[M].北京:電子工業(yè)出版社,2009.