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.

[参考译文] TCAN4551-Q1:SPI 速度

Guru**** 2678415 points

Other Parts Discussed in Thread: TCAN4550, TCAN4551-Q1

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1579156/tcan4551-q1-spi-speed

器件型号: TCAN4551-Q1
主题中讨论的其他器件: TCAN4550

尊敬的专家:

客户将遇到“写入:无缓冲区空间可用“错误、此时 Linux 和 PC 每 100ms 通过 TCAN4551 交换一次消息。 以下是客户 X5M Linux 平台 DTS 配置。 SPI 速度为 18MHz。 有什么问题吗?

11.jpg

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

    您好 Kevin、

    支持的最大 SPI 频率为 18MHz。  OSC 晶体/时钟频率应至少比 2MHz 时钟频率快、因此 OSC 晶体/时钟频率需要为 20MHz 或更高。

    只要 OSC 时钟至少为 20MHz 并且处理器可以通过 18MHz 保持良好的信号完整性、那么应该不会出现问题。

    此致、

    Jonathan

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

    尊敬的 Nerger:

    客户使用的是 X5M 平台、Linux 内核版本是 6.1.83。 我们的 TCAN4X5X 驱动程序是否需要更新? 客户当前的 OSC 为 40MHz、SPI 为 16.6MHz。 它们需要至少 1Mbps 的数据速率。 导致此问题的任何其他原因吗? 谢谢。

    十分之一

    原理图

    两种方法

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

    尊敬的 Kevin:

    如的软件优化提示(第 5 节)所述 TCAN45xx 软件用户指南 (链接)时、影响 CAN 吞吐量的最常见问题是 SPI 吞吐量。  有大量数据需要通过 SPI 总线传输、因此通过 SPI 传输所有数据所需的总时间成为在不占用缓冲区空间和消息丢失的情况下接收 CAN 消息速度的决定因素。

    减少 SPI 读取之间的空闲时间、拥有一个高效的 SPI 驱动器、其中不包含事务中有很多空闲时间、例如芯片选择转换与数据传输开始和结束之间的延迟、或在可能的情况下使用多字数据写入和读取、而不是多次单字写入和读取等、将有助于优化总体消息吞吐量。

    我建议将逻辑分析仪连接到 SPI 线路并捕获 SPI 流量、以确定处理器完全处理和确认收到的 CAN 消息所需的总时间。

    SPI 接口既是 TCAN4550 的优缺点。  其优势在于、它可用于向任何具有 SPI 外设但不具有 CAN FD 外设的处理器添加一个 CAN FD 接口。  缺点是 SPI 接口是处理器的接口速度较慢、并且效率不如使用处理器内部的 CAN FD 控制器外设那么高。

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    上述问题已经解决。 感谢您的支持。 但下面还有一个问题:

    每秒约 1300 个经典帧、每秒 29 位标识符(17%总线负载)。

    问题出现几次/秒、例如:
    [898.598808] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [899.288902] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [899.600075] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [899.610051] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [899.620749] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [899.792517] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [901.794157] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [901.993276] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [903.192733] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [904.294165] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [904.797175] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [907.747316] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [907.802550] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [908.298828] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [908.802312] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [909.749122] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [909.803416] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    有什么理由吗? 谢谢。

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

    尊敬的 Kevin:

    我相信这也是同样的问题。  处理器分配了特定数量的 RX 缓冲器元素以用于 RX FIFO 0。  在接收 CAN 消息时、它们会存储到 RX FIFO 中、从第一个元素开始、然后存储到第二个元素以此类推、直到使用最后一个元素为止。  这由 RX FIFO 0 状态寄存器中的 Put 索引指示。

    同时、处理器应从最低数量的元素开始读取 RX 缓冲器元素、这由 RX FIFO 0 状态寄存器中的 Get 索引指示。  应始终按照接收的顺序读取消息。 读取一条或多条消息后、处理器必须将 读取的最后一个缓冲器元素的缓冲器索引号写入 RX FIFO 0 确认寄存器、以指示 RX FIFO 0 中哪些缓冲器元素 可用于新消息。

    可以一次读取和确认一条 Rx 消息、也可以读取多条消息然后确认、或同时清除多条消息。  只需了解消息缓冲区将一直被占用、直到通过写入 RX FIFO 0 确认寄存器进行确认。

    因此、当器件在填充 FIFO 中的最后一个 RX 缓冲区元素后接收到新消息时、它将循环回到第一个消息缓冲区元素。  如果已确认或清除此元素、则会将新消息存储到该元素中并重复此循环。  

    但是、如果接收到一条新消息并且所有 RX FIFO 元素仍被占用、则一条消息将丢失。  RX FIFO 0 配置寄存器中有两种工作模式可供选择、即阻塞模式或覆盖模式。  

    如果已配置阻塞模式、则会阻止新的 RX 消息存储在 FIFO 中、并使其丢失。  保留最早的消息。

    如果配置了覆盖模式、则 RX 缓冲区元素将被新消息覆盖、最早的未读消息将丢失。  默认情况下会配置阻塞模式。

    因此、我们对话的关键点还是在于处理器需要能够比接收 CAN 消息的速度更快地通过 SPI 接口读取和确认 RX 消息、从而避免 RX FIFO 变满而导致消息丢失。

    此致、

    Jonathan

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

    嗨、Jonathan

    为了实现最快的通信、请告知我们 MRAM 配置。

    另外、请告知我们如何启用突发模式/批量读取。

    此致、

    Roy

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

    尊敬的 Roy:

    TCAN45xx 软件用户指南 (链接)提供了有关如何配置 MRAM 和优化 SPI 通信的示例。

    在 SPI 驱动器级别进行的突发模式/批量读取会更改 SPI 消息标头的 Length 字段、以指示在芯片选择信号被拉高之前将传输多少个数据字。   

    数据表中的 SPI 写入和读取图已经显示了一个 2 字写入、其中 Length 字段设置为 2。  如果您注意到总共传输了 8 个数据字节、相当于 2 个数据字。  每个字等于 4 个字节或 32 位。

    然后、Address 字段是要传输的第一个数据字的“起始地址“。  使用中的一个例子是读取从 MRAM 缓冲区元素接收到的 CAN 消息的全部内容。  您只需提供 RX 缓冲区元素的起始地址以及缓冲区保存的总数据字数。  只要 MCU 为整个事务提供正确数量的 SPI 时钟周期并将片选线路保持为低电平、就无需执行多次 SPI 读取来接收该消息。

    同样、您可以将 CAN 消息的全部内容写入单个 SPI 写入事务中的 TX 缓冲器元素。   

    此致、

    Jonathan

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

    我们使用的是 M_CAN tcan4x5x 随附的驱动程序 Linux 内核 6.1.83 、其中 默认情况下已经使用突发模式 。  我们还能做什么? 您能给我们提供一个 即用型内核驱动程序补丁 直接?

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

    您好、Roy、

    在此论坛中、器件级别支持 TCAN4550、我无法提供任何 Linux 更新或补丁。  该驱动程序已由具备 Linux 专业知识的软件开发人员尽可能地进行了更新和优化。   

    除了当前驱动器中已包含的增强功能之外、TCAN4550 没有特定于这些增强功能。  我建议寻找 SPI 驱动程序的改进、以及处理器运行时执行中的任何延迟或低效率问题。  

    -使用处理器和 TCAN4550 可以支持的最快 SPI 比特率,( 18MHz 是 TCAN4550 的最大保证比特率)

    -减少 SPI 消息帧内可在处理器的 SPI 驱动程序中调整的空闲时间。

    -优化运行时执行以及检测到 CAN 消息和响应消息之间所需的时间。   

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    以下是我们的客户遇到的问题:

    “------------------------------------------------------------------------------------------------------------ “
    我有一台运行 Linux 的 PC、其中 Kvaser CAN-dongle 连接到机器人板。

    在 PC 上、我执行以下操作:

    IP 链路设置 CAN0 已关闭
    IP 链路集 CAN0 类型 CAN 比特率 1000000
    IP 链路设置 CAN0
    cangen CAN0 -e -c 5 -g 1 &
    总线加载 CAN0@1000000

    在机器人板上:

    IP 链路设置 CAN0 已关闭
    IP 链路设置 CAN0 UP 类型 CAN 比特率 1000000 采样点 0.75 dbitrate 2000000 dsample-point 0.733 FD 打开
    CANdump CAN0

    从总线负载上我看到总线负载~54%。
    机器人板上的 dmesg 显示“tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失“
    “-------------------------------------------------------------------------------------------------------------- “

    我们确认 SPI 读取和写入操作使用的是突发模式、DTS 配置如下:
    &SPI2{
    状态=“正常“;
    pinctrl-names =“default";“;
    pinctrl-0 =<&pinctrl_SPI2>;
    num-cs =<1>;
    dma-names =“tx",“,"rx"、"rx";“;</s>“
    DMA =<&axi_DMAC 25>、<&axi_DMAC 24>;

    tcan4x5x:tcan4x5x@0{
    兼容=“ti、tcan4x5x“;
    reg =<0>;
    #address-cells =<1>;
    #size-cells =<1>;
    SPI-max-frequency =<18000000>;
    Bosch、MRAM-cfg =<0x0 0 0 10 0 10 10>;
    Interrupt-parent =<&aon_gpio_porta>;
    中断=<4 IRQ_TYPE_EDGE_FALLING>;
    };

    };

    “MRAM-cfg"配置“配置是否合理、是否可以针对高带宽要求进一步优化?

    此致、

    Roy

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

    尊敬的 Roy:

    Bosch、MRAM-cfg =<0x0 0 0 10 0 10 10>;

    您正在分配以下内容:

    SID 过滤器元素= 0

    XID 过滤器元素= 0

    Rx FIFO 0 元素= 10

    Rx FIFO 1 元素= 0

    Rx 缓冲区元素= 0

    Tx 事件 FIFO 元素= 10

    Tx FIFO 缓冲器元素= 10

    我不确定您的系统应用要求、但这里提供了一些基本建议供您思考。

    无论 MRAM 配置如何、总体 SPI 传输速率都是最大 CAN 消息吞吐量的主要限制。

    如果 CAN 消息以突发方式出现、增加 RX FIFO 0 中的元素数量可能有助于增加一些裕量。  但是、如果以一致的速率接收消息、并且快于 SPI 传输时间、这将不会有太大帮助。  只需更长的时间即可填充 FIFO、但最终仍会溢出。

    未配置 SID 或 XID 过滤器元素、因此每个 CAN 消息都将存储到 RX FIFO 中。  如果总线上有您不关心的 CAN 消息、并且您只关心接收特定的 CAN 消息、则应设置适当的过滤器元素、以便不需要的 CAN 消息不存储到 RX FIFO 中。  这将确保只有您关心的 CAN 消息必须通过 SPI 提供服务、而不需要的 CAN 消息不会占用不必要的带宽。

    我看到有 10 个 TX 事件 FIFO 元素。  如果您未使用或需要跟踪每个 TX 事件、则可以考虑不使用 TX 事件 FIFO。  该 FIFO 需要额外的 SPI 读写事务来监控、确认和清除 TX 事件元素。  减少任何不必要的 SPI 事务将为处理器提供更多时间来处理实际的 CAN 消息。

    如果 TX 消息的数据或值没有变化、则可以考虑使用专用的 TX 缓冲区、这样可以避免在每次要传输消息时将相同的消息数据写入 TX 缓冲区。  发送消息后、TX 缓冲区元素不会被清除、因此每次想要发送消息时、只需为该缓冲区元素设置 TX 缓冲区添加请求位、即可重复发送相同的消息。  这可能是一种减少 SPI 数据量的方法。

    我无法确定您使用的是 TX FIFO、队列还是专用 TX 缓冲区、但您可以混合使用 TX FIFO/队列和专用 TX 缓冲区元素。  请参阅 M_CAN 用户手册 有关更多信息(链接)

    此致、

    Jonathan

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

    我们想说明一下数量 Rx FIFO 0 元素 保持最小。
    如何配置它、以及什么是 最大值 布局示例 Rx FIFO 0 元素

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

    我在这个地址看到了同样的问题: https://e2e.ti.com/support/interface-group/interface/f/interface-forum/935107/tcan4550-msg-lost-in-rxf0?utm_source=chatgpt.com ; 他使用了什么解决方案?   

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

    尊敬的 Roy:

    我们想制作个数 Rx FIFO 0 元素 保持最小。
    如何配置它、以及什么是 最大值 布局示例 Rx FIFO 0 元素 ?

    我建议查看 TCAN45xx 软件用户指南 (链接)、其中讨论了元素的 MRAM 分配。

    TCAN4551 只有 2KB 的总 MRAM 空间、可用于所有不同的元素类型。  还需要配置为每个 RX 和 TX 消息缓冲区分配的数据量。  如果不需要支持最大 64 字节数据有效载荷、则可以有更多的 RX 消息缓冲区。  但是、这是特定于应用的、因此您需要设置缓冲区数据大小、以满足您需要支持的最大消息大小。

    我会注意到 MRAM 配置完全可以针对您的应用进行自定义、并且只要总配置适合 2KB 空间、您就可以根据应用的要求使用尽可能多的或尽可能少的不同元素类型。  可以有更多的 RX 元素和更少的 TX 元素、或者更多的 TX 元素和更少的 RX 元素。  除了是否需要使用 TX 事件 FIFO 外、您还需要考虑 RX 消息 SID 和 XID 过滤器元素的数量和类型。  您无需配置不打算使用的元素。

    因此、我将注意到 MCAN 配置将支持比 MRAM 空间更多的元素、因此您只能设置所有元素的最大值并期望其适合 2KB 范围内。  但是、您可以在中找到不同元素类型的可配置大小的以下列表 MCAN 用户手册 (链接)

    此致、

    Jonathan

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

    尊敬的 Roy:

    我在这个地址看到了同样的问题: https://e2e.ti.com/support/interface-group/interface/f/interface-forum/935107/tcan4550-msg-lost-in-rxf0?utm_source=chatgpt.com ; 他使用了什么解决方案?   [/报价]

    我不知道通过电子邮件讨论了什么。  但是、为了避免 RX FIFO 中的消息丢失、只有一个答案、即处理器必须比新消息到达更快地读取和确认 RX 消息缓冲区元素。   

    如果 CAN 消息接收到 RX FIFO 的速度快于处理器读取和清除它们的速度、则会导致 RX FIFO 溢出情况、并且消息将丢失。   

    此致、

    Jonathan

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

    如果我们希望发送和接收都达到 1Mbps 的最大速度、我们应该如何配置它来实现这一点?

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

    尊敬的 Roy:

    您是否询问如何配置标称或数据位时序参数、以便 CAN 消息位以 1Mbps 的速率发送?  该器件使用相同的位时序参数进行发送和接收。   

    第 4.1 节  TCAN45xx 软件用户指南 (链接)讨论了如何针对所需的比特率和时钟频率计算和设置位时序参数。  更多信息请参见  M_CAN 用户手册 (链接)。  

    要更改 CAN 比特率、如果您使用 CAN FD、则需要调整标称位时序和预分频器 (NBTP) 寄存器 0x101C 和数据位时序和预分频器 (DBTP) 寄存器 0x100C 的值。

    此致、

    Jonathan

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

    尊敬的 Jonathan:

    客户仍然发现 tcan4x5x spi2.0 CAN0:msg 在 rxf0 错误中丢失、并显示轻载消息。  如前所述,客户会看到慢速输出帧速率 — 在最大总线电流达到~24%时 开始。 但最大的问题是它们在正常操作期间丢弃传入帧。 他们 记录了一个带有 candump 的正常用例、我可以与 canplayer(来自 can-utils 包)重放。

    如果他们使用 “canplayer -i candump.log“从 PC 播放、并使用“candump CAN0 >/dev/null “收听 NGVP、我会在 dmesg 中看到丢失的消息:

     

    [219.014807] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [219.026064] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [219.041011] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [229.324728] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [229.342010] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [229.352413] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [243.669890] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [243.684985] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [243.694191] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [259.051841] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [259.069401] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

    [259.078492] tcan4x5x spi2.0 CAN0:msg 在 rxf0 中丢失

       

    我们已确认以下信息:

     此版本内核中包含 Horizon SOC SDK 内核 6.1.83、TCAN4x5x 驱动程序

    2.dts SPI 速度为最大 18MHz、实际测试数据为 16MHz;

    tcan4551-Q1 驱动器使用了 SPI 突发读/写

     客户尝试修改内核驱动程序并对其进行优化、但仍然存在  msg 丢失 错误。

    我想检查  TCAN4551-Q1 是否对 SIP 到 CAN 有限制。 我们是否有最新的驱动程序?

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

    尊敬的 Kevin:

    我们目前正在度假。 请在下周前提供一些反馈、谢谢。

    此致、

    Michael。

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

    尊敬的 Kevin:

    是的、您正在使用最新的驱动程序、Linux 专家已经努力优化该驱动程序中的 SPI 通信。

    与 TCAN4551-Q1 的所有通信都是通过 SPI 进行的、因此、发送或接收消息的频率的总体限制将取决于处理器完成所有所需 SPI 通信所需的时间。

    在 SPI 接口用于将 CAN 消息数据加载到 TX 缓冲区以进行发送时接收到的任何 CAN 消息都将存储到 RX FIFO 中。  处理器需要切换到在 RX FIFO 满之前通过 SPI 读取 RX 消息、以防止丢失任何消息。  

    因此、为了防止 RX 消息丢失、必须在应用代码中对 RX 和 TX CAN 消息使用 SPI 接口之间实现平衡。

    在处理器执行其他任务时 SPI 总线上的任何空闲时间也会限制可实现的最大总线负载、该负载与 TCAN4551-Q1 不直接相关。  缩短 SPI 总线上的空闲时间并允许读取 RX 消息数据或加载 TX 消息数据进行近乎恒定的通信对于提高可支持的最大总线负载百分比非常重要。

    此致、

    Jonathan

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

    尊敬的 Nerger:

    客户计划提高 x5 平台 SoC 的 SPI 读取/写入速度、并希望确认 TCAN4551 是否支持高于 18MHz 的速度。

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

    尊敬的 Kevin:

    SPI 通信可以在大于 18MHz 的速度下工作、但数据表规格整个范围(过程,电压和温度)内的器件性能只能保证达到 18MHz。  

    此致、

    Jonathan