配置20MHz 时钟、500K 仲裁速率...
将 NBTP 设置为0x06010E03将允许报文 ID 0x0B3发送3至8个字节。 消息 ID 0x7DC 将不会。 此设置中存在一些计时问题。
您能推荐更正确的 NBTP 吗?
我们还需要为2MHz 配置 DBTP。
谢谢、
Steve
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.
您好 Steve、
如果我对 NBTP 寄存器值进行正确解码、您将具有以下设置:
NTSEG2 = 0x03 (或4个时间份额)
NTSEG1 = 0x0E (或15个时间份额)
NBRP = 0x01 (2的预分频器)
如果您使用的是20Mhz 时钟、 预分频器为2、位速率为1Mbps 时、您将有10个时间份额可用、并且由于您的时间段使用20个时间份额、因此您可以针对500kbps 的位周期和80%的采样点进行适当配置。 我可能建议不要使用2的预分频器、并且有更多的时间份额可用于调优采样点。
我将详细介绍并构建我的建议值以进行尝试。 《软件用户指南 》的第3.1节也讨论了这一点、如果您尚未阅读、这是一个很好的资源。
在没有使用预分频器的情况下、1Mbps 比特率将需要20个时间份额(tq)。 如果使用2的预分频器、则1Mbps 仅使用10tq。 然后、通过定义用于各个段的 tq 数量来创建实际比特率。 使用更多 tq 将产生更低的比特率、使用更少的 tq 将产生更快的比特率。
位周期是通过定义三个段的时间份额数并取和来创建的。 始终为1tq 的同步段、后跟 NTSEG1或采样点之前的标称时间段)、最后是采样点之后的 NTSEG2或标称时间段。
将 NTSEG1 + NTSEG2 + 1 tq (用于 SYNC)相加= 20 tq。 如果您需要500kbps 的仲裁比特率、这将是正确的配置。 我还想指出的是、NSJW 通常设置为等于 NTSEG2、这是针对您的配置正确设置的。
如果您需要500kbps 的仲裁速率而不使用预分频器、则需要根据总计40tq 来定义分段、因为当使用预分频器0 (被解释为1)时、500kbps 是1Mbps 速率的一半。
我建议使用以下段值、在80%位周期的采样点尝试500kbps。
NTSEG2 = 7 (解释为8、始终比原始值少一个、因为 TCAN4550将增加1)= 0x07
NTSEG1 = 30 (解释为31、始终比原始值少一个、因为 TCAN4550将增加1)= 0x1E
NBRP = 0 (解释为1、始终比原始值少一个、因为 TCAN4550会增加1)= 0x00
NSJW = 7 (被解释为8,然后记得移动一位,将 NBRP 的位8添加到此字节的开头)= 0x0E
这将为500kbps 比特率创建0x0E001E07的最终 NBTP 寄存器值。
数据位速率配置的过程相同、但 DBTP 寄存器位的配置与 NBTP 稍有不同。 对于2Mbps、我建议使用采样点为位周期80%的以下 DBTP 设置。 对于20Mhz 时钟和1的预分频器、每位将有10tq。
DTSEG2 = 1 (解释为2、始终比原始值少一个、因为 TCAN4550会增加1)= 0x01
DTSEG1 = 6 (解释为7、始终比原始值少一个、因为 TCAN4550将增加1)= 0x06
DBRP = 0 (解释为1、始终比原始值少一个、因为 TCAN4550将增加1)= 0x00
DSJW = 1 (被解释为2、总是比原始值少一个、因为 TCAN4550将增加1)= 0x01
TDC = 1 (启用发送器延迟补偿)
这将为2Mbps 比特率创建一个0x00800611的最终 DBTP 寄存器值。
您还需要设置 TDCO (发送器延迟补偿偏移)寄存器、以匹配 DTSEG1值的"解释"值。 TDCO 不会将该值解释为比设定值大1、因此 TDCO = DTSEG1+1。 这意味着您需要将 TDCO 设置为7 =0x07。
这将为一个0x00800611的 DBTP 寄存器值创建一个0x00000700的最终 TDCR 寄存器(0x1048)。
我认为这些设置应该起作用、但我也希望我为您提供足够的信息、以便您能够根据不同的比特率进行调整。 没有一个答案、您可以调整采样点和时间份额以优化网络性能。 但是、如果遇到仲裁问题、可以尝试将仲裁位上的采样点移至更靠近中心点的位置。 现在设置为80%、您可以尝试将其移动到70%到75%之间
我还建议您尝试 NBTP 值0x14001B0A (1 + 28 + 11 = 40 tq)、采样点为72.5%。
如果您发现数据位采样有问题、您还可以尝试将数据位采样点降低到大约70%。 您可以尝试:
DBTP = 0x00800522
TDCR = 0x00000600
此致、
Jonathan
你好、Jonathon、
感谢您撰写有用的帖子。
我确实捕获了位时间计算中的误差。 我当前正在运行 NBTP = 0x0E001E07
要获得2MHz FD 速率、我发现 DBTP = 0x00810111 (5 QuantaTM)
我按照建议设置 TDCR = 0x00000200。
我已经用120欧姆终止了网络。
使用经典 CAN、我的峰值监听器读取的数据是稳定的-没有错误。 使用 CAN FD 时、我会遇到间歇性的东西和其他时序错误。
在我的应用中、我们将同时使用传统 CAN 和 CAN FD。 这不会同时发生。 我们将测试我们的器件并确定其模式。
应用相当简单、我们将不会使用该器件的大部分功能。 它令人印象深刻、内容全面。
再次感谢您的帮助。 如果您有任何想法、我想听听他们的意见。
此致、
Steve
您好、Steve、
我很高兴听到您有经典的 CAN 数据正常工作。
为了实现更快的 CANFD 位速率、总线布线拓扑和网络会在位转换后产生一些电感振铃、该位转换需要在采样位之前衰减。 因此、我们通常会在位周期中看到一个大约80%的采样点。 您可以尝试将 tq 从 DTSEG2移到 DTSEG1值、以延迟此采样点。 如果您需要更精细的分辨率、则可以移除预分频器并为自己提供更多 tq 来处理。
您提到您的端接电阻为120欧姆。 这是仅在一个位置端接、还是在总线的另一端接120欧姆? 总线通常在总线的两端与120欧姆电阻端接、或在"星形"拓扑的中心端接60欧姆电阻。 如果您只有一个120欧姆端接、则可以使该端接电阻为60欧姆、或者在总线上添加另一个120欧姆并联、以便为收发器设计用于驱动的负载提供适当的负载。
您是否使用了示波器来观察 CAN 波形? 观察任何明显的振铃有助于确定采样点需要调整的距离或指向可能存在的其他物理层问题。
此致、
Jonathan
你好、Jonathon、
我们在每一端都有终端、信号路径非常短(5cm)、振铃非常小。 我们将清理测试台、看看它是否有所改进。
现在、我已转到接收包含我们已建立的设置的消息。
我将具有专用的 RX 缓冲器(仅1个)和单个标准滤波器。 FIFO 已禁用。
我看到的是、无论与消息匹配的筛选器如何、都会收到一条消息。 当我查看 RX 缓冲器时,它全是0…… 无 ID、FDF、BRS 或缓冲区偏移。
NDAT1位0被置位以指示有什么到达。
下面是我的设置:
//在受限设置中....
// SID 过滤器
tcm_wors[0].cmd32 = 0x00010000; //位于0x8000 1过滤器
AHB_Write_32 (REG_MCAN_SIDFC);
// XID 过滤器
tcm_wors[0].cmd32 = 0x00010008; //位于0x8008
AHB_Write_32 (REG_MCAN_XIDFC);
// FIFO 0
tcm_wors[0].cmd32 = 0x00000000; //无 FIFO 0
AHB_Write_32 (REG_MCAN_RXF0C);
// FIFO 1.
tcm_wors[0].cmd32 = 0x00000000; //无 FIFO 1.
AHB_Write_32 (REG_MCAN_RXF1C);
// RX 缓冲器控制
TCAM_wors[0].cmd32 = 0x00000100; // RX 缓冲器为8100
AHB_Write_32 (REG_MCAN_RXBC);
// 元素大小控制
tcm_wors[0].cmd32 = 0x00000000; // 8字节数据块
AHB_Write_32 (REG_MCAN_RXESC);
//设置结束
//过滤器:
tcm_wors[0].cmd32 = 0xBEDD0000; //筛选器0x6DD 回复、 SFEC 111
AHB_Write_32 (0x8000);
tcm_wors[0].cmd32 = 0x00000000; //清除 RX 缓冲区状态位
AHB_Write_32 (REG_MCAN_NDAT1);
AHB_Write_32 (REG_MCAN_NDAT2);
//测试数据
AHB_READ_32 (REG_MCAN_NDAT1、2); //读取两个接收状态寄存器
//读取数据
AHB_READ_32 (0x8100、4);
这看起来很简单。
我必须设置1位或参数错误。
如果您看到什么、请告诉我。
再次感谢!
周末愉快!
Steve