英創(chuàng)公司推出的基于WinCE 6.0操作系統(tǒng)的嵌入式工控板卡EM9170,板上帶有2路獨立的CAN總線接口,均為FlexCAN模塊。FlexCAN完全支持CAN 2.0B協(xié)議,支持對于標準幀和擴展幀的收發(fā),同時FlexCAN還支持高優(yōu)先級的報文優(yōu)先發(fā)送的機制,可有效改善實時控制的相應時間。EM9170板上輸出的兩路CAN收發(fā)信號均為TTL電平,在實際使用時需要在外圍電路中加上CAN驅(qū)動芯片,具體可以參考英創(chuàng)公司提供的“EM9170開發(fā)底板評估手冊”。EM9170內(nèi)核操作系統(tǒng)中已經(jīng)實現(xiàn)FlexCAN底層驅(qū)動,系統(tǒng)一旦上電系統(tǒng),將自動加載兩路FlexCAN的驅(qū)動程序,客戶在基于EM9170上編寫CAN應用程序時,均可按照WinCE流式設備,打開關(guān)閉文件的方式對CAN接口進行操作,本文將著重介紹基于EM9170上FlexCAN的使用方法。
數(shù)據(jù)結(jié)構(gòu)
EM9170的CAN通訊提供了兩種數(shù)據(jù)結(jié)構(gòu),定義在flex_can.h文件中。一個是CAN通訊數(shù)據(jù)包的結(jié)構(gòu),一個是CAN通訊中對于濾波器的設置結(jié)構(gòu)。
CAN數(shù)據(jù)包結(jié)構(gòu)的定義如下:
typedef struct
{
// 定義數(shù)據(jù)幀的類型:0 - 標準幀;1 - 擴展幀
DWORD dwType;
// 標準幀或擴展幀的CAN ID。
// bit 0-28: CAN identifier (11/29 bit),其中標準幀11bit,擴展幀29bit
DWORD dwID;
// = 0:數(shù)據(jù)幀;= 1:遠程幀
DWORD dwRTR;
// 發(fā)送優(yōu)先級= 0 - 7,為最高優(yōu)先級,對接收數(shù)據(jù)包無意義
DWORD dwPrio;
// 數(shù)據(jù)長度= 0 - 8
DWORD dwDatLen;
// 數(shù)據(jù)字節(jié)
UCHAR ucDat[8];
}CAN_PACKET, *PCAN_PACKET;
CAN濾波器數(shù)據(jù)結(jié)構(gòu)的定義如下:
typedef struct
{
// 組號,恒為0
DWORD dwGroup;
// 定義數(shù)據(jù)幀的類型:0 - 標準幀;1 - 擴展幀
DWORD dwType;
// 定義標準幀或擴展幀需要比較過濾的CAN ID。
// bit 0-28: CAN identifier (11/29 bit),其中標準幀11bit,擴展幀29bit
DWORD dwID;
// = 0:數(shù)據(jù)幀;= 1:遠程幀
DWORD dwRTR;
// 定義和dwID對應的需要檢查或不檢查的Mask位
// bit 0-28: (11/29 bit),其中標準幀11bit,擴展幀29bit
// = 0:該位不檢查;= 1:該位須檢查
DWORD dwMask;
}CAN_FILTER, *PCAN_FILTER;
濾波器數(shù)據(jù)結(jié)構(gòu)設置距離如下:
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; // 數(shù)據(jù)幀
設置的Filter結(jié)構(gòu),表明對于接收到的CAN標準幀報文只檢查報文CAN ID的低兩位的值,這兩位的值應該和Filter.dwID所設定的值相符合,即:
CAN_ID & Filter.dwMask = Filter.dwID
因此在上例中,所接收的CAN報文的ID的低兩位必須為0x02。
CAN_API函數(shù)
英創(chuàng)公司提供的CAN通訊接口的驅(qū)動程序采用標準的驅(qū)動程序,和串口操作類似用戶可以用標準的打開文件CreateFile( )、關(guān)閉文件CloseHandle( )的方式,來打開該CAN設備,數(shù)據(jù)的收發(fā)可調(diào)用ReadFile() WrtieFile( ),另外的一些對CAN操作通訊相關(guān)參數(shù)的設置可以通過調(diào)用DeviceIOCTL( )來實現(xiàn)。為了方便客戶的使用,在CAN驅(qū)動程序的基礎上,以源碼的形式為客戶封裝了一套簡單實用的API函數(shù)。各個函數(shù)的定義在can_api.h文件下,在該頭文件中對于各個API函數(shù)均有相應的中文說明。
// 功能描述:啟動CAN設備端口。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// 返回值= TRUE: 啟動CAN設備端口成功。
// = FALSE: 啟動CAN設備端口失敗。
BOOL CAN_StartChip(HANDLE hDevice);
// 功能描述:停止CAN設備端口。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// 返回值= TRUE: 停止CAN設備端口成功。
// = FALSE: 停止CAN設備端口失敗。
BOOL CAN_StopChip(HANDLE hDevice);
// 功能描述: 軟件復位CAN設備端口。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// 返回值 = TRUE: 復位CAN設備端口成功。
// = FALSE: 復位CAN設備端口失敗。
BOOL CAN_SoftReset(HANDLE hDevice);
// 功能描述:設置CAN設備通訊的波特率。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建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設備通訊接收過濾器配置。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// pFilter: 根據(jù)通訊報文格式定義過濾器的配置。
// 返回值= TRUE: 配置設置成功。
// = FALSE: 配置設置失敗。
BOOL CAN_SetFilter( HANDLE hDevice, PCAN_FILTER pFilter );
// 功能描述: 獲取CAN設備通訊事件
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// dwTimeout: 超時時間,單位為ms
// 輸出參數(shù)
// lpEvtMask: 得到的CAN事件類型= 1:接收到CAN數(shù)據(jù)包
// = 2:CAN錯誤事件
// 返回值= TRUE: 調(diào)用成功。
// = FALSE: 調(diào)用失敗。
BOOL WaitCANEvent( HANDLE hDevice, LPDWORD lpEvtMask, DWORD dwTimeout );
// 功能描述: 清空CAN設備通訊接收、發(fā)送BUFFER。
// 輸入?yún)?shù)hDevice: 已創(chuàng)建CAN流式設備的句柄。
// 返回值= TRUE: 設置成功。
BOOL CAN_Purge( HANDLE hDevice );
CAN出錯處理
在CAN實際應用數(shù)據(jù)通訊過程中,可能會遇到CAN通訊出錯的情況,調(diào)用API函數(shù)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 );
}
}
在英創(chuàng)公司提供的應用光盤中有具體CAN接口的測試代碼,可供客戶參考測試。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6101瀏覽量
36303
發(fā)布評論請先 登錄
ElfBoard嵌入式教育科普|CAN接口全面解析

嵌入式主板特點與應用場景解析

嵌入式主板開發(fā)詳細指南

高可靠性嵌入式主板設計

嵌入式教育科普|GPIO接口全面解析

嵌入式主板選型與應用指南

小身材大能量:解讀小尺寸嵌入式主板

盤點無風扇嵌入式主板應用優(yōu)勢

嵌入式主板的概述與發(fā)展

評論