劉 登,李國(guó)利,陳 健,張愷鈺,時(shí) 光(金陵科技學(xué)院 機(jī)電工程學(xué)院,江蘇 南京 211169)
基于CAN總線的PC機(jī)與單片機(jī)的多點(diǎn)通信*
劉 登,李國(guó)利,陳 健,張愷鈺,時(shí) 光
(金陵科技學(xué)院 機(jī)電工程學(xué)院,江蘇 南京 211169)
設(shè)計(jì)了一種基于CAN總線的PC機(jī)與單片機(jī)多點(diǎn)通信系統(tǒng)。系統(tǒng)包括PC機(jī)、STC89S52單片機(jī)、CAN接口控制器、串行收發(fā)器等。介紹了USB轉(zhuǎn)CAN通信接口的通信節(jié)點(diǎn)設(shè)計(jì)方案,給出了各通信節(jié)點(diǎn)的硬件電路和軟件設(shè)計(jì),最后進(jìn)行了系統(tǒng)通信實(shí)驗(yàn),結(jié)果表明該系統(tǒng)具有可靠性高、抗干擾能力強(qiáng)等特點(diǎn)。
CAN總線;單片機(jī);多點(diǎn)通信
傳統(tǒng)的單片機(jī)串口通信中大多采用RS232或RS485串口,因其傳輸速率和距離(小于 1.5 km)的限制,已漸漸不能滿足用戶系統(tǒng)需求,而CAN總線因其卓越的性能,被廣泛應(yīng)用到汽車工業(yè)、自動(dòng)控制、樓宇自動(dòng)化、醫(yī)學(xué)設(shè)備等各個(gè)領(lǐng)域[1]。CAN(Controller Area Network,控制器局域網(wǎng))屬于現(xiàn)場(chǎng)總線的范疇,是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一[2-3]。CAN可以組建多主對(duì)等的總線通信系統(tǒng);具有非破壞性總線仲裁技術(shù),讓優(yōu)先級(jí)高的信息得到更快速的處理;具有強(qiáng)大的錯(cuò)誤檢測(cè)機(jī)制,可以檢測(cè)到總線上的任何錯(cuò)誤;采用短幀結(jié)構(gòu)、位填充和CRC校驗(yàn)等措施,使傳輸具有高可靠性。這些優(yōu)點(diǎn)使得CAN總線特別適用于工業(yè)過(guò)程監(jiān)控設(shè)備的互聯(lián)。在
所有的 CAN轉(zhuǎn)接口中,USB速度快,即插即用,使用更加廣泛,采用USB轉(zhuǎn)CAN總線實(shí)現(xiàn)單片機(jī)與上位機(jī)的通信具有一定的研究與應(yīng)用意義[4]。
1.1系統(tǒng)總體設(shè)計(jì)
系統(tǒng)的總體結(jié)構(gòu)如圖1所示,硬件電路主要包括USB轉(zhuǎn)CAN通信接口以及各個(gè)通信節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)由CAN收發(fā)器 TJA1050、CAN控制器 SJA1000和單片機(jī)STC89S52組成,CAN總線兩端應(yīng)串接 120 Ω的電阻,該電阻對(duì)于匹配總線阻抗起著重要作用。系統(tǒng)主要實(shí)現(xiàn)的功能為:PC機(jī)通過(guò)USB轉(zhuǎn)CAN通信接口向CAN總線發(fā)送一幀CAN總線數(shù)據(jù),相應(yīng)節(jié)點(diǎn)在接收到CAN消息后,存儲(chǔ)在SJA1000的接收緩沖區(qū)中,并向單片機(jī)發(fā)送中斷信號(hào),單片機(jī)在中斷子程序中讀取SJA1000接收緩沖區(qū)中的數(shù)據(jù),當(dāng)需要向上位機(jī)發(fā)送數(shù)據(jù)時(shí),先由單片機(jī)將一幀CAN消息寫(xiě)入到SJA1000的發(fā)送緩沖區(qū),再將其發(fā)送到CAN總線上,PC機(jī)調(diào)用接收子函數(shù)以實(shí)現(xiàn)CAN消息的接收。
1.2USB轉(zhuǎn)CAN模塊硬件設(shè)計(jì)
該部分硬件框圖如圖2所示。此部分對(duì)應(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)器控制信號(hào)的異步串行數(shù)據(jù)總線,CP2102內(nèi)置有與計(jì)算機(jī)通信的 USB協(xié)議,PC機(jī)通過(guò) USB控制芯片 CP2102向單片機(jī)發(fā)送CAN消息,再由單片機(jī)通過(guò) SJA1000將數(shù)據(jù)送到 CAN總線上。所提供的COM口器件驅(qū)動(dòng)器允許一個(gè)基于CP2102的產(chǎn)品作為 PC機(jī)的一個(gè) COM口使用,可以像操作通用串行口的控制方式來(lái)使用這個(gè)COM口。
圖 2USB轉(zhuǎn)CAN硬件框圖
1.3CAN模塊節(jié)點(diǎn)硬件設(shè)計(jì)
CAN節(jié)點(diǎn)的通信核心芯片為CAN控制器和CAN驅(qū)動(dòng)收發(fā)器,各節(jié)點(diǎn)電路圖如圖3所示。CAN控制器SJA1000是一種獨(dú)立控制器,是 PHILIPS半導(dǎo)體PCA82C200 CAN控制器(BasicCAN)的替代品,而且它增加了一種新的工作模式(PeliCAN),這種模式支持具有很多新特性的CAN2.0B協(xié)議[5-6]。TJA1050符合ISO 11898標(biāo)準(zhǔn),協(xié)議控制器通過(guò)一條串行數(shù)據(jù)輸出線TxD和一條串行數(shù)據(jù)輸入線RxD連接到收發(fā)器,而收發(fā)器則通過(guò)它的兩個(gè)有差動(dòng)接收和發(fā)送能力的總線終端CANH和CANL連接到總線線路。它的引腳S用于模式控制,參考輸出電壓Vef提供一個(gè) Vcc/2的額定輸出電壓,這個(gè)電壓是作為帶有模擬Rx輸入的CAN控制器的參考電平。由于SJA1000具有數(shù)字輸入,因此它不需要這個(gè)電壓。收發(fā)器使用5 V的額定電源電壓。
微處理器采用STC公司生產(chǎn)的STC89S52,它是一種低功耗、高性能CMOS 8位微控制器,具有8 KB Flash, 512 B RAM,3個(gè) 16位定時(shí)器/計(jì)數(shù)器,4個(gè)外部中斷[7]。
圖3 CAN模塊各節(jié)點(diǎn)電路圖
CAN控制器的CS片選端連接到單片機(jī)的通用 I/O口上,由圖 3可知 SJA1000基址 SJA_BaseAdr即為0x7F00,數(shù)據(jù)端 AD0~AD7連接到單片機(jī)的 P0.0~P0.7以實(shí)現(xiàn)數(shù)據(jù)的交換,SJA1000的INT是終端信號(hào)輸出端,在中斷允許的情況下,有中斷發(fā)生時(shí),INT出現(xiàn)由高電平到低電平的跳變,因此此腳與單片機(jī)的外部中斷輸入腳INT0相連,從而使單片機(jī)可通過(guò)外部中斷的方式訪問(wèn)SJA1000。
2.1各節(jié)點(diǎn)單片機(jī)控制程序
單片機(jī)主函數(shù)流程如圖4所示。
圖4 單片機(jī)主函數(shù)流程圖
這里單片機(jī)主要完成CAN控制器 SJA1000的初始化,初始化程序中需要設(shè)置時(shí)鐘分頻寄存器、驗(yàn)收代碼寄存器、驗(yàn)收定時(shí)寄存器和總線定時(shí)寄存器,以及數(shù)據(jù)的接收和發(fā)送。首先,微處理器關(guān)閉SJA1000的中斷,然后寫(xiě)SJA1000的模式寄存器,將模式寄存器中的RM位置1,進(jìn)入復(fù)位模式,接下來(lái)在時(shí)鐘寄存器里確定使用BasicCAN模式還是 PeliCAN模式,本系統(tǒng)采用了 Peli-CAN模式,驗(yàn)收代碼寄存器和驗(yàn)收屏蔽寄存器的設(shè)置決定了各個(gè)節(jié)點(diǎn)的地址,在通信過(guò)程中起到重要作用,可以讓單片機(jī)選擇性地接收響應(yīng)節(jié)點(diǎn)CAN消息,通信波特率在總線定時(shí)寄存器 BTR0和BTR1中進(jìn)行設(shè)置,輸出寄存器配置輸出位流的電平驅(qū)動(dòng)形式,通過(guò)中斷寄存器IR和中斷使能寄存器IER設(shè)置正確的中斷模式以實(shí)現(xiàn)CAN數(shù)據(jù)的正確收發(fā)處理,最后將模式寄存器RM位請(qǐng)求清0,進(jìn)入工作模式。初始化程序的流程圖如圖5所示,關(guān)鍵部分程序如下:
EA=0; //關(guān)總中斷
BCAN_ENTER_RETMODEL(); //進(jìn)入復(fù)位模式
BCAN_CREATE_COMMUNATION();/接口檢測(cè)
BCAN_SET_OUTCLK(0x88);//Pelican模式
BCAN_SET_OBJECT(0x01,0x01,0x00,0x20,0xff,0xff,0x00,0x00);
//驗(yàn)收碼和屏蔽碼
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ā)送過(guò)程單片機(jī)將要發(fā)送的數(shù)據(jù)以CAN協(xié)議規(guī)定的幀格式構(gòu)成數(shù)據(jù)幀,存入 SJA1000的發(fā)送緩沖區(qū),然后寫(xiě)發(fā)送命令,在把數(shù)據(jù)寫(xiě)入發(fā)送緩沖區(qū)前,先判斷SJA1000的工作狀態(tài),再?zèng)Q定是否發(fā)送,其發(fā)送一個(gè)數(shù)據(jù)幀的過(guò)程如圖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)檢測(cè)等待
{
SJA=REG_RXBuffer1;//發(fā)送緩沖區(qū)1
*SJA=length1;
*SJA=CAN_TX_data;
BCAN_CMD_PRG(TR_CMD);//請(qǐng)求發(fā)送
}
接收數(shù)據(jù)采用接收中斷方式,單片機(jī)在中斷程序中從數(shù)據(jù)口讀取CAN消息,具有較高的實(shí)時(shí)性,接收數(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上位機(jī)軟件設(shè)計(jì)
上位機(jī)軟件基于C++語(yǔ)言,采用Windows API函數(shù)實(shí)現(xiàn)串口通信,API函數(shù)在通信任務(wù)較復(fù)雜的系統(tǒng)中具有優(yōu)勢(shì),適合多線程編程,且通信穩(wěn)定,串口的打開(kāi)、關(guān)閉、讀取和寫(xiě)入所用的函數(shù)與操作文件的函數(shù)完全一致。通過(guò)調(diào)用CreateFile()函數(shù)打開(kāi)串口,CreateFile()函數(shù)會(huì)返回一個(gè)句柄,在隨后的寫(xiě)串口操作中,只需在WriteFile()函數(shù)中設(shè)置相應(yīng)的入口參數(shù),將數(shù)據(jù)轉(zhuǎn)換成CAN消息格式并打包發(fā)送即可。讀串口操作則是通過(guò)ReadFile()函數(shù)實(shí)現(xiàn),對(duì)接收到的 CAN消息數(shù)據(jù)包解包后提取出數(shù)據(jù)段,其上位機(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為超時(shí)時(shí)間,如果發(fā)送錯(cuò)誤,系統(tǒng)將返回錯(cuò)誤信息。
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),dw-Timeout)==0)
return CAN_ERR_TRANS;
return CAN_OK;
}
圖7 主線程和讀線程流程圖
接收子程序關(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)閉串口。上位機(jī)整體界面設(shè)計(jì)如圖8所示。
為驗(yàn)證系統(tǒng)通信的可靠性和穩(wěn)定性,實(shí)驗(yàn)中擬將一幀 CAN消息設(shè)置為 ID:01(十六進(jìn)制),消息長(zhǎng)度為 8,采用標(biāo)準(zhǔn)數(shù)據(jù)幀傳輸一個(gè)十六進(jìn)制數(shù)據(jù),下位機(jī)采用數(shù)碼管顯示的方式來(lái)判斷數(shù)據(jù)傳輸?shù)恼_性。當(dāng)下位機(jī)接收到消息后,將會(huì)把此消息重新返回給上位機(jī)。經(jīng)過(guò)幾次反復(fù)實(shí)驗(yàn),系統(tǒng)通信穩(wěn)定、可靠。
4結(jié)束語(yǔ)
由于CAN總線通信可靠、性能穩(wěn)定,具有易開(kāi)發(fā)和低成本等特點(diǎn),近年來(lái)在自動(dòng)控制等很多領(lǐng)域得到了越來(lái)越廣泛的應(yīng)用。在一些復(fù)雜系統(tǒng)中,不可避免地存在多點(diǎn)通信的情況。本文設(shè)計(jì)的基于CAN總線的PC機(jī)與單片機(jī)多點(diǎn)通信系統(tǒng),在所有的CAN轉(zhuǎn)接口中,通過(guò)USB連接到 CAN總線,簡(jiǎn)化了硬件接口,提高了開(kāi)發(fā)效率,具有很好的應(yīng)用前景。
[1]李真花,崔健.CAN總線輕松入門(mén)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2011.
[2]劉維弋,金遠(yuǎn)平.基于 CAN總線的通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,17(12):207-209.
[3]楊春杰,王曙光,亢紅波.CAN總線技術(shù)[M].北京:北京航空航天大學(xué)出版社,2010.
[4]張念淮.USB總線接口開(kāi)發(fā)指南[M].北京:國(guó)防工業(yè)出版社,2001.
[5]孫兵,何瑾,陳廣廈.基于 DSP的 CAN總線與以太網(wǎng)互聯(lián)系統(tǒng)研制[J].儀器儀表學(xué)報(bào),2008,29(2):377-380.
[6]王平,江華麗,何花.基于單片機(jī)的 CAN總線通訊應(yīng)用設(shè)計(jì)[J].電子測(cè)量技術(shù),2009,32(9):131-135.
[7]郭天祥.新概念 51單片機(jī) C語(yǔ)言教程[M].北京:電子工業(yè)出版社,2009.
Multipoint communication between PC and MCU based on CAN bus
Liu Deng,Li Guoli,Chen Jian,Zhang Kaiyu,Shi Guang
(College of Mechanical and Electrical Engineering,Jinling Institute of Technology,Nanjing 211169,China)
A kind of multipoint communication system between PC and MCU based on CAN bus is designed.The system consists of PC,STC89S52 MCU,the CAN port controller,serial transceiver,etc.The communication nodes design scheme of USB to CAN communication interface is introduced,and the hardware circuit and software of communication node are designed.The experiments of system communication are performed in the last.The results show that the system has the characteristics of high reliability,strong anti-interference ability etc.
CAN bus;MCU;multipoint communication
TP393
A
1674-7720(2015)15-0067-04
劉登,李國(guó)利,陳健,等.基于CAN總線的PC機(jī)與單片機(jī)的多點(diǎn)通信[J].微型機(jī)與應(yīng)用,2015,34(15):67-70.
2015-04-11)
劉登(1993-),男,本科在讀,主要研究方向:自動(dòng)化控制技術(shù)。
2014江蘇省高等學(xué)校大學(xué)生實(shí)踐創(chuàng)新訓(xùn)練計(jì)劃重點(diǎn)項(xiàng)目(201413573007Z)
李國(guó)利(1973-),通信作者,男,碩士,副教授,主要研究方向:自動(dòng)化檢測(cè)與控制技術(shù)。E-mail:1260342839@qq.com。