我用CAN分析仪与28377d通信,只能28377d发送数据,但不能接收数据,而且28377d不断发送相同的数据,我用的是controlsuite的can_loopback的例程,波特率和终端电阻都用对了,例程只修改了GPIO引脚,以及注释掉了测试模式,其他基本没变,但28377一直接收不到数据,搞了好几天没弄明白哪里出错了,救救孩子吧
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我用CAN分析仪与28377d通信,只能28377d发送数据,但不能接收数据,而且28377d不断发送相同的数据,我用的是controlsuite的can_loopback的例程,波特率和终端电阻都用对了,例程只修改了GPIO引脚,以及注释掉了测试模式,其他基本没变,但28377一直接收不到数据,搞了好几天没弄明白哪里出错了,救救孩子吧
非常感谢你的解答,看了你的截图我发现是自己原来调试程序的问题,用单步运行的方式跑到CAN_readMassage的时候会导致收不到数据会出错,如果直接在后面设断点就没问题了,再次感谢
还想问一下关于外部时钟的问题,我看参考手册学习这块板子的时候一直以为外部时钟XTAL_OSC是需要另外安装到板子上的,但是在例程的库函数里面发现直接使用的就是20MHZ的XTAL_OSC,这是代表280049C上的已经有了外部时钟而且是20MHZ吗?
非常感谢你的回答,使用未修改的例程时进行的是环回模式,CCS调试是可以实现自发自收,板子是自制板,用的28377D,没有终端电阻,但分析仪上有2个120欧姆电阻,例程我只改过can_loopback.c里的程序,我把测试模式注释掉了,具体代码如下:
int
main(void)
{
InitSysCtrl();
//对应28377D引脚
InitGpio();
GPIO_SetupPinMux(13, GPIO_MUX_CPU1, 2); //GPIO13 - CANRXB
GPIO_SetupPinMux(12, GPIO_MUX_CPU1, 2); //GPIO12 - CANTXB
GPIO_SetupPinOptions(13, GPIO_INPUT, GPIO_ASYNC);
GPIO_SetupPinOptions(12, GPIO_OUTPUT, GPIO_PUSHPULL);
CANInit(CANB_BASE);
CANClkSourceSelect(CANB_BASE, 0);
CANBitRateSet(CANB_BASE, 200000000, 250000);
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// HWREG(CANB_BASE + CAN_O_CTL) |= CAN_CTL_TEST;
// HWREG(CANB_BASE + CAN_O_TEST) = CAN_TEST_EXL;
// HWREG(CANB_BASE + CAN_O_TEST) = CAN_TEST_RX;
CANEnable(CANB_BASE);
*(unsigned long *)ucTXMsgData = 8;
sTXCANMessage.ui32MsgID = 6;
sTXCANMessage.ui32MsgIDMask = 0;
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sTXCANMessage.ui32MsgLen = sizeof(ucTXMsgData);
sTXCANMessage.pucMsgData = ucTXMsgData;
*(unsigned long *)ucRXMsgData = 8;
sRXCANMessage.ui32MsgID = 5;
sRXCANMessage.ui32MsgIDMask = 0;
sRXCANMessage.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage.ui32MsgLen = sizeof(ucRXMsgData);
sRXCANMessage.pucMsgData = ucRXMsgData;
CANMessageSet(CANB_BASE, 2, &sRXCANMessage, MSG_OBJ_TYPE_RX);
for(;;)
{
CANMessageSet(CANB_BASE, 1, &sTXCANMessage, MSG_OBJ_TYPE_TX);
DELAY_US(1000*1000);
CANMessageGet(CANB_BASE, 2, &sRXCANMessage, true);
if((*(unsigned long *)ucTXMsgData) != (*(unsigned long *)ucRXMsgData))
{
//asm(" ESTOP0")
}
g_ulMsgCount++;
(*(unsigned long *)ucTXMsgData)++;
}
}
user6154130 说:使用未修改的例程时进行的是环回模式,CCS调试是可以实现自发自收,板子是自制板,用的28377D,没有终端电阻,但分析仪上有2个120欧姆电阻,例程我只改过can_loopback.c里的程序,我把测试模式注释掉了
您现在在使用您自制的377D的板子测试TI例程时是可以成功的?
目前只是修改了测试模式(注释掉),就不可以进行成功收发了?我的理解对吗?
如TRM内的说明( http://www.ti.com.cn/cn/lit/ug/spruhm8i/spruhm8i.pdf )22.4.3 Test Modes
The CAN module provides several test modes which are mainly intended for self-test purposes.
Test Modes主要是用于自测本身CAN通信的,一般是数据通过从CANTX发送后经内部传回CAN core 的
Data transmitted is visible on the CANTXA pin and is received internally back to the CAN Core
若是您想使用Normal Operation Config 也就是一般模式的话,建议您使用
can_ex4_simple_transmit 和 can_ex5_simple_receive 例程