《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 業(yè)界動(dòng)態(tài) > WinCE系統(tǒng)雙CAN構(gòu)建方案--英創(chuàng)嵌入式解決方案

WinCE系統(tǒng)雙CAN構(gòu)建方案--英創(chuàng)嵌入式解決方案

2009-01-20
作者:成都英創(chuàng)信息技術(shù)有限公司
WinCE系統(tǒng)雙CAN構(gòu)建方案
文章來(lái)源:http://www.emtronix.com/case/case2008190.html
??????? CAN(Controller Area Network)即控制器局域網(wǎng),,由于具有高性能、高可靠性以及簡(jiǎn)單的網(wǎng)絡(luò)結(jié)構(gòu),,在工業(yè)系統(tǒng)中越來(lái)越受到人們的重視,,并迅速成為了目前國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。 ? ??????? 英創(chuàng)提供的EM9000系列ARM9嵌入式主板,,包括EM9000,、EM9260、EM9360等多種型號(hào),,都預(yù)裝了正版WinCE操作系統(tǒng),,且?guī)в袠?biāo)準(zhǔn)CAN通訊接口,。與板上其他標(biāo)準(zhǔn)通訊接口一樣,,英創(chuàng)公司為所有EM9000系列嵌入式主板的CAN接口配置了標(biāo)準(zhǔn)的WinCE流式驅(qū)動(dòng)程序,應(yīng)用程序可以通過(guò)打開(kāi)文件的進(jìn)行讀寫(xiě)的標(biāo)準(zhǔn)方式實(shí)現(xiàn)對(duì)CAN總線接口的數(shù)據(jù)通訊,。本文側(cè)重于介紹CAN通訊接口,,下面以EM9000嵌入式主板為例,介紹如何利用英創(chuàng)的ARM9嵌入式主板快速構(gòu)建雙CAN接口的方案,。 ?

硬件組成

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

? ??????? EM9000嵌入式主板和ETA701模塊提供的CAN均采用了PHILIPS半導(dǎo)體公司的SJA1000T CAN總線控制器,,SJA1000是一款獨(dú)立的控制器,主要用于汽車(chē)和一般工業(yè)環(huán)境中的控制器局域網(wǎng)絡(luò)(CAN)芯片,。它是PHILIPS半導(dǎo)體PCA82C200 CAN控制器(BasicCAN)的替代產(chǎn)品,,而且它增加了一種新的工作模式(PeliCAN),這種模式支持具有很多新特性的CAN 2.0B協(xié)議,。 ? ??????? EM9000嵌入式主板和ETA701模塊的CAN通訊接口可提供高達(dá)1Mbps的數(shù)據(jù)傳輸速率,,當(dāng)采用5Kbps的的數(shù)據(jù)傳輸速率時(shí)其通訊距離最高可達(dá)到10KM。硬件的錯(cuò)誤檢定特性也增強(qiáng)了CAN的抗電磁干擾能力,,這給數(shù)據(jù)的遠(yuǎn)程可靠傳輸提供了有利保證,。 ? ??????? 在EM9000嵌入式主板和ETA701模塊的CAN通訊接口根據(jù)用戶的需要分為兩種:一種帶光電隔離,一種不帶光電隔離,。帶光電隔離CAN總線通訊模塊的CAN收發(fā)器端的所有信號(hào)和電源與其它部分完全隔離,,可承受至少1Kv(有效值)的電壓沖擊。

CAN接口驅(qū)動(dòng)函數(shù)

一,、CAN報(bào)文的幀格式 ? ??????? 在CAN2.0B中存在兩種不同的幀格式,,其主要的區(qū)別在于標(biāo)識(shí)符的長(zhǎng)度,具有11位標(biāo)識(shí)符的幀稱為標(biāo)準(zhǔn)幀,,而包括有29位標(biāo)識(shí)符的幀稱為擴(kuò)展幀,。下面分別介紹數(shù)據(jù)幀的格式,。 ? 1、CAN2.0B標(biāo)準(zhǔn)幀 ? ??????? CAN標(biāo)準(zhǔn)幀信息為11個(gè)字節(jié),,包括兩部分:信息和數(shù)據(jù)部分,。前3個(gè)字節(jié)為信息部分,如圖所示: ?
? D7 D6 D5 D4 D3 D2 D1 D0
字節(jié)1 FF RTR X X DLC(數(shù)據(jù)長(zhǎng)度
字節(jié)2 (報(bào)文識(shí)別碼)ID.10~ID.3
字節(jié)3 ID.2~ID.0 RTR ?
字節(jié)4 數(shù)據(jù)1
字節(jié)5 數(shù)據(jù)2
字節(jié)6 數(shù)據(jù)3
字節(jié)7 數(shù)據(jù)4
字節(jié)8 數(shù)據(jù)5
字節(jié)9 數(shù)據(jù)6
字節(jié)10 數(shù)據(jù)7
字節(jié)11 數(shù)據(jù)8
? 注: 1)字節(jié)1為幀信息,。D7位表示幀格式,,在標(biāo)準(zhǔn)幀中,F(xiàn)F=0,;D6位表示幀的類型,,RTR=0表示為數(shù)據(jù)幀,RTR=1表示為遠(yuǎn)程幀,,在一般的數(shù)據(jù)通訊中,,只使用數(shù)據(jù)幀;DLC表示數(shù)據(jù)幀實(shí)際的數(shù)據(jù)長(zhǎng)度,。 2)字節(jié)2,、字節(jié)3為報(bào)文識(shí)別碼,11位有效,。 3)字節(jié)4~字節(jié)11為數(shù)據(jù)幀的實(shí)際數(shù)據(jù),,遠(yuǎn)程幀時(shí)無(wú)效。 ? 2,、CAN2.0B擴(kuò)展幀 ? ??????? CAN標(biāo)準(zhǔn)幀信息為13個(gè)字節(jié),,包括兩部分:信息和數(shù)據(jù)部分。前5個(gè)字節(jié)為信息部分,,如圖所示: ?
? D7 D6 D5 D4 D3 D2 D1 D0
字節(jié)1 FF RTR X X DLC(數(shù)據(jù)長(zhǎng)度)
字節(jié)2 (報(bào)文識(shí)別碼)ID.28~ID.21
字節(jié)3 ID.20~ID.13
字節(jié)4 ID.12~ID.5
字節(jié)5 ID.4~ID.0 ?
字節(jié)6 數(shù)據(jù)1
字節(jié)7 數(shù)據(jù)2
字節(jié)8 數(shù)據(jù)3
字節(jié)9 數(shù)據(jù)4
字節(jié)10 數(shù)據(jù)5
字節(jié)11 數(shù)據(jù)6
字節(jié)12 數(shù)據(jù)7
字節(jié)13 數(shù)據(jù)8
? 注: 1)字節(jié)1為幀信息,。D7位表示幀格式,在擴(kuò)展幀中,,F(xiàn)F=1,;D6位表示幀的類型,RTR=0表示為數(shù)據(jù)幀,,RTR=1表示為遠(yuǎn)程幀,;DLC表示數(shù)據(jù)幀實(shí)際的數(shù)據(jù)長(zhǎng)度。 2)字節(jié)2~字節(jié)5為報(bào)文識(shí)別碼,,29位有效,。 3)字節(jié)6~字節(jié)13為數(shù)據(jù)幀的實(shí)際數(shù)據(jù),遠(yuǎn)程幀時(shí)無(wú)效,。 ? 二,、啟動(dòng)CAN通訊接口 ? ??????? 英創(chuàng)公司提供的CAN通訊接口的驅(qū)動(dòng)程序采用的是WinCE下流式驅(qū)動(dòng)程序(Stream Device Driver),并在此驅(qū)動(dòng)程序的基礎(chǔ)上為客戶封裝了一套簡(jiǎn)單實(shí)用的API函數(shù),。各個(gè)函數(shù)的定義在can_api.h文件下,,在該頭文件中對(duì)于各個(gè)API函數(shù)均有相應(yīng)的中文說(shuō)明,。 ? ??????? 作為流式接口函數(shù)通常和文件系統(tǒng)的API函數(shù)(如CreateFile)緊密匹配的,因此在使用英創(chuàng)提供的CAN接口的API函數(shù)時(shí),,首先需要調(diào)用CreateFile(…)來(lái)獲取CAN接口設(shè)備的句柄handle,,如使用CAN1通訊口,可以調(diào)用以下函數(shù): ? m_hCAN=CreateFile(_T(“CAN1:”), GENERIC_READ|GENERIC_WRITE, 0,
????????????????????????????????????????????? ?NULL, OPEN_EXISTING, 0, NULL); ? ??????? 對(duì)于CAN2通訊接口,,只需將其中的名稱換成 _T(“CAN2:”)即可,。在創(chuàng)建CAN設(shè)備得到有效的handle之后,就可以調(diào)用can_api.h中定義的相應(yīng)函數(shù)來(lái)啟動(dòng)CAN設(shè)備接口,。 ? ????????BOOL ?CAN_StartChip (HANDLE hDevice); ? ??????? 至此CAN通訊接口進(jìn)入工作模式,。 ? 三、設(shè)置CAN通訊接口參數(shù) ? ??????? 在進(jìn)行CAN數(shù)據(jù)通訊之前,,需要設(shè)置和CAN通訊相關(guān)的一些參數(shù),,包括CAN通訊的波特率設(shè)置以及對(duì)接收過(guò)濾器的設(shè)置。 ? BOOL?? CAN_SetBaudRate(HANDLE hDevice, BYTE *index); 用于設(shè)置CAN通訊的波特率,,波特率的設(shè)置范圍包括:10kbps~1Mbps。具體的定義請(qǐng)參見(jiàn)can_api.h文件中的注釋說(shuō)明,。 ? ??????? 通過(guò)配置接收過(guò)濾器,,CAN通訊接口可以實(shí)現(xiàn)只接收標(biāo)識(shí)符也接收過(guò)濾器預(yù)設(shè)值相一致的報(bào)文。接收過(guò)濾器由接收碼寄存器ACRn和接收屏蔽碼寄存器AMRn來(lái)定義的,,還可以選擇兩種不同的過(guò)濾器模式,,單過(guò)濾器模式或者雙過(guò)濾器模式。關(guān)于ACR,、AMR中各位的定義,,請(qǐng)參見(jiàn)SJA1000的數(shù)據(jù)手冊(cè),這里就不再贅述,。在英創(chuàng)提供的API函數(shù)中,,用戶可以調(diào)用以下函數(shù)來(lái)實(shí)現(xiàn)接收過(guò)濾器的設(shè)置: ? BOOL CAN_SetGlobalAcceptanceFilter(? HANDLE hDevice, ?????????????????????????????????????????????????????????????? ?????? ? ? BYTE *AcceptanceFilter, BYTE size) ? 四、CAN通訊接口的數(shù)據(jù)收發(fā) ? ??????? 在英創(chuàng)公司提供的雙CAN方案中,,CAN通訊的數(shù)據(jù)收發(fā)均采用的中斷方式,,驅(qū)動(dòng)程序中已自動(dòng)完成了數(shù)據(jù)的收發(fā),以及內(nèi)部定義的CAN接收緩沖區(qū)和發(fā)送緩沖區(qū)的管理,。對(duì)于用戶開(kāi)發(fā)應(yīng)用程序來(lái)說(shuō),,只需要調(diào)用英創(chuàng)公司提供的CAN通訊API函數(shù)中的收發(fā)函數(shù)即可。下圖為CAN驅(qū)動(dòng)程序的數(shù)據(jù)流和事件的關(guān)系圖,。 ?

??????? 在進(jìn)行CAN通訊應(yīng)用程序的開(kāi)發(fā)時(shí),,對(duì)于CAN通訊數(shù)據(jù)接收線程可以采用兩種方式:一種可以采用定時(shí)查詢,即定時(shí)調(diào)用函數(shù)CAN_GetNextReceivedFrame( …)檢測(cè)是否有接收到CAN報(bào)文數(shù)據(jù),;一種可以利用操作系統(tǒng)的消息機(jī)制,,采用事件響應(yīng)的方式,,一旦硬件接收的數(shù)據(jù)報(bào)文,底層的驅(qū)動(dòng)接收程序會(huì)自動(dòng)讀取報(bào)文,,同時(shí)發(fā)送一個(gè)接收事件,。作為應(yīng)用程序的接收線程在等待到該事件后,調(diào)用CAN_GetNextReceivedFrame(…)即可進(jìn)行CAN數(shù)據(jù)報(bào)文的讀取,。需要注意的是函數(shù)CAN_GetNextReceivedFrame每執(zhí)行一次,,只是讀取了一幀CAN數(shù)據(jù)報(bào)文,如果在應(yīng)用程序中需要將最新的數(shù)據(jù)全部讀出,,只需反復(fù)調(diào)用該函數(shù),,直到該函數(shù)的返回值為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 ); ? ????? ????? ?// 若采用定時(shí)查詢,,則調(diào)用Sleep(..)即可,Sleep的時(shí)間由應(yīng)用程序確定 ???????????? // Sleep( 50 ); ? ???????????? ceCAN->m_nRxCounter = 0,; ???????????? for( ; ; ) ??????????? ?{ ?????????????????? // 讀取已接收的所有數(shù)據(jù)幀 ???? ??????????????? bResult=CAN_GetNextReceivedFrame(ceCAN->m_hCAN, ???????????????????????????? ??????????????????????????????????????????????????????? ????? ?? &ceCAN->RxMFrame[ceCAN->m_nRxCounter] ); ???????????????????? if( !bResult ) ???????????????????? { ????????????????????????? break; ???????????????????? } ???????????????????? ceCAN->m_nRxCounter++; ???????????? } ???????????? if(ceCAN->m_nRxCounter>0 ) ????? ????? ?{ ??????????????????? // 調(diào)用回調(diào)函數(shù),,進(jìn)行必要的數(shù)據(jù)處理 ??????????????????? ceCAN->OnRead( ceCAN->m_pCANOwner ); ????? ?????? } ????? } return 0; } ? ? ??????? CAN數(shù)據(jù)報(bào)文的發(fā)送比較簡(jiǎn)單,應(yīng)用程序直接調(diào)用函數(shù)CAN_SendFrame(…)即可,。 ? ??????? 英創(chuàng)公司針對(duì)CAN總線的應(yīng)用提供圖形化的測(cè)試程序,,用戶可以直接利用該程序進(jìn)行CAN接口通訊基本收發(fā)測(cè)試。EM9000下的測(cè)試界面如下圖所示: ?

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。