基于WINCE的CAN驅(qū)動的研究與實(shí)現(xiàn)
4 接口設(shè)計(jì)
4.1軟硬件環(huán)境
CAN驅(qū)動的開發(fā)依托于北京昆侖通態(tài)公司現(xiàn)有的軟硬件平臺進(jìn)行項(xiàng)目設(shè)計(jì),具體平臺環(huán)境描述如下:
①硬件軟件平臺:北京昆侖通態(tài)公司的nTouch HMI TB33H和TD33H;嵌入式組態(tài)軟件:Mcgsce.exe。
②CAN控制器:SJA1000。 SJA1000是PHILIPS公司早期CAN控制器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è)備才會收到接收緩沖中。在子設(shè)備開發(fā)時(shí),必須先注冊,才能做接收數(shù)據(jù)的操作。
(5)SvrUnregisterID( )注銷用戶ID。
用戶只需要學(xué)會使用上面的五個(gè)接口,就可以開發(fā)驅(qū)動了。
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è)置,在MCGS_DLL_FUNC 的SvrGetDevInfo( )函數(shù)中,定義Can卡子設(shè)備驅(qū)動: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ū)動程序由三部分組成:在Windows內(nèi)核中工作的windows設(shè)備驅(qū)動程序、MCGS中的CAN父設(shè)備、MCGS中的CAN子設(shè)備。
windows設(shè)備驅(qū)動程序:由于使用多主通訊,通訊的發(fā)生時(shí)間是不可預(yù)知的,而且sja1000的通訊緩沖區(qū)有限(64字節(jié)),因此最好在中斷中處理通訊事務(wù)。建議將大部分工作在windows設(shè)備驅(qū)動程序中完成??梢越⒁粔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ù)、寄存器編號、寄存器數(shù)據(jù)字節(jié)序號。MCGS可以通過windows設(shè)備驅(qū)動程序直接用讀文件操作函數(shù)讀出寄存器值,用寫文件操作函數(shù)將可寫的參數(shù)寄存器值寫入windows設(shè)備驅(qū)動程序,windows設(shè)備驅(qū)動程序?qū)⑵浯虬鼮槊顢?shù)據(jù)幀發(fā)出。windows設(shè)備驅(qū)動程序還要完成對設(shè)備狀態(tài)的監(jiān)視,可使用一個(gè)60個(gè)元素的char數(shù)組來標(biāo)識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ū)動程序讀出設(shè)備狀態(tài)。
MCGS中的CAN父設(shè)備:建議在MCGS中的CAN父設(shè)備中做改變通訊速率的工作。父設(shè)備通過windows設(shè)備驅(qū)動程序的ioctl函數(shù)來改變通訊速率。
MCGS中的CAN子設(shè)備:建議為了簡化組態(tài)工作,為每一種不同類型的I/O模塊定制不同的CAN子設(shè)備。Can子設(shè)備包含了模塊名稱、生產(chǎn)廠家、版本等信息,其中最重要的是模塊的過程和參數(shù)寄存器的數(shù)量和數(shù)據(jù)類型。
評論