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.

[参考译文] CCS/TM4C1294NCPDT:SN65HV CAN 总线瞬变的 CAN 总线通信问题

Guru**** 2478765 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/679804/ccs-tm4c1294ncpdt-can-bus-communication-issue-with-sn65hv-can-bus-transiever

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

尊敬的所有人:

我们拥有具有 TM4C1294NCPDT MCU 和 SN65HV CAN 总线转换器的定制开发板。 当 CAN 总线通信首次启动时、CAN 消息似乎持续发送 CAN 消息、有时每500us/1.5ms 发送一次。  这样做的原因可能是什么?  节点在此处确认数据、 因此不是坏节点问题。

可以看到 CTL_STS 的 TXOK 位始终为高电平、并且消息由第二个节点(PFA 映像)确认。 即使能够在第二个节点中获取正确的数据也是如此。

PF 低于 CAN 初始代码:

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 CAN1 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPINTypeCAN (GPIO_P1_ORTb);GPIOP1_PIN_0

CANInit (CAN1_base);
CANBitRateSet (CAN1_base、sysClock、100000);
// CANIntRegister (CAN1_base、 CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);

TxMessage.ui32MsgID = 1;
TxMessage.ui32MsgIDMask = 0;
TxMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
TxMessage.ui32MsgLen = 8;
TxMessage.pui8MsgData = TData_PTR; 

可以发送数据 :

对于(j=(4*seq);j<(4*(seq+1));j++)
{
TData_PTR[j]=CAN_NODE_DATA.D[节点][j];

}
IntMasterDisable ();
CANMessageSet (CAN1_base、1、&TxMessage、 MSG_OBJ_TYPE_TX);//作为 msg 对象发送1
delay_ms (10);
IntMasterEnable(); 

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

    [报价用户="Akhil joy"] CAN 报文正在持续发送 CAN 报文[/报价]

    后跟 "CanSendData"

    [引用 user="Akhil joy"] for (j=(4*seq); j<(4*(seq+1)); j++)

    这样一个"复杂表达式"可能会先"邀请"、然后"原因和继续"、 您 的(不需要的)连续可以发送?

    您已经注意到并报告过这样 的"持续发送"、 因此您的" for Loop "不会   在您的"可疑名单"中出现很大的上升 、 甚至  (部分) 审查也值得增加?

    您提供的代码-任何地方(我可以找到)都不提供"j"或"seq"的初始化    如果(j、seq)-从零开始-和单调增加-我不相信 您的代码 能够"逃逸" 该循环-因此"连续发送"-全部记录 为"预期!"

    尝试新代码时、始终明智地遵循"kiss"并采用 极其清晰、基本(可能)的"硬编码" 测试值...

    您可以(两者)通过快速/轻松 的"替换 该"可疑的回路"来测试和确认我的发现、并对 您的进行"一次且仅一次"调用 (增强的" 适用于无回路")、 "可以发送数据()"  函数...

    现在的情况是,不存在这样的可能性,即你的"所需的 CAN 编码分析"是否 被"扣为人质",是由"失败的编码机制" 进行的,与 CAN 毫无关系?

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

    您好!

    SN65HV 是否设置为待机模式? STANDBY (引脚8)将10k +连接到 GPIO 端口控制? 这使得 HD65等待在总线上侦听 RXD 数据、然后再发送任何 TXD 输出。

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

    您好、CB1_MOBILE (1830783) 感谢您的建议、 此处所附的代码是 CAN 消息发送的应用代码的一部分。

    J 和 SEQ 已正确初始化、永远不会进入循环。  这根据您的建议进行了验证(对于循环、将被删除并进行测试、但没有成功)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 这一个在第8个引脚上具有斜率控制,并通过10K +电阻器连接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一个观察结果是、当我注释掉 TX int Enable flasgs 时、一切都按预期工作。

    // TxMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;

    不管怎么说,会发生什么问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    GPIO 引脚8是否设置为高电平、SN65是否处于待机模式? 请记住、数据表中的引脚8为高电平(Stdby 模式)会使 TXD 引脚免受 RXD 总线噪声的影响、从而导致错误的 TDX 事件。 在发送数据之前、看似 TXD 功能也必须将引脚8设置为低电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意-您的、"按预期工作"提供的"清晰描述"很少、证明没有说服力。
    这些"期望"是什么-减去该陈述-帮助者必须"猜测"-这不是一个(声音)诊断过程。

    抱歉-我从您的语句中"无法解析"(精益理解)、"j 和 Seq 已正确初始化、永远不会进入循环。"    "从不走-在环路中"-真正意味着什么?   和-这些"初始化值是什么?"

    是否最好证明您 "记下"j 和 Seq"的初始值、然后 记录"对其进度进行制图-而不是在该 for Loop 中记录"强制"?"   (当我们执行此操作时-两个都"从"0"开始-无法转义循环!)   此外-您必须在此处告知这些人-"如果和如何"-"j 或 SEQ"-可能会被修改-其他地方!   (确实- details...details)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请注意:“(循环已被删除并测试,但未成功)”

    按预期工作,即 CAN 总线不会收发连续消息,而是仅在调用 SEND 函数时发送。

    它与 TX INT 标志相关,当我启用此标志时,消息将持续发送。 "TX obj INT"日志在控制台中持续打印。

    CAN INT 处理程序:

    uint32_t status = CANIntStatus (CAN1_base/* cport.canBase*/、CAN_INT_STS_Cause);
    if (status =CAN_INT_INTID_STATUS)


    状态= CANStatusGet (CAN1_base、CAN_STS_CONTROL);//读回错误位,对它们执行什么操作?

    错误标志= 1;

    否则、如果(status = 1)

    CANIntClear (CAN1_base、1);
    错误标志= 0;
    MsgObjSent = 1;
    控制台("TX OBJ INT")
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引脚8通过10K 下拉至 GND,现在尝试直接拉至 GND 而不成功,我将点击通道,查看通道中是否有任何噪声
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否解决了此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否,我们仍在努力确定问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑问题出在您的 CAN 中断服务例程中。 您是否介意显示该代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有听到你的反馈。 问题是否已解决?