主题中讨论的其他器件:LAUNCHXL-F280039C、 TCAN332、 ISO1042
工具/软件:
您好、
我遇到的问题是、在我的控制器和 F280039C 评估板上、我的 CANFD 的数据速率无法高于 3Mbps、在两种设置中、我的控制器和 F280039C 评估板之间的电缆非常短 (< 10cm) 的两个 F280039C 评估板之间的数据速率无法达到 4Mbps。 我使用的是一个 CANFD 示例、我稍微扩展了这个示例、因此可以选择波特率、并在需要时触发一条消息。 所以在 3Mbps 的情况下一切都能正常工作、 但是我的主板在 3Mbps 的情况下已经有问题、两个评估板在 4Mbps 的情况下已经有问题。 在 3Mbps 速率下、我还可以使电缆长度为 1m、在这两种设置中不会出现任何问题。 我自己的电路板使用隔离式 CANFD 兼容收发器 ISO1042QDWVRQ1、因此唯一的区别或多或少是、两块电路板上的固件相同。
关于硬件:
我的定制电路板上的 CANFD 收发器(请注意,我已经删除了 10pF 电容器以进行测试):

请注意、在定制板上、收发器的 TX 和 RX 是 S50 阻抗匹配线路、只有几厘米。 驱动器的输出也只有几厘米、接近 120 欧姆差分和 60 欧姆单端 保证使用良好的设计实践(连续 GND 平面,阻抗匹配等)。
我测量的内容:
我使用示波器测量了评估板上的 TX 线路和另一个评估板/我的定制板上的 RX 线路、对于 1 字节有效载荷消息、结果如下所示(并非使用弹簧探针进行测量):
评估至评估值(工作正常):


评估到自定义(不工作): 

从信号的角度来看、我认为它看起来不错。 最后、看起来没有来自接收节点的 ACK。
关于固件:
我使用 TI 的 MCAN_BitTimingCalculator.xls 来计算不同频率的时序。 两个控制器都使用一个外部 10ppm 容差 20MHz 晶体并在 120MHz 下运行。
寄存器:

CANFD 时序:
#ifdef USE_500KBAUDPS
//DIV3 -->500kBit (1Mbit/s data rate) --> Look at the timing calculator, put in 120Mhz, DIV3 etc. then look at Drierlib / Syscfg Inputs below in the .xlsx --> should output the values below!!!
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 9U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 8U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 8U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 9U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 8U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif
#ifdef USE_1MBAUDPS
//DIV1 --> 1MBaudps --> 2Mbit/s data rate
bitTimes.nomRatePrescalar = 4U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 11U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 10U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 10U; // Nominal SJW
bitTimes.dataRatePrescalar = 2U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 9U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 8U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 8U; // Data SJW
#endif
#ifdef USE_1_5MBAUDPS
//DIV1 --> 1.5MBaudps --> 3Mbit/s data rate
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 10U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 7U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 7U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 10U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 7U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 7U; // Data SJW
#endif
#ifdef USE_2MBAUDPS
//DIV1 --> 2MBaudps --> 4Mbit/s data rate
bitTimes.nomRatePrescalar = 2U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 9U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 8U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 8U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 6U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 6U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 5U; // Data SJW
#endif
#ifdef USE_3MBAUDPS
//DIV1 --> 3MBaudps --> 3Mbit/s data rate
bitTimes.nomRatePrescalar = 3U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 5U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 2U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 2U; // Nominal SJW
bitTimes.dataRatePrescalar = 3U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 5U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 2U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif
#ifdef USE_4MBAUDPS //Needs 2 termination resistors
//DIV1 --> 4MBaudps --> 4Mbit/s data rate
bitTimes.nomRatePrescalar = 1U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 7U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 5U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 5U; // Nominal SJW
bitTimes.dataRatePrescalar = 1U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 7U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 5U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 5U; // Data SJW
#endif
#ifdef USE_5MBAUDPS //Needs 2 termination resistors
//DIV1 --> 5MBaudps --> 5Mbit/s data rate
bitTimes.nomRatePrescalar = 0U; // Nominal Baud Rate Pre-scaler
bitTimes.nomTimeSeg1 = 3U; // Nominal Time segment before SP
bitTimes.nomTimeSeg2 = 2U; // Nominal Time segment after SP
bitTimes.nomSynchJumpWidth = 2U; // Nominal SJW
bitTimes.dataRatePrescalar = 0U; // Data Baud Rate Pre-scaler
bitTimes.dataTimeSeg1 = 3U; // Data Time segment before SP
bitTimes.dataTimeSeg2 = 2U; // Data Time segment after SP
bitTimes.dataSynchJumpWidth = 2U; // Data SJW
#endif
有什么想法、什么原因会导致这种情况发生? 最后、评估板还应该能够以 5Mbps 的速率运行、但他们不能。 所以我仍然认为这是固件问题、而不是硬件问题(ISO1042QDWVRQ1 有更多延迟,因此这可能是区别) 。 当我尝试从我的主板发送>3Mbps 或从 EVAL 主板发送>4Mbps 时、我不会得到一个 CAN 帧、只是在几个 100ns 后再向下和向上发送。














