基于WINCE的CAN驅動的研究與實現
4 接口設計
4.1軟硬件環境
CAN驅動的開發依托于北京昆侖通態公司現有的軟硬件平臺進行項目設計,具體平臺環境描述如下:
①硬件軟件平臺:北京昆侖通態公司的nTouch HMI TB33H和TD33H;嵌入式組態軟件:Mcgsce.exe。
②CAN控制器:SJA1000。 SJA1000是PHILIPS公司早期CAN控制器PCA82C200的替代品,功能更強。
③實時操作系統:WINCE。WINCE是一個高效率的實時操作系統,擁有多線程、多任務、確定的實時性和完全搶占式優先級的環境,專門面向只有有限的資源的硬件系統。
4.2 接口設計
下面列舉了主要的用戶接口和外部接口,外部接口提供給父設備調用,完成CAN控制功能:
(1)SvrGetCanID( )得到當前設置的Can ID,成功返回0,失敗返回-1。
(2)SvrClearCanInBuff( )讀Can卡數據并清空Can卡輸入緩沖區,成功返回0,失敗返回-1。
(3)SvrWriteAndRead( )寫并且讀Can卡操作,發送一個消息包,然后接收指定長度數據。成功返回接收到的字節數,失敗返回-1。
(4)SvrRegisterID( ),注冊用戶ID。只有注冊了ID的用戶,父設備才會收到接收緩沖中。在子設備開發時,必須先注冊,才能做接收數據的操作。
(5)SvrUnregisterID( )注銷用戶ID。
用戶只需要學會使用上面的五個接口,就可以開發驅動了。
SvrGetCanID接口可以得到父設備的地址ID。象串口操作一樣,發送前需要清空Can卡緩沖區,需要調用SvrClearCanInBuff接口。發送子設備數據需要調用SvrWriteAndRead接口。先把目的子站ID放入dwID變量中,要發送的數據放入緩沖區buf中,通過dwLen 設置需要讀數據長度,通過dwDelayTime設置延時時間(單位為毫秒)。
第一步:組態初始化設置,在MCGS_DLL_FUNC 的SvrGetDevInfo( )函數中,定義Can卡子設備驅動:devType = DEV_CHILD定義為子設備;devStyle = DEV_CAN定義為父設備。
第二步:得到接口的指針。
第三步:清空Can卡緩沖區:調用SvrClearCanInBuff( )。
第四步:發送子設備數據(發子設備數據可能需要父設備地址:調用SvrGetCanID),并得到它的返回:調用SvrWriteAndRead( )。
第五步:解析上面的返回數據,按照子設備協議繼續進行處理。
4.3 工作方式
驅動程序由三部分組成:在Windows內核中工作的windows設備驅動程序、MCGS中的CAN父設備、MCGS中的CAN子設備。
windows設備驅動程序:由于使用多主通訊,通訊的發生時間是不可預知的,而且sja1000的通訊緩沖區有限(64字節),因此最好在中斷中處理通訊事務。建議將大部分工作在windows設備驅動程序中完成。可以建立一塊內存如:unsigned char can_data[60][2][64][4]。將所有收到的I/O模塊的寄存器數據解包后保存到該內存中,數組下標依次是模塊地址(實際應減4)、過程或參數、寄存器編號、寄存器數據字節序號。MCGS可以通過windows設備驅動程序直接用讀文件操作函數讀出寄存器值,用寫文件操作函數將可寫的參數寄存器值寫入windows設備驅動程序,windows設備驅動程序將其打包為命令數據幀發出。windows設備驅動程序還要完成對設備狀態的監視,可使用一個60個元素的char數組來標識I/O設備(最大60個設備)的狀態,值0為正常,其它為異常。當6秒內未收到模塊的節拍幀時,應將模塊對應的狀態置成1。MCGS應能通過windows設備驅動程序讀出設備狀態。
MCGS中的CAN父設備:建議在MCGS中的CAN父設備中做改變通訊速率的工作。父設備通過windows設備驅動程序的ioctl函數來改變通訊速率。
MCGS中的CAN子設備:建議為了簡化組態工作,為每一種不同類型的I/O模塊定制不同的CAN子設備。Can子設備包含了模塊名稱、生產廠家、版本等信息,其中最重要的是模塊的過程和參數寄存器的數量和數據類型。
評論