技术天地

SJA1000的CAN通讯接口函数扩展应用说明    发布时间:2011-11-25    被阅览数:

        在现有的can_api.h所提供的接口函数的基础上,推出CAN接口通讯一些扩展应用功能,主要是为每个接收的数据包均加上了时间标签,以支持实时控制的应用。为了兼容以前接口函数,can_api.h保持不变,英创公司另外定义了一个can_api_ex.h,在该文件中定义了带有时间标签的CAN数据报文结构。

 

typedef struct
{
        // CAN数据报文ID,其中
        bit 0-28 : CAN identifier (11/29 bit)
        bit 29 : error frame flag (0 = data frame, 1 = error frame)
        bit 30 : remote transmission request flag (1 = rtr frame)
        bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
        DWORD dwCAN_ID;
        // CAN数据报文中的数据长度 
        DWORD dwCAN_DatLen;
        // CAN数据报文中的数据
        UCHAR ucDat[8];
        // CAN数据报文的时间标签,单位为毫秒
        DWORD dwTimeTick;
} CAN_FRAME, *PCAN_FRAME;

 

        获取带有时间标签的CAN接收报文,可通过调用标准的ReadFile( ) 来实现,相应的发送函数也可调用WriteFile( )来处理。以下为接收线程中的获取带有时间标签的CAN数据报文的方法:

 

WaitForSingleObject( ceCAN->m_hRxEvent, 15 );
{
        dwLen = 0;
        bResult = ReadFile(ceCAN->m_hCAN,
        &ceCAN->can_frame,
        sizeof(CAN_FRAME), &dwLen, NULL );
        if( dwLen==sizeof(CAN_FRAME) ) // receive a can frame
        {
                if( dwLastTimeTick == 0 )
                {
                        printf( '0x%08x - %ld\n', ceCAN->can_frame.dwCAN_ID, ceCAN->can_frame.dwTimeTick );
                        dwLastTimeTick = ceCAN->can_frame.dwTimeTick;
                }
                else
                {
                        printf( '0x%08x - %ld\n', ceCAN->can_frame.dwCAN_ID, ceCAN->can_frame.dwTimeTick-dwLastTimeTick );
                        dwLastTimeTick = ceCAN->can_frame.dwTimeTick;
                }
        }
}

 

        经过测试,在英创嵌入式主板上CAN时间标签的精度能够保证在±1ms。

 

        由于读取带有时间标签的CAN数据报文采用的是系统标准函数ReadFile,所以对该扩展功能感兴趣的老客户,需要对已有的英创嵌入式主板WinCE内核进行升级,而can_api.lib不需做任何变化。具体can_api.h中定义的接口函数参见《基于SJA1000的CAN通讯接口函数使用说明》一文。

 

        感兴趣的客户可以和英创的技术支持联系。

Go Top