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.

[参考译文] TM4C1294NCPDT:CAN 通信问题

Guru**** 2609895 points
Other Parts Discussed in Thread: TM4C1294NCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1216110/tm4c1294ncpdt-can-communication-issue

器件型号:TM4C1294NCPDT

尊敬的先生:

我们使用 TM4C1294NCPDT 微控制器和 CAN1通信、我们使用两个 PCB 与 CAN 通信。 我们随机收到 CAN 通信故障错误。 我们无法运行、请告诉我是否为 CAN 配置添加了任何初始化。

这用于第1个 PCB CAN1初始化(发送)

SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、SysClkFreq、500000);
CANIntEnable (CAN1_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);

CAN1MsgRx.ui32MsgID = CAN1RXID;
CAN1MsgRx.ui32MsgIDMask = 0;
CAN1MsgRx.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
CAN1MsgRx.ui32MsgLen = sizeof (g_ui8CAN1RxData);
CANMessageSet (CAN1_base、CAN1RXOBJECT、&g_CAN1MsgRx、MSG_OBJ_TYPE_RX);

这用于第二个 PCB CAN1初始化(接收)

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);

SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
//CANRetrySet (CAN1_base、false);
CANBitRateSet (CAN1_base、g_ui32SysClkFreq、500000);
//CANIntRegister (CAN1_base、CAN1IntHandler);
CANIntEnable (CAN1_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);


CAN1MsgRx.ui32MsgID = CAN1RXID;
CAN1MsgRx.ui32MsgIDMask = 0;
CAN1MsgRx.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
CAN1MsgRx.ui32MsgLen = sizeof (g_ui8CAN1RxData);
CANMessageSet (CAN1_base、CAN1RXOBJECT、&g_CAN1MsgRx、MSG_OBJ_TYPE_RX);

如果您需要任何信息、请告诉我。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我有点困惑。 如果要为 PCB1进行传输、那么为什么要为 RX 设置消息对象?

    这用于第1个 PCB CAN1初始化(发送)

    SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
    CANInit (CAN1_base);
    CANBitRateSet (CAN1_base、SysClkFreq、500000);
    CANIntEnable (CAN1_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
    IntEnable (INT_CAN1);
    CANEnable (CAN1_base);

    CAN1MsgRx.ui32MsgID = CAN1RXID;
    CAN1MsgRx.ui32MsgIDMask = 0;
    CAN1MsgRx.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    CAN1MsgRx.ui32MsgLen = sizeof (g_ui8CAN1RxData);
    CANMessageSet (CAN1_base、CAN1RXOBJECT、&g_CAN1MsgRx、MSG_OBJ_TYPE_RX);

    请参考文件夹 C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\can 中的 CAN 示例。 提供了 TX 和 RX 示例。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好。

    感谢您的回复。实际上、概念是 PCB_1向 PCB_2发出请求(发送)。 和 PCB_2向 PCB_1发送回复(正在接收)。这两个 PCB 都在发送和接收。PCB_1也在从 PCB_2接收数据。 因此我们使用了 Rx 中断。 一旦我们调试代码,CAN_ERR 显示1.I 在下面的屏幕截图中提到,以供参考。

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    实际上这个概念是 PCB_1在请求 PCB_2 (正在发送)。 和 PCB_2向 PCB_1发送回复(正在接收)。这两个 PCB 都在发送和接收。PCB_1也在从 PCB_2接收数据。[/引号]

     根据您的描述、似乎您想要生成一个远程帧。 如果出现这种情况、您 需要使用如下内容来启动远程帧。
    CANMessageSet (CAN0_BASE、1、&sMsgObjectRx、MSG_OBJ_TYPE_TX_REMOTE);

     另请参阅下面的帖子、它通过代码片段帮助您进行处理。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/643158/ek-tm4c123gxl-read-a-remote-frame-via-can-bus?tisearch=e2e-sitesearch&keymatch=MSG_OBJ_TYPE_TX_REMOTE#

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的宝贵答复。

    PCB_1发送和接收来自 PCB_2的数据。PCB_2从 PCB_1发送和接收数据。我假设、错误来自两种情况。

    情形1:PCB_1未向 PCB_2发送数据。

    情形2:PCB_2未从 PCB_1接收到数据。

    调试后、如果发生 CAN 通信故障、 CAN_ERR_EWARN=1且 CAN_EPASS=1。(请参阅上面的屏幕截图)

    因此、我决定更改我的代码、比如、

    CANRetrySet (CAN1_base、true);

    我在 PCB_1和 PCB_2中在上面添加(启用)这个外设。

    请指导我是否针对 CAN 通信故障采取了正确措施?

    现在我来谈谈你的观点:

    我改变了  CANMessageSet (CAN0_BASE、1、&sMsgObjectRx、MSG_OBJ_TYPE_TX_REMOTE); 它将解决 CAN 错误故障?

    我要将这个外设添加到 PCB_1或 PCB_2中。 否则、我将添加所有发送或接收区域?

    我将尝试该方法、并告知您。

    请引导我解决这个 CAN 故障。如果您需要任何信息,请告诉我。

    提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我不知道是什么导致接收错误计数器增加。 检测到一些错误。 但是、LEC 位字段显示为0、这没有错误。 您需要首先回答这样一个问题:远程帧是否适合您的应用。 通常、在 CAN 协议中、如果一个节点(PCB_1)希望从另一个节点(PCB_2)请求数据、则需要发送 remote_frame、而不是数据帧。 基本上、  发送器会广播一个远程帧来从特定节点请求数据。 按照您以前的方法、 两个节点都设置了 消息对象上的 MSG_OBJ_TYPE_RX。  没有人在总线上发送任何消息。 这是我在您的代码片段中看到的、除非您拥有传输数据但未在上传中显示的其他代码。  

    请使用逻辑分析仪或示波器捕获来查看总线上的流量。 该链接将提供更多调试信息。