新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于WINCE的CAN驅(qū)動(dòng)的研究與實(shí)現(xiàn)

基于WINCE的CAN驅(qū)動(dòng)的研究與實(shí)現(xiàn)

作者: 時(shí)間:2012-03-24 來源:網(wǎng)絡(luò) 收藏

4 接口設(shè)計(jì)

4.1軟硬件環(huán)境

驅(qū)動(dòng)的開發(fā)依托于北京昆侖通態(tài)公司現(xiàn)有的軟硬件平臺(tái)進(jìn)行項(xiàng)目設(shè)計(jì),具體平臺(tái)環(huán)境描述如下:

①硬件軟件平臺(tái):北京昆侖通態(tài)公司的nTouch HMI TB33H和TD33H;嵌入式組態(tài)軟件:Mcgsce.exe。

控制器:SJA1000。 SJA1000是PHILIPS公司早期控制器PCA82C200的替代品,功能更強(qiáng)。

③實(shí)時(shí)操作系統(tǒng):WINCE。WINCE是一個(gè)高效率的實(shí)時(shí)操作系統(tǒng),擁有多線程、多任務(wù)、確定的實(shí)時(shí)性和完全搶占式優(yōu)先級的環(huán)境,專門面向只有有限的資源的硬件系統(tǒng)。

4.2 接口設(shè)計(jì)

下面列舉了主要的用戶接口和外部接口,外部接口提供給父設(shè)備調(diào)用,完成CAN控制功能:

(1)SvrGetCanID( )得到當(dāng)前設(shè)置的Can ID,成功返回0,失敗返回-1。

(2)SvrClearCanInBuff( )讀Can卡數(shù)據(jù)并清空Can卡輸入緩沖區(qū),成功返回0,失敗返回-1。

(3)SvrWriteAndRead( )寫并且讀Can卡操作,發(fā)送一個(gè)消息包,然后接收指定長度數(shù)據(jù)。成功返回接收到的字節(jié)數(shù),失敗返回-1。

(4)SvrRegisterID( ),注冊用戶ID。只有注冊了ID的用戶,父設(shè)備才會(huì)收到接收緩沖中。在子設(shè)備開發(fā)時(shí),必須先注冊,才能做接收數(shù)據(jù)的操作。

(5)SvrUnregisterID( )注銷用戶ID。

用戶只需要學(xué)會(huì)使用上面的五個(gè)接口,就可以開發(fā)驅(qū)動(dòng)了。

SvrGetCanID接口可以得到父設(shè)備的地址ID。象串口操作一樣,發(fā)送前需要清空Can卡緩沖區(qū),需要調(diào)用SvrClearCanInBuff接口。發(fā)送子設(shè)備數(shù)據(jù)需要調(diào)用SvrWriteAndRead接口。先把目的子站ID放入dwID變量中,要發(fā)送的數(shù)據(jù)放入緩沖區(qū)buf中,通過dwLen 設(shè)置需要讀數(shù)據(jù)長度,通過dwDelayTime設(shè)置延時(shí)時(shí)間(單位為毫秒)。

第一步:組態(tài)初始化設(shè)置,在_DLL_FUNC 的SvrGetDevInfo( )函數(shù)中,定義Can卡子設(shè)備驅(qū)動(dòng):devType = DEV_CHILD定義為子設(shè)備;devStyle = DEV_CAN定義為父設(shè)備。

第二步:得到接口的指針。

第三步:清空Can卡緩沖區(qū):調(diào)用SvrClearCanInBuff( )。

第四步:發(fā)送子設(shè)備數(shù)據(jù)(發(fā)子設(shè)備數(shù)據(jù)可能需要父設(shè)備地址:調(diào)用SvrGetCanID),并得到它的返回:調(diào)用SvrWriteAndRead( )。

第五步:解析上面的返回?cái)?shù)據(jù),按照子設(shè)備協(xié)議繼續(xù)進(jìn)行處理。

4.3 工作方式

驅(qū)動(dòng)程序由三部分組成:在Windows內(nèi)核中工作的windows設(shè)備驅(qū)動(dòng)程序、中的CAN父設(shè)備、中的CAN子設(shè)備。

windows設(shè)備驅(qū)動(dòng)程序:由于使用多主通訊,通訊的發(fā)生時(shí)間是不可預(yù)知的,而且sja1000的通訊緩沖區(qū)有限(64字節(jié)),因此最好在中斷中處理通訊事務(wù)。建議將大部分工作在windows設(shè)備驅(qū)動(dòng)程序中完成??梢越⒁粔K內(nèi)存如:unsigned char can_data[60][2][64][4]。將所有收到的I/O模塊的寄存器數(shù)據(jù)解包后保存到該內(nèi)存中,數(shù)組下標(biāo)依次是模塊地址(實(shí)際應(yīng)減4)、過程或參數(shù)、寄存器編號(hào)、寄存器數(shù)據(jù)字節(jié)序號(hào)。MCGS可以通過windows設(shè)備驅(qū)動(dòng)程序直接用讀文件操作函數(shù)讀出寄存器值,用寫文件操作函數(shù)將可寫的參數(shù)寄存器值寫入windows設(shè)備驅(qū)動(dòng)程序,windows設(shè)備驅(qū)動(dòng)程序?qū)⑵浯虬鼮槊顢?shù)據(jù)幀發(fā)出。windows設(shè)備驅(qū)動(dòng)程序還要完成對設(shè)備狀態(tài)的監(jiān)視,可使用一個(gè)60個(gè)元素的char數(shù)組來標(biāo)識(shí)I/O設(shè)備(最大60個(gè)設(shè)備)的狀態(tài),值0為正常,其它為異常。當(dāng)6秒內(nèi)未收到模塊的節(jié)拍幀時(shí),應(yīng)將模塊對應(yīng)的狀態(tài)置成1。MCGS應(yīng)能通過windows設(shè)備驅(qū)動(dòng)程序讀出設(shè)備狀態(tài)。

MCGS中的CAN父設(shè)備:建議在MCGS中的CAN父設(shè)備中做改變通訊速率的工作。父設(shè)備通過windows設(shè)備驅(qū)動(dòng)程序的ioctl函數(shù)來改變通訊速率。

MCGS中的CAN子設(shè)備:建議為了簡化組態(tài)工作,為每一種不同類型的I/O模塊定制不同的CAN子設(shè)備。Can子設(shè)備包含了模塊名稱、生產(chǎn)廠家、版本等信息,其中最重要的是模塊的過程和參數(shù)寄存器的數(shù)量和數(shù)據(jù)類型。



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉