<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • WinCE系統(tǒng)雙CAN構建方案

     2008-7-15             

            CAN(Controller Area Network)即控制器局域網,由于具有高性能、高可靠性以及簡單的網絡結構,在工業(yè)系統(tǒng)中越來越受到人們的重視,并迅速成為了目前國際上應用最廣泛的現場總線之一。

     

            英創(chuàng)提供的EM9000系列ARM9嵌入式主板,包括EM9000、EM9260、EM9360等多種型號,都預裝了正版WinCE操作系統(tǒng),且?guī)в袠藴蔆AN通訊接口。與板上其他標準通訊接口一樣,英創(chuàng)公司為所有EM9000系列嵌入式主板的CAN接口配置了標準的WinCE流式驅動程序,應用程序可以通過打開文件的進行讀寫的標準方式實現對CAN總線接口的數據通訊。本文側重于介紹CAN通訊接口,下面以EM9000嵌入式主板為例,介紹如何利用英創(chuàng)的ARM9嵌入式主板快速構建雙CAN接口的方案。

     

    硬件組成

            英創(chuàng)提供的系列ARM9嵌入式主板,除EM9160嵌入式主板外,所有的ARM9主板上均可直接支持一個CAN接口。ETA701是英創(chuàng)公司提供的基于ISA總線擴展的一個CAN模塊,可以通過ISA總線外接一個ETA701模塊,即可構成一個雙CAN系統(tǒng)。

     

            EM9000嵌入式主板和ETA701模塊提供的CAN均采用了PHILIPS半導體公司的SJA1000T CAN總線控制器,SJA1000是一款獨立的控制器,主要用于汽車和一般工業(yè)環(huán)境中的控制器局域網絡(CAN)芯片。它是PHILIPS半導體PCA82C200 CAN控制器(BasicCAN)的替代產品,而且它增加了一種新的工作模式(PeliCAN),這種模式支持具有很多新特性的CAN 2.0B協(xié)議。

     

            EM9000嵌入式主板和ETA701模塊的CAN通訊接口可提供高達1Mbps的數據傳輸速率,當采用5Kbps的的數據傳輸速率時其通訊距離最高可達到10KM。硬件的錯誤檢定特性也增強了CAN的抗電磁干擾能力,這給數據的遠程可靠傳輸提供了有利保證。

     

            在EM9000嵌入式主板和ETA701模塊的CAN通訊接口根據用戶的需要分為兩種:一種帶光電隔離,一種不帶光電隔離。帶光電隔離CAN總線通訊模塊的CAN收發(fā)器端的所有信號和電源與其它部分完全隔離,可承受至少1Kv(有效值)的電壓沖擊。

     

    CAN接口驅動函數

     

    一、CAN報文的幀格式

            在CAN2.0B中存在兩種不同的幀格式,其主要的區(qū)別在于標識符的長度,具有11位標識符的幀稱為標準幀,而包括有29位標識符的幀稱為擴展幀。下面分別介紹數據幀的格式。

     

    1、CAN2.0B標準幀

            CAN標準幀信息為11個字節(jié),包括兩部分:信息和數據部分。前3個字節(jié)為信息部分,如圖所示:


    360截圖-25641026.jpg 

            注:

            1、字節(jié)1為幀信息。D7位表示幀格式,在標準幀中,FF=0;D6位表示幀的類型,RTR=0表示為數據幀,RTR=1表示為遠程幀,在一般的數據通訊中,只使用數據幀;DLC表示數據幀實際的數據長度。

            2、字節(jié)2、字節(jié)3為報文識別碼,11位有效。

            3、字節(jié)4~字節(jié)11為數據幀的實際數據,遠程幀時無效。

     

    2、CAN2.0B擴展幀

            CAN標準幀信息為13個字節(jié),包括兩部分:信息和數據部分。前5個字節(jié)為信息部分,如圖所示:


    360截圖-25649980.jpg 

            注:

            1、字節(jié)1為幀信息。D7位表示幀格式,在擴展幀中,FF=1;D6位表示幀的類型,RTR=0表示為數據幀,RTR=1表示為遠程幀;DLC表示數據幀實際的數據長度。

            2、字節(jié)2~字節(jié)5為報文識別碼,29位有效。

            3、字節(jié)6~字節(jié)13為數據幀的實際數據,遠程幀時無效。

     

    二、啟動CAN通訊接口

            英創(chuàng)公司提供的CAN通訊接口的驅動程序采用的是WinCE下流式驅動程序(Stream Device Driver),并在此驅動程序的基礎上為客戶封裝了一套簡單實用的API函數。各個函數的定義在can_api.h文件下,在該頭文件中對于各個API函數均有相應的中文說明。

     

            作為流式接口函數通常和文件系統(tǒng)的API函數(如CreateFile)緊密匹配的,因此在使用英創(chuàng)提供的CAN接口的API函數時,首先需要調用CreateFile(…)來獲取CAN接口設備的句柄handle,如使用CAN1通訊口,可以調用以下函數:

     

            m_hCAN=CreateFile(_T(“CAN1:”), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

     

            對于CAN2通訊接口,只需將其中的名稱換成 _T(“CAN2:”)即可。在創(chuàng)建CAN設備得到有效的handle之后,就可以調用can_api.h中定義的相應函數來啟動CAN設備接口。

     

            BOOL  CAN_StartChip (HANDLE hDevice);

     

            至此CAN通訊接口進入工作模式。

     

    三、設置CAN通訊接口參數

            在進行CAN數據通訊之前,需要設置和CAN通訊相關的一些參數,包括CAN通訊的波特率設置以及對接收過濾器的設置。

     

    BOOL   CAN_SetBaudRate(HANDLE hDevice, BYTE *index);

    // 用于設置CAN通訊的波特率,波特率的設置范圍包括:10kbps~1Mbps。具體的定義請參見can_api.h文件中的注釋說明

     

            通過配置接收過濾器,CAN通訊接口可以實現只接收標識符也接收過濾器預設值相一致的報文。接收過濾器由接收碼寄存器ACRn和接收屏蔽碼寄存器AMRn來定義的,還可以選擇兩種不同的過濾器模式,單過濾器模式或者雙過濾器模式。關于ACR、AMR中各位的定義,請參見SJA1000的數據手冊,這里就不再贅述。在英創(chuàng)提供的API函數中,用戶可以調用以下函數來實現接收過濾器的設置:

     

    BOOL CAN_SetGlobalAcceptanceFilter(  HANDLE hDevice, BYTE *AcceptanceFilter, BYTE size)

     

    四、CAN通訊接口的數據收發(fā)

            在英創(chuàng)公司提供的雙CAN方案中,CAN通訊的數據收發(fā)均采用的中斷方式,驅動程序中已自動完成了數據的收發(fā),以及內部定義的CAN接收緩沖區(qū)和發(fā)送緩沖區(qū)的管理。對于用戶開發(fā)應用程序來說,只需要調用英創(chuàng)公司提供的CAN通訊API函數中的收發(fā)函數即可。下圖為CAN驅動程序的數據流和事件的關系圖。

     

            在進行CAN通訊應用程序的開發(fā)時,對于CAN通訊數據接收線程可以采用兩種方式:一種可以采用定時查詢,即定時調用函數CAN_GetNextReceivedFrame( …)檢測是否有接收到CAN報文數據;一種可以利用操作系統(tǒng)的消息機制,采用事件響應的方式,一旦硬件接收的數據報文,底層的驅動接收程序會自動讀取報文,同時發(fā)送一個接收事件。作為應用程序的接收線程在等待到該事件后,調用CAN_GetNextReceivedFrame(…)即可進行CAN數據報文的讀取。需要注意的是函數CAN_GetNextReceivedFrame每執(zhí)行一次,只是讀取了一幀CAN數據報文,如果在應用程序中需要將最新的數據全部讀出,只需反復調用該函數,直到該函數的返回值為FALSE。

     

            接收線程部分代碼:

    DWORD CEM9000_CAN::ReadThreadFunc( LPVOID lparam )

    {

          CEM9000_CAN *ceCAN = (CEM9000_CAN*)lparam;

          BOOL          bResult;

          while( 1 )

          {

                 if(WaitForSingleObject(ceCAN->m_hReadCloseEvent,0 )==WAIT_OBJECT_0 )

                 {

                        break;

                 }

                 // 等待接收事件觸發(fā),使用以下代碼

                 WaitForSingleObject( ceCAN->m_hRxEvent, INFINITE );

     

                 // 若采用定時查詢,則調用Sleep(..)即可,Sleep的時間由應用程序確定

                 // Sleep( 50 );

     

                 ceCAN->m_nRxCounter = 0;

                 for( ; ; )

                 {

                       // 讀取已接收的所有數據幀

                         bResult=CAN_GetNextReceivedFrame(ceCAN->m_hCAN,

                                                                                                  &ceCAN->RxMFrame[ceCAN->m_nRxCounter] );

                         if( !bResult )

                         {

                              break;

                         }

                         ceCAN->m_nRxCounter++;

                 }

                 if(ceCAN->m_nRxCounter>0 )

                 {

                        // 調用回調函數,進行必要的數據處理

                        ceCAN->OnRead( ceCAN->m_pCANOwner );

                 }

          }

    return 0;

    }

     

            CAN數據報文的發(fā)送比較簡單,應用程序直接調用函數CAN_SendFrame(…)即可。

     

            英創(chuàng)公司針對CAN總線的應用提供圖形化的測試程序,用戶可以直接利用該程序進行CAN接口通訊基本收發(fā)測試。EM9000下的測試界面如下圖所示:

    国产精品视频在线观看| 亚洲a∨无码精品色午夜| 国产最新进精品视频| 国产精品无打码在线播放| 国产精品第100页| 久久亚洲欧美国产精品| 精品久久久久久久国产潘金莲| 91亚洲精品自在在线观看| 亚洲综合精品香蕉久久网97| 国产AV国片精品有毛| 久久综合九色综合精品| 久久99国产精品久久99果冻传媒| 精品视频一区二区三区| 91精品国产高清91久久久久久| 国产精品无码DVD在线观看| 精品久久久久久久久久久久久久久| 亚洲国产精品一区二区第一页免 | 亚洲欧洲国产日韩精品| 国产福利精品一区二区| 国产精品美女一区二区视频| 国内精品久久久久久99蜜桃| 国产精品多p对白交换绿帽| 亚洲国产一二三精品无码| 亚洲精品无码久久久久| 亚洲国产精品特色大片观看完整版 | 久久精品这里只有精99品| 精品久久久久久无码中文字幕| 久久精品无码免费不卡| 成人精品视频一区二区三区不卡 | 国内精品一线二线三线黄| 中文字幕无码久久精品青草| 国产亚洲精品精华液| 久久国产精品电影| 99久久免费中文字幕精品| 久久精品久久久久观看99水蜜桃| 国产精品乳摇在线播放| 天堂一区二区三区精品| 精品无码成人片一区二区| 国产精品自在线拍国产电影| 四虎国产精品免费永久在线| 亚洲国产精品无码久久一线 |