主题:EM9260 ETA701 双CAN系统

  共有17361人关注过本帖    
STUDENT
1楼


EM9260 ETA701 双CAN系统  发帖心情 Post By:2011-4-1 15:29:00   [只看该作者]

您好 我根据贵公司的《双CAN接口快速实现方案》一问,想要用ETA701及EM9260组成的双CAN系统。现编写一程序,让CAN2发送一组标准桢数据给CAN1接收。我根据贵公司提供的CANTEST程序,改写如下:
//

#include "stdafx.h"
#include "lcd_api.h"
#include "EM9260_CAN.h"
#include "EM9260_Key.h" 
#include "EM9260_ISA_DIO.h" 

static void CALLBACK OnReceive( );
static void CALLBACK OnError( );

class CEM9260_CAN  m_CAN;
class CEM9260_CAN  m_CAN2;

int    type;
ULONG  ReceiveLen;
ULONG  SendLen;


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
BOOL    bResult;
char    str[100];
UINT    CanNo;
UCHAR   Baud;
UCHAR   Filter[9];
int     i1;
char    Buf[14];

// fill AcceptanceFilter<|>s parameters
Filter[0] = 0; // ACR
Filter[1] = 0x5f; // ACR
Filter[2] = 0; // ACR
Filter[3] = 0x1f; // ACR
Filter[4] = 0xff; // AMR
Filter[5] = 0xff; // AMR
Filter[6] = 0xff; // AMR
Filter[7] = 0xff; // AMR
Filter[8] = DUAL_FILTER_MODE; // Filter Mode

Baud = CAN_TIMING_250K;     // for 250Kbps
CanNo = 1;
i1 = wcslen( lpCmdLine );
if( i1>0 )
{
wcstombs( str, lpCmdLine, i1 );
//Baud = atoi( str );
sscanf( str, "%d %d", &CanNo, &Baud );
}

printf( "CanNumber: %d Baud: %d\r\n", CanNo, Baud );

bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 );
if( bResult==FALSE )
{
printf("can1 start failed!! \n" );
return -1;
}
    else
      printf("can1 start succeed!! \n");

Filter[0] = 0x4a; // ACR
Filter[1] = 0x5f; // ACR
Filter[2] = 0x4a; // ACR
Filter[3] = 0x1f; // ACR
Filter[4] = 0x4a; // AMR
Filter[5] = 0xff; // AMR
Filter[6] = 0x4a; // AMR
Filter[7] = 0xff; // AMR
Filter[8] = DUAL_FILTER_MODE; // Filter Mode

bResult = m_CAN2.StartCAN( 2, Baud, (BYTE*)Filter, 9 );
if( bResult==FALSE )
{
printf("can2 start failed!! \n" );
return -1;
}
    else
      printf("can2 start succeed!! \n");

Buf[0] = 8;
Buf[1] = 1;
Buf[2] = 0;
for( i1=3; i1<11; i1++ )
{
Buf[i1] = (char)i1;
}

m_CAN.OnRead = OnReceive;
m_CAN.OnError = OnError;
ReceiveLen = 0;
SendLen = 0;

bResult = m_CAN2.WriteCAN( (BYTE*)Buf, 11 );
if( bResult==FALSE )
{
printf("can2 send failed!! \r\n" );
return -1;
}
    else
      printf("can2 send succeed!! \r\n");

for(   )
{

printf("waiting for message \r\n");
Sleep( 1000 );
}

m_CAN.StopCAN( );
m_CAN2.StopCAN( );
return 0;
}

void CALLBACK OnReceive( )
{
char     RxBuf[14];
char     str[200];
UCHAR    dlen;

    printf("can1 receive succeed!! \r\n");
memcpy( RxBuf, &m_CAN.RxMFrame, 13 );
dlen = RxBuf[0]&0x0f;
if( RxBuf[0]&0x80 ) // 扩展帧
{
m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 );
}
else // 标准帧
{
    m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+3);
}

ReceiveLen += dlen;

}

void CALLBACK OnError( )
{

}


程序输出结果为:
CanNumber:1 Baud: 5
can1 start succeed!!
can2 start succeed!!
can2 send succeed!!
waiting for message
1
2
1
然后该程序自动结束运行。不知道我的程序是哪里出了问题?CAN1没有接收到数据。
另外,程序最后输出的1,2,1三个数字是否表示CAN1的接收错误?这些错误具体指什么?

  单帖管理 | 引用 | 回复 回到顶部
zhl
2楼


  发帖心情 Post By:2011-4-1 15:53:00   [只看该作者]

1、回调函数的赋值要放在StartCAN之前,如:
m_CAN.OnRead = OnReceive;
m_CAN.OnError = OnError;
bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 );
2、CAN2接口class对象,没有设置回调函数。

  单帖管理 | 引用 | 回复 回到顶部
STUDENT
3楼


  发帖心情 Post By:2011-4-6 14:39:00   [只看该作者]

根据回复,修改程序如下:

#include "stdafx.h"
#include "lcd_api.h"
#include "EM9260_CAN.h"
#include "EM9260_Key.h" 
#include "EM9260_ISA_DIO.h" 

static void CALLBACK OnReceive( );
static void CALLBACK OnError( );

static void CALLBACK OnReceive2( );
static void CALLBACK OnError2( );

class CEM9260_CAN  m_CAN;
class CEM9260_CAN  m_CAN2;

int    type;
ULONG  ReceiveLen;
ULONG  SendLen;


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR    lpCmdLine,
int       nCmdShow)
{
BOOL    bResult;
char    str[100];
UINT    CanNo;
UCHAR   Baud;
UCHAR   Filter[9];
int     i1;
char    Buf[14];

// fill AcceptanceFilter<|>s parameters
Filter[0] = 0; // ACR
Filter[1] = 0x5f; // ACR
Filter[2] = 0; // ACR
Filter[3] = 0x1f; // ACR
Filter[4] = 0xff; // AMR
Filter[5] = 0xff; // AMR
Filter[6] = 0xff; // AMR
Filter[7] = 0xff; // AMR
Filter[8] = DUAL_FILTER_MODE; // Filter Mode

Baud = CAN_TIMING_250K;     // for 250Kbps
CanNo = 1;
i1 = wcslen( lpCmdLine );
if( i1>0 )
{
wcstombs( str, lpCmdLine, i1 );
//Baud = atoi( str );
sscanf( str, "%d %d", &CanNo, &Baud );
}

printf( "CanNumber: %d Baud: %d\r\n", CanNo, Baud );

m_CAN.OnRead = OnReceive;
m_CAN.OnError = OnError;
ReceiveLen = 0;
SendLen = 0;



bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 );
if( bResult==FALSE )
{
printf("can1 start failed!! \n" );
return -1;
}
    else
      printf("can1 start succeed!! \n");

Filter[0] = 0x4a; // ACR
Filter[1] = 0x5f; // ACR
Filter[2] = 0x4a; // ACR
Filter[3] = 0x1f; // ACR
Filter[4] = 0x4a; // AMR
Filter[5] = 0xff; // AMR
Filter[6] = 0x4a; // AMR
Filter[7] = 0xff; // AMR
Filter[8] = DUAL_FILTER_MODE; // Filter Mode


m_CAN2.OnRead = OnReceive2;
m_CAN2.OnError = OnError2;
bResult = m_CAN2.StartCAN( 2, Baud, (BYTE*)Filter, 9 );
if( bResult==FALSE )
{
printf("can2 start failed!! \n" );
return -1;
}
    else
      printf("can2 start succeed!! \n");


    //发送数据内容
Buf[0] = 8;
Buf[1] = 1;
Buf[2] = 0;
for( i1=3; i1<11; i1++ )
{
Buf[i1] = (char)i1;
}


    //发送测试1:CAN2向CAN1发送
bResult = m_CAN2.WriteCAN( (BYTE*)Buf, 11 );
if( bResult==FALSE )
{
printf("can2 send failed!! \r\n" );
return -1;
}
    else
      printf("can2 send succeed!! \r\n");
  

//发送测试2:CAN1向CAN2发送
/*bResult = m_CAN.WriteCAN( (BYTE*)Buf, 11 );
if( bResult==FALSE )
{
printf("can1 send failed!! \r\n" );
return -1;
}
    else
      printf("can1 send succeed!! \r\n");
 */ 
for(   )
{

printf("waiting for message \r\n");
Sleep( 1000 );
}

m_CAN.StopCAN( );
m_CAN2.StopCAN( );
return 0;
}

void CALLBACK OnReceive( )
{
char     RxBuf[14];
char     str[200];
UCHAR    dlen;

    printf("can1 receive succeed!! \r\n");
memcpy( RxBuf, &m_CAN.RxMFrame, 13 );
dlen = RxBuf[0]&0x0f;
if( RxBuf[0]&0x80 ) // 扩展帧
{
m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 );
}
else // 标准帧
{
    m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+3);
}

ReceiveLen += dlen;

}

void CALLBACK OnError( )
{
printf("can1 receive error!! \r\n");
}


void CALLBACK OnReceive2( )
{
char     RxBuf[14];
char     str[200];
UCHAR    dlen;

    printf("can2 receive succeed!! \r\n");
memcpy( RxBuf, &m_CAN.RxMFrame, 13 );
dlen = RxBuf[0]&0x0f;
if( RxBuf[0]&0x80 ) // 扩展帧
{
m_CAN2.WriteCAN( (BYTE*)RxBuf, dlen+5 );
}
else // 标准帧
{
    m_CAN2.WriteCAN( (BYTE*)RxBuf, dlen+3);
}

ReceiveLen += dlen;

}

void CALLBACK OnError2( )
{
printf("can2 receive error!! \r\n");
}
程序意图为初始化CAN1,CAN2,并从CAN2向CAN1发送一组数据。
程序执行的结果为:
CanNumber:1 Baud: 5
can1 start succeed!!
can2 start succeed!!
can2 send succeed!!
waiting for message
1
can1 receive error!!
2
can1 receive error!!
1
can2 receive error!!
2
can2 receive error!!
waiting for message
waiting for message
waiting for message。。。

不知道是什么原因导致出错?

同时,如果将同一组数据由CAN1向CAN2发送时,程序运行结果为:
CanNumber:1 Baud: 5
can1 start succeed!!
can2 start succeed!!
can1 send succeed!!
waiting for message
3
can2 receive error!!
1
can1 receive error!!
2
can1 receive error!!
waiting for message
waiting for message
waiting for message。。。

不知道出错原因是什么?希望能帮下忙。谢谢了!

  单帖管理 | 引用 | 回复 回到顶部

返回首页

EM9260 ETA701 双CAN系统

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: