<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > CAN總線(xiàn)系統的設計與實(shí)現

CAN總線(xiàn)系統的設計與實(shí)現

作者:哈爾濱汽輪機廠(chǎng)有限責任公司 李勝明 哈爾濱理工大學(xué) 初光宇 呂實(shí)誠 時(shí)間:2008-04-16 來(lái)源:電子產(chǎn)品世界 收藏

  在現場(chǎng)總線(xiàn)概念的出現到現在的近20年時(shí)間里,已經(jīng)出現了好幾種現場(chǎng)總線(xiàn)技術(shù)并走向成熟。其中已被公認為幾種最有前途的現場(chǎng)總線(xiàn)之一。CAN是一種由帶有CAN控制器組成的高性能串行數據局域通信網(wǎng)絡(luò ),是國際上應用最廣泛的現場(chǎng)總線(xiàn)之一。最初,CAN被設計作為汽車(chē)環(huán)境中的微控制器通信,在車(chē)載各電子控制裝置ECU之間交換信息,形成汽車(chē)電子控制網(wǎng)絡(luò )。由于其具有通信速度快、可靠性高和性能價(jià)格比好等突出優(yōu)點(diǎn),它正越拉越廣泛地應用于汽車(chē)、機械工業(yè)、紡織機械、農業(yè)用機械、機器人、數控機床、醫療器械、家用電器及傳感器等領(lǐng)域。圖1所示是典型的節點(diǎn)的系統框圖。

本文引用地址:http://dyxdggzs.com/article/81591.htm

  系統硬件設計

  獨立CAN控制器是PHILIPS公司PCA82C200CAN控制器的替代產(chǎn)品,它是在完全兼容PCA82C200的基礎上,增加了一種新的工作模式PeliCAN,完全支持具有很多新特性的CAN2.0B協(xié)議。的工作模式通過(guò)其內部的時(shí)鐘分頻寄存器中的CAN模式為來(lái)選擇。SJA1000可以支持多種為處理器的時(shí)序特性,如Intel模式或Motorla模式,SJA1000與微處理器的接口非常簡(jiǎn)單,微處理器以訪(fǎng)問(wèn)外部存儲器的方式來(lái)訪(fǎng)問(wèn)SJA1000。

  是控制器局域網(wǎng)CAN協(xié)議控制器和物理總線(xiàn)之間的接口,可以為總線(xiàn)提供不同的發(fā)送性能,為CAN控制器提供不同的接收性能。主要有以下特征:完全符合ISO 11898標準,最高速到達1Mb/s,輸入級3.3V以及5V器件兼容,至少可以連接110個(gè)節點(diǎn)。本設計的微處理器為負責初始化SJA1000及通過(guò)控制SJA1000實(shí)現數據的接收和發(fā)送等通信任務(wù),系統電路圖如圖2所示。



  CAN控制器SJA1000的數據線(xiàn)AD0~AD7連接到51單片機的P0口,連接到基址為0xFA00的外部存儲器片選信號,當訪(fǎng)問(wèn)地址0xFA00~0xFA31時(shí),CPU可對SJA1000執行相應的讀寫(xiě)操作。SJA1000的、、分別與51對應的引腳相連,接51的使51可以通過(guò)中斷方式訪(fǎng)問(wèn)SJA1000。

  系統軟件設計

  本設計的系統由4個(gè)節點(diǎn)組成,一個(gè)節點(diǎn)由上位機通過(guò)并口轉的數據收發(fā)器構成,另外3個(gè)節點(diǎn)由圖2所示的單片機CAN總線(xiàn)收發(fā)系統構成。單片機系統每秒發(fā)送一幀(8個(gè)字節)數據。連接上位機的CAN總線(xiàn)收發(fā)器有相應的上位機測試軟件支持,本文主要介紹單片機CAN總線(xiàn)收發(fā)器的程序設計。圖3是下位機軟件的流程圖。

  系統設計的部分代碼如下:

  main()
  {
 Sja_1000_Init();     //初始化SJA1000
 Init_Cpu();      //初始化CPU
 Init_T0();       //初始化定時(shí)器
 flag_init=0x00;
 while(1)
 {
  if(rcv_flag)    //rcv_flag為接受標志位,有接收則單片機進(jìn)行處理
  {
   rcv_flag=0; BCAN_DATA_RECEIVE(rcv_data);
 BCAN_CMD_PRG(0X04);
   disp_rec();
  }
if(flag_sec)    //定時(shí)中斷標志為,定時(shí)時(shí)間到則發(fā)送數據幀
 {  flag_sec=0;  send_data[0]=0xaa;  send_data[1]=0x08;  send_data[2]=DA1;
 send_data[3]=DA2;
  send_data[4]=DA3;
  send_data[5]=DA4;
  send_data[6]=DA5;
  send_data[7]=DA6;
  send_data[8]=DA7;
  send_data[9]=DA8; BCAN_DATA_WRITE(send_data);  BCAN_CMD_PRG(0X01);
  }
  if(err_flag)
  {
   err_flag=0;
   disp_err();
  Sja_1000_Init();
  }
  display(a);  //循環(huán)顯示接受數據

  SJA1000的初始化過(guò)程包括申請進(jìn)入復位狀態(tài),設置總線(xiàn)波特率,設置輸出方式,開(kāi)放錯誤中斷、接受和發(fā)送中斷。在進(jìn)行數據發(fā)送時(shí)數據包前兩個(gè)字節0Xaa、0X08為描述符,包括11位長(cháng)的ID(標志符)1位RTR4位描述數據長(cháng)度的DLC共16 位。BCAN_DATA_RECEIVE(rcv_data),為對SJA1000的讀數據函數其具體函數定義:

 bit  BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
 {
   unsigned  char  TempCount;
   SJA_BCANAdr = REG_STATUS;              //訪(fǎng)問(wèn)地址指向狀態(tài)寄存器
   if((*SJA_BCANAdr&0x01)==0)               //判斷報文是否有效
   {
      return 1;
   }
   SJA_BCANAdr = REG_RxBuffer2;             //訪(fǎng)問(wèn)地址指向接收緩沖區2
   if((*SJA_BCANAdr&0x10)==0)               //如果是數據幀
   {
     TempCount=(*SJA_BCANAdr& 0x0f)+2;      //計算報文中數據的個(gè)數
   }
   else
   {
    TempCount=2;
   }
   SJA_BCANAdr = REG_RxBuffer1;             //訪(fǎng)問(wèn)地址指向接收緩沖區1
   memcpy(RcvDataBuf, SJA_BCANAdr,TempCount);//讀取接收緩沖區的報文
   return  0;
 }

  此函數僅限于CAN控制器接受數據,返回值如果為0表示接受成功,如果為1表示接受失敗。

  BCAN_DATA_WRITE(send_data)函數是對SJA1000的寫(xiě)數據函數其具體定義如下:
  bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)
   {
     unsigned  char  TempCount;
     SJA_BCANAdr = REG_STATUS;            //訪(fǎng)問(wèn)地址指向狀態(tài)寄存器
     if((*SJA_BCANAdr&0x08) == 0)         //判斷上次發(fā)送是否完成
     {
      return 1;
     } 
   if((*SJA_BCANAdr&0x04)==0)          //判斷發(fā)送緩沖區是否鎖定
     {
       return 1;
     }  
     SJA_BCANAdr = REG_TxBuffer1;        //訪(fǎng)問(wèn)地址指向發(fā)送緩沖區1
   if((SendDataBuf[1]&0x10)==0)        //判斷RTR,從而得出是數據幀還是遠程幀
   {
     TempCount =(SendData Buf[1]&0x0f)+2; //輸入數據幀
     }
     else
     {
       TempCount =2;                     //遠程幀
  memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
    return 0;
  }

  此函數將待發(fā)送的特定幀各式的數據,送入SJA1000發(fā)送緩存區中,然后啟動(dòng),函數返回0表示將數據成功的送至發(fā)送緩沖區,返回1表示上一次的數據正在發(fā)送。

  系統組網(wǎng)相對容易只需把各個(gè)節點(diǎn)掛在同一條雙絞線(xiàn)上即可,啟動(dòng)上位機的CAN收發(fā)器,用來(lái)監視總線(xiàn)數據狀態(tài)。每當啟動(dòng)一個(gè)下位機CAN收發(fā)器,上位機的測試軟件就可以每隔一秒鐘收到由同一CAN收發(fā)器發(fā)送的數據幀。實(shí)驗結果顯示當3臺下位機CAN總線(xiàn)同時(shí)發(fā)數時(shí)數據接收端沒(méi)有數據丟失和總線(xiàn)沖突現象。

  結語(yǔ)

  現場(chǎng)總線(xiàn)有著(zhù)巨大的發(fā)展潛力,它將給自動(dòng)控制領(lǐng)域的變革帶來(lái)深遠的影響。我們設計的CAN總線(xiàn)收發(fā)器具有通用性,在本系統設計的基礎上只需要相應的修改數據傳輸協(xié)議即可應用于各個(gè)CAN總線(xiàn)的數傳系統。

  參考文獻:

  1. 陳立元主編. Visual Basic實(shí)現串并行通信技術(shù). 清華大學(xué)出版社,2001

  2. 張學(xué)忠,王福成主編. Visual Basic控件應用編程實(shí)例教程. 北京希望電子出版社,2002

  3. 馬希榮主編. Visual Basic 6.0 程序設計. 機械工業(yè)出版社,2004

  4. 彭禹皓. 基于單片機和CAN控制器的嵌入式系統. 微計算機信息,2007,4-2:33-35



關(guān)鍵詞: CAN總線(xiàn) 89C51 SJA1000 TJA1050

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>