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.

[参考译文] TMS320F28384D:来自从控制卡的 CAN FD 响应在主设备中的 CAN FD 总线分析仪和放大器上丢失(不可见)

Guru**** 2413830 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1524001/tms320f28384d-can-fd-responses-from-slave-control-cards-go-missing-not-visible-on-can-fd-bus-analyzer-in-master

器件型号:TMS320F28384D


工具/软件:CCS、CAN FD 分析仪

嗨、

我的项目需要通过 CAN FD 在主站和 9 个从站之间进行通信。 从主器件 (ID:10、0xA) 到所有从器件 (ID 1、2、3... 9) 被广播、作为回报、我将从器件编程为以单帧确认进行响应。

测试时、当 CAN FD 总线上有主器件和 4 个从器件时、为了响应广播的数据、我只观察到最多两个从器件、它们在 CAN FD 总线分析器软件工具上以确认帧进行响应。

我确信其他两个从器件正在接收数据、因为我有一个在接收后运行的计数器、我还观察到响应(从主器件接收数据后从从器件传输到主器件)帧正在进行结构化、但我无法判断其是否实际发送。

单独来看、如果只有 主器件、从器件和 CAN FD 分析仪、则会按照 CAN FD 软件工具上的显示发送确认、但仅当有多个从器件时、我才会遇到此问题。  

主广播数据 ID 配置:

txMsg[0][BROADCAST_CONTROLOLDATA].id =(MCU << 12)|(0 << 8)|(BROADCAST_CONTROLOLDATA << 4)|(1);
txMsg[0][BROADCAST_CONTROLDATA].Rtr = 0u;
txMsg[0][BROADCAST_CONTROLOLDATA].XTD = 1;
txMsg[0][BROADCAST_CONTROLOLDATA].ESI = 0U;
txMsg[0][BROADCAST_CONTROLOLDATA].DLC = 15;
txMsg[0][BROADCAST_CONTROLOLDATA].1U = brs;
txMsg[0][BROADCAST_CONTROLOLDATA].FDF = 1U;
txMsg[0][BROADCAST_CONTROLOLDATA].efc = 1U;
txMsg[0][BROADCAST_CONTROLDATA].mm = 0xAAU;

(主器件和从器件的所有参数都是相同的,但下面指定用于从器件确认的参数除外)

tx Msg_Config_Para_ st.id =(LCU_NODE_id << 12)|(MCU_ID << 8)|(BROADCAST_CONTROLRAATA << 4)|(6);
tx Msg_Config_Para_ st.data[0]= 0x06;
tx Msg_Config_Para_ st.DLC = 4U;

数据比特率为 5Mbps、而仲裁比特率为 500Kbps。 我假设总线太忙,无法容纳 2 个以上的 LCU,这就是为什么总线上 4 个从器件发送的所有 4 个确认信息不总是由主器件读取的原因。 我有另一个计数器声明为主  器件程序中的数组、当主器件收到特定从器件的确认时、该数组的元素递增。

 由于总线上有 4 个从器件、所有这些都编程相同、因此 我获得不同数量的确认。 在 主控制卡中接收确认时也有很多随机性。  


 如果您需要我提供其他数据来解决此问题、请告知我。

此致、  

Nalin P.

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

    尊敬的 Nalin:

    您是否有办法在接收节点(至少其中一个)上进行实时调试、并将其连接到 CCS 以监控帧接收和传输期间是否有任何错误?  也许监测总线关闭的标志(如果错误太多)和错误寄存器标志/计数器? 根据您对接收随机度的描述、可能最好对 CAN 总线进行示波以检查信号质量。  较新的示波器(甚至是 Pico 示波器)能够解码 CAN/CAN-FD 信号、因此它将是检查信号质量的有用工具、尤其是当您在 5Mbps 的最大数据速率转角处运行时。

    我首先检查上的信号质量、但由于涉及多个节点、并且任何节点都可能导致信号衰减。

    此致、

    Joseph  

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

    嗨、Joseph

    对迟来的答复表示歉意   

    您是否有办法在接收节点(至少其中一个)上进行实时调试、并将其连接到 CCS 以监控帧接收和传输期间是否存在任何错误?

    我有 2 个正在调试的接收节点(本地单元/从设备)、而总线上有 4 个接收节点。 我可以 确认 节点正在接收已成功加载到其局部变量中的广播数据、响应(确认帧)也正在按编程方式制造。 我无法确认的是从器件是否使用确认帧进行响应、并且在 MCU 表达式窗口中看不到它(每个从器件响应的数组计数器都会递增)  或者... 从站完全没有响应。


    在这张图中、并非所有从器件都始终在响应。

    可能是监视总线关闭的标志(如果错误太多)和错误寄存器标志/计数器?

    我将再次检查总线是否关闭、总线上有多个从器件。 据我所知、我没有观察到设置了任何错误寄存器标志/计数器。 您能否更具体地说明我应该留意哪些寄存器标志/计数器?

    根据您对接收随机性的描述、也许可以对 CAN 总线进行信号质量检查。

    从器件响应是随机的、但我从未观察到总线上保留的每个从器件都完全响应。 我将在示波器上检查总线、然后返回此处。

    此致、

    Nalin

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

    尊敬的 Nalin:

    检查 MCAN_PSR 寄存器内容、 您可以检查多个不同的字段、以查看 LEC(最后一个错误代码)、BO 对于总线关闭情况、以及其他字段是否存在任何异常、这些字段可能有助于表明问题所在。  是的、最好检查总线波形、因为这样还可以指示总线活动及其状态。

    此致、

    Joseph

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

    您好、Joseph:

    感谢您确认寄存器、我之前验证过它们、没有设置错误。 我已经将 MCAN_CCCR.DAR(禁用自动 Re 传输)从 1 更新为 0、系统正在工作。 根据项目、我需要 9 个节点来响应并确认主单元、他们现在都在响应。

    我也看不到设置了任何错误寄存器、标志或计数器。 感谢您的快速回答。 现在请继续提问、我将在周末期间对系统进行测试、我将确认 First Thing 星期一 Morning Local Time。  

    再次感谢您! 周末愉快!

    此致、

    Nalin

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

    尊敬的 Nalin:

    好的、将等待您的周末结账。  在这种情况下、我仍然不确定禁用自动重新传输有何帮助。  可能这是 CAN 总线繁忙且没有为目标节点提供足够的时间来发出 ACK 帧的症状、发送节点仅继续重新传输该帧。  是否可以为主节点发送到目标留出更多的时间间隔?  默认情况下、每当未从任何节点接收到 ACK 或发送节点由于获得总线控制权的节点 ID 较低而失去了其发送优先级时、CAN/CAN-FD 节点都将保持重复传输帧。  这种自动重新传输功能很少关闭、因为它主要用于仲裁、因此只要总线释放、节点就有机会发送数据。

    此致、

    Joseph  

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

    您好、Joseph:

    我的更改必须不清楚、之前自动重新传输被禁用(之前的 MCAN_CCCR.DAR = 1)、我将其更新为 0(禁用自动重新传输= 0)、以便现在启用重新传输(这里有一个双重否定,这可能是我的团队被混淆的原因)。

    您是否允许主节点发送到目标的时间间隔更长?

    我可以这样做... 自从我上次答复以来、有了更多的发展--我的团队最初的目的是让主节点向所有 9 个本地节点广播其数据、作为回应、他们必须每发送 4 帧数据(4 帧、每帧 64 字节* 9 个本地节点= 36 帧,以响应广播)。

    因为这不起作用... 我们假设由于数据太多、总线无法处理、 我不是每个本地节点发送 4 帧数据、而是将响应更改为 ACK(单帧,8 字节)。 这在我启用自动重新传输后开始工作。

    所以我想在重新传输打开的情况下,我可以得到每 1 个本地节点的 4 帧数据(总共 36 帧),以响应主节点的广播,也可以工作。

      (数据中总线上只有 7 个本地节点和一个主节点)

    它工作正常,直到有 8 个本地节点和总线上的主节点,我观察所有的帧,没有数据丢失,但序列(不重要,只是一个观察)混乱。 观察到来自第 5 个本地节点的第 1 个帧 — 5A31 首先出现在所有其他节点上。 其余帧的第 5 个节点后来进入总线(如 CAN 分析仪.csv 的图片中所示)。

    我对时间的另一个观察是、主节点根据本地节点的数量进行广播。 在程序中、主节点每 10ms 广播一次。 如果总线上有多达 2 个本地节点、主节点按编程程序每 10ms 广播一次(广播功能为 10ms 计时器功能)...但只要我在总线上添加更多本地节点、主节点就会以更长的间隔开始广播:

    3 个本地节点 — 主节点每 20ms 广播一次(即使广播功能在 10ms 计时器中也是如此)
    4 个本地节点 — 每~30ms
    6 个本地节点 — 每~40ms
    8 个本地节点 — 每~50ms

    我想知道为什么会发生这种情况。 也许由于主节点正在等待本地节点完成发送、间隔正在延长? 可能是公交车拥堵了? 我不确定。

    最后我要提的是、当总线上有 9 个本地节点以及主节点时会发生什么情况。  


    我缺少第 9 个本地节点的最后一个帧 (ID:9A34)。 有时、帧恰好出现在主节点广播 (A001) 之后、有时 显示帧在主节点下次广播 (?) 之后到达。 我想知道你对所有这些都有什么想法。

    我尝试将标称比特率从 500Kbps(电流)提高到 1Mbps…… 我观察到总线关闭、警告状态和错误无源寄存器变为 1、因此我假设不是这样。

    我很抱歉的大消息,我理解如果你需要一个更长的时间来完成所有这一切和答复,非常感谢你的答复。

    此致、

    Nalin

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

    尊敬的 Nalin:

    很抱歉回复延迟。  我现在很清楚您是如何实施 DAR 的。  根据您在从本地节点接收确认帧(数据似乎发生随机变化)期间描述的其他症状、您是否使用 Tx 缓冲区将数据传输到主节点? 实际上有一个与此相关的已知错误(勘误):

    权变措施是改用 Tx FIFO。  如果使用 Tx 缓冲区、也许您可以一次性发放。

    此致、

    Joseph

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

    您好、Joseph:

    不是问题、只是为了确认... 当我编程本地节点以生成响应来自主节点的广播的确认时、我能够按 正确的顺序查看所有确认。

    由于这种情况是好的,我毕业编程 每个 本地节点以响应 4 帧 64 字节,即 4 帧* 9 本地节点提供 36 帧... 这就是这个时候的序列开始变得混乱。

    从那时起,我增加了一个 100 微秒的级联延迟(本地节点号* 100 us ),这样第一个节点在广播后以 100 us 的延迟响应,第二个节点在 200 us 之后,而...第九个在 900 us 之后,只是为了确保总线不被篡改,大量的帧同时发送。 这 使得 帧能够按顺序排列而没有太多延迟。

    我仍然丢失第 9 个节点的最后一帧、我假设这是因为下一次广播速度太快、因此我将主控制单元中的广播功能从 10ms 计时器任务移到了 20ms 任务。 现在、由于总线上有 9 个本地节点和主节点、广播每 60ms 进行一次。 您能回答为什么会发生这种情况吗?

    我的标称比特率为 500 Kbps、数据比特率为 5 Mbps、请求和响应仍然非常慢(每 60 毫秒广播一次、计划为 20 毫秒)... 如何使我的流程更快地运行? 是否缺少任何配置?

    您是否使用 Tx 缓冲区将数据传输到主节点?

    我将使用 Tx FIFO。

    此致、

    Nalin

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

    尊敬的 Nalin:

    感谢您提供更多详细信息。  好的、我们消除了 tx 缓冲器错误导致的问题。  如果我可以正确地回忆一下、当设置了“禁用自动重传“时(即无法传输的帧不会被重传)、主节点没有获得大多数确认帧或根本没有从其他节点获得任何响应、但当 DAR=0 时、重复的传输尝试似乎能够从所有节点发送正确的帧。   这可能是 CAN 总线上信号质量问题的症状。  您可能已经在 CAN 总线上有了 120 欧姆端接 、并进行检查以确保它在那里。  这种负载有助于防止可能影响信号质量的信号反射。

    您是否能够对 CAN 总线进行范围检查以检查信号质量?  一个通道用于 CAN_H、另一个通道用于 CAN_L、并执行数学运算(差分函数)来表示 CAN 数据。 Picoscope 示波器或任何具有 CAN-FD 解码功能的示波器将对此提供很大帮助。

     此致、

    Joseph

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

    您好、Joseph:

    我在所有控制卡上的 CAN_H 和 CAN_L 引脚之间有 120 欧姆电阻器、我还检查了总线上的等效电阻、它是 60 欧姆。

    我尝试了在示波器上测量信号、但它本身没有 CAN-FD 解码器、只是说 CAN、我无法太多地确定信号。 我会再试一次。

    我想知道在固件中是否可以做任何事情来加快传输速度、以及我可以研究的任何配置。 感谢您的答复。

    此致、

    Nalin

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

    尊敬的 Nalin:

    检查 CAN 总线波形以查看是否发生任何可能导致奇偶校验错误、形式错误等的信号干扰仍然很有价值  这种情况的一个表现是从 MCAN_ECR 寄存器观察到大量错误、以及在 MCAN_PSR 中报告错误。

    您还可以尝试实现发送器延迟补偿(请参阅 TRM 中的第 45.5.4 节)。  请参阅 TRM 中的说明和实现。

    此致、

    Joseph

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

    您好、Joseph:

    由衷的抱歉、您稍后回复了、我有更新-

    我已经验证了示波器上的波形、即使 Eq、信号上也有明显的干扰/噪声。 电阻确认为 60 欧姆、接线长度非常短(所有节点总计~0.2 米)。

    发送器延迟补偿已启用、但我发现每次都在 MCAN 初始化 (MCAN_InitParams.brsEnable) 中禁用了位速率切换  、但在 Tx 缓冲器元素配置 (MCAN_TxBufElement.MCAN brs) 中启用。 这本质上意味着、即使我的比特率在我的代码中计算为标称值 500Kbps 和数据 5Mbps、但两者的传输仍以 500Kbps 的速率运行。

    我在这两个位置都启用了比特率切换、但随后、1 个主节点和 1 个从节点之间没有传输。 我假设 5Mbps 可能会太快、因此我针对 1Mbps 数据比特率进行计算、然后针对 500Kbps 数据比特率进行计算、但即使在那时也无法观察到任何传输。  

    我还使用示例代码对此进行了检查(具有 CM 中的 mcan_ex2_external_loopback 的 mcan_config_C28x)。 在该示例中、MCAN_TxBufElement.BRS 被禁用、  但启用了 MCAN_InitParams.brsEnable、但对于要使用与其仲裁不同的比特率发送的消息、必须在两个位置都启用 brs(如 SPRUII0F 的“Tx 处理“一节中的表 45-9 所指定)。

    这个问题与 e2e...上的这个问题非常相似。 我会在这里提出一个相关问题、因为该问题没有得到解答。

    此致、

    Nalin

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

    尊敬的 Nalin:

    如果是原因、最好先解决总线噪声问题。  如果总线中有噪声、TDC 可能无法提供帮助。  可能检查 CAN TX/RX 引脚、收发器和物理 CAN 总线本身之间是否存在松动的连接或冷焊点。

    此致、

    Joseph

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

    您好、Joseph:

    我很抱歉迟来的答复。 我检查了物理层中的所有内容... 看起来还可以。

    我调零点到的问题是使用 25MHz MCAN 时钟 (125MHz CM_CLK/5)。 为了得到一个 5 Mbps 比特率,我不得不做的最大采样点的 60 %.. 我随后将时钟更改为 40MHz (120MHz CM_CLK / 3)、我将其采样点配置为 75%以获得 5Mbps。 现在、我观察到从主节点到 总线上另一个本地节点的数据发送和接收效果良好。  

    我仍然需要通过总线上的所有 10 个节点(1 个主节点、9 个本地节点)验证这一点。 如有任何进一步的疑问、我会将其发布在我提出的、您已回答的另一个问题上(此处)。 我们可以关闭该主题。   非常感谢您的意见。

    此致、

    Nalin