中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

        CAN總線(xiàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

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

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

        本文引用地址:http://www.antipu.com.cn/article/81591.htm

          系統(tǒng)硬件設(shè)計(jì)

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

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



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

          系統(tǒng)軟件設(shè)計(jì)

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

          系統(tǒng)設(shè)計(jì)的部分代碼如下:

          main()
          {
         Sja_1000_Init();     //初始化SJA1000
         Init_Cpu();      //初始化CPU
         Init_T0();       //初始化定時(shí)器
         flag_init=0x00;
         while(1)
         {
          if(rcv_flag)    //rcv_flag為接受標(biāo)志位,有接收則單片機(jī)進(jìn)行處理
          {
           rcv_flag=0; BCAN_DATA_RECEIVE(rcv_data);
         BCAN_CMD_PRG(0X04);
           disp_rec();
          }
        if(flag_sec)    //定時(shí)中斷標(biāo)志為,定時(shí)時(shí)間到則發(fā)送數(shù)據(jù)幀
         {  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)顯示接受數(shù)據(jù)

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

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

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

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

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

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

          結(jié)語(yǔ)

          現(xiàn)場(chǎng)總線(xiàn)有著巨大的發(fā)展?jié)摿Γ鼘⒔o自動(dòng)控制領(lǐng)域的變革帶來(lái)深遠(yuǎn)的影響。我們?cè)O(shè)計(jì)的CAN總線(xiàn)收發(fā)器具有通用性,在本系統(tǒng)設(shè)計(jì)的基礎(chǔ)上只需要相應(yīng)的修改數(shù)據(jù)傳輸協(xié)議即可應(yīng)用于各個(gè)CAN總線(xiàn)的數(shù)傳系統(tǒng)。

          參考文獻(xiàn):

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

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

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

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



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

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉