新聞中心

        EEPW首頁(yè) > 嵌入式系統(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 來(lái)源:網(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)先級(jí)的環(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è)消息包,然后接收指定長(zhǎng)度數(shù)據(jù)。成功返回接收到的字節(jié)數(shù),失敗返回-1。

        (4)SvrRegisterID( ),注冊(cè)用戶ID。只有注冊(cè)了ID的用戶,父設(shè)備才會(huì)收到接收緩沖中。在子設(shè)備開發(fā)時(shí),必須先注冊(cè),才能做接收數(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中,通過(guò)dwLen 設(shè)置需要讀數(shù)據(jù)長(zhǎng)度,通過(guò)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)程序中完成。可以建立一塊內(nèi)存如:unsigned char can_data[60][2][64][4]。將所有收到的I/O模塊的寄存器數(shù)據(jù)解包后保存到該內(nèi)存中,數(shù)組下標(biāo)依次是模塊地址(實(shí)際應(yīng)減4)、過(guò)程或參數(shù)、寄存器編號(hào)、寄存器數(shù)據(jù)字節(jié)序號(hào)。MCGS可以通過(guò)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)程序還要完成對(duì)設(shè)備狀態(tài)的監(jiān)視,可使用一個(gè)60個(gè)元素的char數(shù)組來(lái)標(biāo)識(shí)I/O設(shè)備(最大60個(gè)設(shè)備)的狀態(tài),值0為正常,其它為異常。當(dāng)6秒內(nèi)未收到模塊的節(jié)拍幀時(shí),應(yīng)將模塊對(duì)應(yīng)的狀態(tài)置成1。MCGS應(yīng)能通過(guò)windows設(shè)備驅(qū)動(dòng)程序讀出設(shè)備狀態(tài)。

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

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



        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 长岛县| 浦东新区| 滦平县| 万荣县| 昌都县| 鹤壁市| 晋州市| 瑞昌市| 兰州市| 巍山| 凤凰县| 紫阳县| 靖江市| 新密市| 广元市| 越西县| 邻水| 高雄县| 锡林浩特市| 县级市| 年辖:市辖区| 玉龙| 剑川县| 洞口县| 昔阳县| 辽宁省| 聊城市| 乌拉特前旗| 萝北县| 丹棱县| 长乐市| 南木林县| 涟源市| 石泉县| 七台河市| 巴塘县| 鄯善县| 宁安市| 临湘市| 毕节市| 河曲县|