AWR1642 CAN-FD如何判断发送成功?



我们的CAN测试代码如图所示:

通过CAN卡在电脑上接收数据,但是不是所有的数据都能够在CAN卡上接收到,是不是CANFD_transmitData这个函数的返回值不能用来判断CAN发送是否完成?

谢谢!

  • 你好,
    请确认通信的速率及方式。参考链接:e2e.ti.com/.../2306975
    另外,关于发送成功计数,请参考e2e.ti.com/.../658761

    谢谢。
  • 发送成功这部分有点问题,按我的理解,如果我不断调用CANFD_transmitData函数,直到其返回值为0,就一定能够保证我的数据发出去。但是我实验后发现,我贴出来的程序只能够不断发出第一帧和第二帧(i=1和i=2),后面的帧都发不出来。
  • 后来又使用了中断来进行发送,在发送中断回调函数中发送下一帧报文。但是仍然存在丢包的情况。例如:我在发送中断中会发送id=0-9的10个报文,使用500K的波特率。理论发送间隔为300us,我在CAN卡上观测到的现象是ID=0-4的报文在不断循环的发送,间隔都是300us。
  • 你好,

    可用这种方式实现连续发送:

    frameType = CANFD_MCANFrameType_FD;
    while (1)
    {	
    	j++;
    	txMsgObjectParams.msgIdentifier =0xC5 + j;
    	retVal = Can_Transmit_Schedule(txMsgObjHandle,txMsgObjectParams.msgIdentifier,&txData[0], 64);
    }
    
    
    int32_t Can_Transmit_Schedule(CANFD_MsgObjHandle txMsgObjHandle, uint32_t msg_id, uint8_t *txmsg, uint32_t len)
    {
    
    	uint32_t index = 0;
    	int32_t retVal = 0;
    	int32_t errCode = 0;
    	if(frameType == CANFD_MCANFrameType_FD)
    	{
    		while(len > 64U)
    		{
    			Task_sleep(1);
    			retVal = CANFD_transmitData (txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, 64U, &txmsg[index], &errCode);
    			index = index + 64U;
    			len = len - 64U;
    		}
    		Task_sleep(1);
    		retVal = CANFD_transmitData (txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, len, &txmsg[index], &errCode);
    	}
    	else
    	{
    		while(len > 8U)
    		{
    			retVal = CANFD_transmitData (txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, 8U, &txmsg[index], &errCode);
    			index = index + 8U;
    			len = len - 8U;
    		}
    		retVal = CANFD_transmitData (txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, len, &txmsg[index], &errCode);
    	}
    	if (retVal < 0)
    	{
    		System_printf("Debug: Error transmitting CAN data %x , Errcode %x\n", retVal, errCode);
    	}
    	return retVal;
    
    }
    

    参考链接:

  • 你好,您这个程序和我的调用方式是完全一样的。相当于在while(1)中不断调用CANFD_transmitData函数发送普通帧,我这边会出现严重的数据无法发送的问题。不知是否与配置有关,能否把CAN配置部分代码贴出来给我们参考一下?谢谢!

  • 是否有加延时。Task_sleep(1);
  • 你好,如果加入1ms等待时间,不能满足我们发送频率的要求。我们希望的是发送完成1帧后马上发送另一帧。

  • 你好,
    请到下边这个论坛发帖跟进。
    e2e.ti.com/.../2522016
  • 你好,可参考文档“

    谢谢