<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>
  • EM9170嵌入式主板CAN通訊接口使用說明

     2011-10-27              

            英創公司推出的基于WinCE 6.0操作系統的嵌入式工控板卡EM9170,板上帶有2路獨立的CAN總線接口,均為FlexCAN模塊。FlexCAN完全支持CAN 2.0B協議,支持對于標準幀和擴展幀的收發,同時FlexCAN還支持高優先級的報文優先發送的機制,可有效改善實時控制的相應時間。EM9170板上輸出的兩路CAN收發信號均為TTL電平,在實際使用時需要在外圍電路中加上CAN驅動芯片,具體可以參考英創公司提供的“EM9170開發底板評估手冊”。EM9170內核操作系統中已經實現FlexCAN底層驅動,系統一旦上電系統,將自動加載兩路FlexCAN的驅動程序,客戶在基于EM9170上編寫CAN應用程序時,均可按照WinCE流式設備,打開關閉文件的方式對CAN接口進行操作,本文將著重介紹基于EM9170上FlexCAN的使用方法。

     

    數據結構

            EM9170的CAN通訊提供了兩種數據結構,定義在flex_can.h文件中。一個是CAN通訊數據包的結構,一個是CAN通訊中對于濾波器的設置結構。

     

            CAN數據包結構的定義如下:

     

    typedef struct
    {
            // 定義數據幀的類型:0 - 標準幀;1 - 擴展幀
            DWORD dwType;
            // 標準幀或擴展幀的CAN ID。
            // bit 0-28: CAN identifier (11/29 bit),其中標準幀11bit,擴展幀29bit
            DWORD dwID;
            // = 0:數據幀;= 1:遠程幀
            DWORD dwRTR;
            // 發送優先級= 0 - 7,為最高優先級,對接收數據包無意義
            DWORD dwPrio;
            // 數據長度= 0 - 8
            DWORD dwDatLen;
            // 數據字節
            UCHAR ucDat[8]; 
    }CAN_PACKET, *PCAN_PACKET;

     

            CAN濾波器數據結構的定義如下:

     

    typedef struct
    {
            // 組號,恒為0
            DWORD dwGroup;
            // 定義數據幀的類型:0 - 標準幀;1 - 擴展幀
            DWORD dwType;
            // 定義標準幀或擴展幀需要比較過濾的CAN ID。
            // bit 0-28: CAN identifier (11/29 bit),其中標準幀11bit,擴展幀29bit
            DWORD dwID;
            // = 0:數據幀;= 1:遠程幀
            DWORD dwRTR;
            // 定義和dwID對應的需要檢查或不檢查的Mask位
            // bit 0-28: (11/29 bit),其中標準幀11bit,擴展幀29bit
            // = 0:該位不檢查;= 1:該位須檢查
            DWORD dwMask;
    }CAN_FILTER, *PCAN_FILTER;

     

            濾波器數據結構設置距離如下:

     

    CAN_FILTER Filter;

    Filter.dwGroup = 0; // 保留,恒為0
    Filter.dwType = CAN_PACKET_TYPE_STANDARD; // 標準幀
    Filter.dwID = 0x00000002; // 設定的接收ID
    Filter.dwMask = 0x00000003; // 檢查接收報文ID的低2位
    Filter.dwRTR = 0; // 數據幀

     

            設置的Filter結構,表明對于接收到的CAN標準幀報文只檢查報文CAN ID的低兩位的值,這兩位的值應該和Filter.dwID所設定的值相符合,即:

            CAN_ID & Filter.dwMask = Filter.dwID

     

            因此在上例中,所接收的CAN報文的ID的低兩位必須為0x02。

     

    CAN_API函數

            英創公司提供的CAN通訊接口的驅動程序采用標準的驅動程序,和串口操作類似用戶可以用標準的打開文件CreateFile( )、關閉文件CloseHandle( )的方式,來打開該CAN設備,數據的收發可調用ReadFile() WrtieFile( ),另外的一些對CAN操作通訊相關參數的設置可以通過調用DeviceIOCTL( )來實現。為了方便客戶的使用,在CAN驅動程序的基礎上,以源碼的形式為客戶封裝了一套簡單實用的API函數。各個函數的定義在can_api.h文件下,在該頭文件中對于各個API函數均有相應的中文說明。

     

    // 功能描述:啟動CAN設備端口。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // 返回值= TRUE: 啟動CAN設備端口成功。
    // = FALSE: 啟動CAN設備端口失敗。

    BOOL CAN_StartChip(HANDLE hDevice);

     

    // 功能描述:停止CAN設備端口。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // 返回值= TRUE: 停止CAN設備端口成功。
    // = FALSE: 停止CAN設備端口失敗。

    BOOL CAN_StopChip(HANDLE hDevice);

     

    // 功能描述: 軟件復位CAN設備端口。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // 返回值 = TRUE: 復位CAN設備端口成功。
    // = FALSE: 復位CAN設備端口失敗。

    BOOL CAN_SoftReset(HANDLE hDevice);

     

    // 功能描述:設置CAN設備通訊的波特率。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // CAN_TIMING_10K : 10Kbps
    // CAN_TIMING_20K : 20Kbps
    // CAN_TIMING_50K : 50bps
    // CAN_TIMING_60K : 60bps
    // CAN_TIMING_100K : 100bps
    // CAN_TIMING_125K : 125Kbps
    // CAN_TIMING_250K : 250Kbps
    // CAN_TIMING_500K : 500bps
    // CAN_TIMING_1000K: 1Mbps
    // 返回值= TRUE: 波特率設置成功。
    // = FALSE: 波特率設置失敗。

    BOOL CAN_SetBaudRate(HANDLE hDevice, DWORD dwBaudRate );

     

    // 功能描述: 設置CAN設備通訊接收過濾器配置。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // pFilter: 根據通訊報文格式定義過濾器的配置。
    // 返回值= TRUE: 配置設置成功。
    // = FALSE: 配置設置失敗。

    BOOL CAN_SetFilter( HANDLE hDevice, PCAN_FILTER pFilter );

     

    // 功能描述: 獲取CAN設備通訊事件
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // dwTimeout: 超時時間,單位為ms
    // 輸出參數
    // lpEvtMask: 得到的CAN事件類型= 1:接收到CAN數據包
    // = 2:CAN錯誤事件
    // 返回值= TRUE: 調用成功。
    // = FALSE: 調用失敗。
    BOOL WaitCANEvent( HANDLE hDevice, LPDWORD lpEvtMask, DWORD dwTimeout );

     

    // 功能描述: 清空CAN設備通訊接收、發送BUFFER。
    // 輸入參數hDevice: 已創建CAN流式設備的句柄。
    // 返回值= TRUE: 設置成功。

    BOOL CAN_Purge( HANDLE hDevice );

     

    CAN出錯處理

            在CAN實際應用數據通訊過程中,可能會遇到CAN通訊出錯的情況,調用API函數WaitCANEvent( HANDLE hDevice, LPDWORD lpEvtMask, DWORD dwTimeout )可以獲取到CAN通訊出錯的事件,對CAN的錯誤事件的處理可采用重啟CAN設備的操作。

     

    if( WaitCANEvent( pCAN->m_hCAN, &dwEvtMask, 2000 ) )
    {
            …..
            if( dwEvtMask & 0x02 ) // 錯誤事件
            {
                    CAN_StopChip( pCAN->m_hCAN );
                    CAN_StartChip( pCAN->m_hCAN );
            }
    }

     

            在英創公司提供的應用光盤中有具體CAN接口的測試代碼,可供客戶參考測試。

    亚洲线精品一区二区三区| 久久精品国产乱子伦| 亚洲精品视频在线播放| 日韩成人国产精品视频| 国精品无码一区二区三区在线| 中文字幕亚洲综合精品一区| AV无码精品一区二区三区宅噜噜| 亚洲欧洲国产精品久久| 国产精品秘入口福利姬网站| 国产成人精品福利网站在线| 久久精品国产只有精品66| 国产午夜亚洲精品| 国内精品一级毛片免费看| 国产精品国产三级国产AV麻豆| 亚洲级αV无码毛片久久精品| www.精品在线| 国产v精品成人免费视频400条| 国产成人麻豆亚洲综合无码精品| 日本中文字幕在线精品| 久久久久久国产精品mv| 亚洲精品A在线观看| 2020精品极品国产色在线观看| 囯产精品久久久久久久久蜜桃 | 国产成人精品综合久久久久 | 久久精品国产亚洲av麻豆图片| 久久免费国产精品一区二区| 国产精品自在在线午夜出白浆| 99热这里只有精品免费播放| 国产精品国产三级在线高清观看 | 国产精品V亚洲精品V日韩精品| 国产精品va一区二区三区| 88国产精品视频一区二区三区| 久久精品人人爽人人爽| 国产精品一级毛片无码视频| 日本精品一区二区三区四区| 亚洲精品色播一区二区| 日韩精品无码AV成人观看| 成人午夜视频精品一区| 成人午夜视频精品一区| 亚洲精品色午夜无码专区日韩| 91麻豆国产福利精品|