WinCE系統(tǒng)雙CAN構建方案 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
文章來源:http://www.emtronix.com/case/case2008190.html | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
??????? CAN(Controller Area Network)即控制器局域網(wǎng),由于具有高性能、高可靠性以及簡單的網(wǎng)絡結構,在工業(yè)系統(tǒng)中越來越受到人們的重視,并迅速成為了目前國際上應用最廣泛的現(xiàn)場總線之一。 ? ??????? 英創(chuàng)提供的EM9000系列ARM9嵌入式主板,包括EM9000、EM9260、EM9360等多種型號,都預裝了正版WinCE操作系統(tǒng),且?guī)в袠藴蔆AN通訊接口。與板上其他標準通訊接口一樣,英創(chuàng)公司為所有EM9000系列嵌入式主板的CAN接口配置了標準的WinCE流式驅動程序,應用程序可以通過打開文件的進行讀寫的標準方式實現(xiàn)對CAN總線接口的數(shù)據(jù)通訊。本文側重于介紹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)境中的控制器局域網(wǎng)絡(CAN)芯片。它是PHILIPS半導體PCA82C200 CAN控制器(BasicCAN)的替代產品,而且它增加了一種新的工作模式(PeliCAN),這種模式支持具有很多新特性的CAN 2.0B協(xié)議。 ? ??????? EM9000嵌入式主板和ETA701模塊的CAN通訊接口可提供高達1Mbps的數(shù)據(jù)傳輸速率,當采用5Kbps的的數(shù)據(jù)傳輸速率時其通訊距離最高可達到10KM。硬件的錯誤檢定特性也增強了CAN的抗電磁干擾能力,這給數(shù)據(jù)的遠程可靠傳輸提供了有利保證。 ? ??????? 在EM9000嵌入式主板和ETA701模塊的CAN通訊接口根據(jù)用戶的需要分為兩種:一種帶光電隔離,一種不帶光電隔離。帶光電隔離CAN總線通訊模塊的CAN收發(fā)器端的所有信號和電源與其它部分完全隔離,可承受至少1Kv(有效值)的電壓沖擊。CAN接口驅動函數(shù) 一、CAN報文的幀格式 ? ??????? 在CAN2.0B中存在兩種不同的幀格式,其主要的區(qū)別在于標識符的長度,具有11位標識符的幀稱為標準幀,而包括有29位標識符的幀稱為擴展幀。下面分別介紹數(shù)據(jù)幀的格式。 ? 1、CAN2.0B標準幀 ? ??????? CAN標準幀信息為11個字節(jié),包括兩部分:信息和數(shù)據(jù)部分。前3個字節(jié)為信息部分,如圖所示: ?
????????????????????????????????????????????? ?NULL, OPEN_EXISTING, 0, NULL); ? ??????? 對于CAN2通訊接口,只需將其中的名稱換成 _T(“CAN2:”)即可。在創(chuàng)建CAN設備得到有效的handle之后,就可以調用can_api.h中定義的相應函數(shù)來啟動CAN設備接口。 ? ????????BOOL ?CAN_StartChip (HANDLE hDevice); ? ??????? 至此CAN通訊接口進入工作模式。 ? 三、設置CAN通訊接口參數(shù) ? ??????? 在進行CAN數(shù)據(jù)通訊之前,需要設置和CAN通訊相關的一些參數(shù),包括CAN通訊的波特率設置以及對接收過濾器的設置。 ? BOOL?? CAN_SetBaudRate(HANDLE hDevice, BYTE *index); 用于設置CAN通訊的波特率,波特率的設置范圍包括:10kbps~1Mbps。具體的定義請參見can_api.h文件中的注釋說明。 ? ??????? 通過配置接收過濾器,CAN通訊接口可以實現(xiàn)只接收標識符也接收過濾器預設值相一致的報文。接收過濾器由接收碼寄存器ACRn和接收屏蔽碼寄存器AMRn來定義的,還可以選擇兩種不同的過濾器模式,單過濾器模式或者雙過濾器模式。關于ACR、AMR中各位的定義,請參見SJA1000的數(shù)據(jù)手冊,這里就不再贅述。在英創(chuàng)提供的API函數(shù)中,用戶可以調用以下函數(shù)來實現(xiàn)接收過濾器的設置: ? BOOL CAN_SetGlobalAcceptanceFilter(? HANDLE hDevice, ?????????????????????????????????????????????????????????????? ?????? ? ? BYTE *AcceptanceFilter, BYTE size) ? 四、CAN通訊接口的數(shù)據(jù)收發(fā) ? ??????? 在英創(chuàng)公司提供的雙CAN方案中,CAN通訊的數(shù)據(jù)收發(fā)均采用的中斷方式,驅動程序中已自動完成了數(shù)據(jù)的收發(fā),以及內部定義的CAN接收緩沖區(qū)和發(fā)送緩沖區(qū)的管理。對于用戶開發(fā)應用程序來說,只需要調用英創(chuàng)公司提供的CAN通訊API函數(shù)中的收發(fā)函數(shù)即可。下圖為CAN驅動程序的數(shù)據(jù)流和事件的關系圖。 ? ??????? 在進行CAN通訊應用程序的開發(fā)時,對于CAN通訊數(shù)據(jù)接收線程可以采用兩種方式:一種可以采用定時查詢,即定時調用函數(shù)CAN_GetNextReceivedFrame( …)檢測是否有接收到CAN報文數(shù)據(jù);一種可以利用操作系統(tǒng)的消息機制,采用事件響應的方式,一旦硬件接收的數(shù)據(jù)報文,底層的驅動接收程序會自動讀取報文,同時發(fā)送一個接收事件。作為應用程序的接收線程在等待到該事件后,調用CAN_GetNextReceivedFrame(…)即可進行CAN數(shù)據(jù)報文的讀取。需要注意的是函數(shù)CAN_GetNextReceivedFrame每執(zhí)行一次,只是讀取了一幀CAN數(shù)據(jù)報文,如果在應用程序中需要將最新的數(shù)據(jù)全部讀出,只需反復調用該函數(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 ); ? ????? ????? ?// 若采用定時查詢,則調用Sleep(..)即可,Sleep的時間由應用程序確定 ???????????? // 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 ) ????? ????? ?{ ??????????????????? // 調用回調函數(shù),進行必要的數(shù)據(jù)處理 ??????????????????? ceCAN->OnRead( ceCAN->m_pCANOwner ); ????? ?????? } ????? } return 0; } ? ? ??????? CAN數(shù)據(jù)報文的發(fā)送比較簡單,應用程序直接調用函數(shù)CAN_SendFrame(…)即可。 ? ??????? 英創(chuàng)公司針對CAN總線的應用提供圖形化的測試程序,用戶可以直接利用該程序進行CAN接口通訊基本收發(fā)測試。EM9000下的測試界面如下圖所示: ? |
本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。