《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于CAN總線的PC機(jī)與單片機(jī)的多點(diǎn)通信
基于CAN總線的PC機(jī)與單片機(jī)的多點(diǎn)通信
2015年微型機(jī)與應(yīng)用第15期
劉 登,,李國(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),。
Abstract:
Key words :

  摘  要: 設(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)。

  關(guān)鍵詞: CAN總線,;單片機(jī),;多點(diǎn)通信

0 引言

  傳統(tǒng)的單片機(jī)串口通信中大多采用RS232或RS485串口,因其傳輸速率和距離(小于1.5 km)的限制,,已漸漸不能滿足用戶系統(tǒng)需求,,而CAN總線因其卓越的性能,被廣泛應(yīng)用到汽車(chē)工業(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 系統(tǒng)硬件設(shè)計(jì)

  1.1 系統(tǒng)總體設(shè)計(jì)

001.jpg

  系統(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.2 USB轉(zhuǎn)CAN模塊硬件設(shè)計(jì)

002.jpg

  該部分硬件框圖如圖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口,。

  1.3 CAN模塊節(jié)點(diǎn)硬件設(shè)計(jì)

003.jpg

  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],。

  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 系統(tǒng)軟件設(shè)計(jì)

  2.1 各節(jié)點(diǎn)單片機(jī)控制程序

  單片機(jī)主函數(shù)流程如圖4所示。

004.jpg

  這里單片機(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)采用了PeliCAN模式,驗(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)鍵部分程序如下:

005.jpg

  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ù)位模式

006.jpg

  發(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ì)

007.jpg

  上位機(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),,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)閉串口。上位機(jī)整體界面設(shè)計(jì)如圖8所示,。

3 系統(tǒng)實(shí)驗(yàn)

  為驗(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)定、可靠,。

008.jpg

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)用前景,。

參考文獻(xiàn)

  [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.


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