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.

[参考译文] TCAN4550:缓冲区(常规、FIFO、队列)之间的差异

Guru**** 2769405 points

Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1282137/tcan4550-difference-between-buffers-regular-fifo-queue

器件型号:TCAN4550

我正在尝试使用 TCAN4550实现 CAN、但不确定需要哪种数据缓冲器、因为我不知道上述术语之间的区别。

TCAN4550中可以使用哪种缓冲器? 我读到过关于 FIFO 缓冲区、常规缓冲区和队列的信息、正确吗?

如果是、这三者之间的区别是什么? 我获得了 FIFO 缓冲区的功能;先入先出。 但另外两个怎么样呢?

在 TCAN4550的寄存器(以及示例代码)中、我看到可以在 MRAM 中设置 FIFO 或常规缓冲区、而不是设置队列。

如何实现队列的使用?

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

    您好、Laura。

    TCAN4550使用由 Bosch 开发的 MCAN IP、因此我将参考 MCAN 用户手册、以获取有关 MCAN 功能的更详细说明。  (链接)

    但我也会尝试简单地解释一下。  通过设置 TX 缓冲区添加请求(TXBAR)寄存器的相应位、最多可以配置32个"发送缓冲区元素"来存储应在 CAN 总线上发送的消息。  这32个缓冲区分配为 FIFO、队列或专用缓冲区、具体取决于您希望如何传输消息以及如何处理 CAN FD 协议消息仲裁。

    专用 TX 缓冲器正如其字面含义、那就是专用缓冲器。  将一条消息写入缓冲区并设置相应的 TXBAR 位后、就会尝试进行传输。   如果要传输多个消息缓冲区和消息、则需要管理缓冲区并跟踪已传输的缓冲区元素以及仍挂起的缓冲区元素。

    也可使用 FIFO 或队列、这使得多条消息传输更加易于管理。  你可以同时使用 FIFO 和队列、但不能同时使用这两个。  但是、除了 FIFO 或队列缓冲区之外、仍然可以有一些专用的 TX 缓冲区元素。

    如上所述、FIFO 是一种先入先出方法、器件将按照它们在 FIFO 中放置的顺序发送消息、而不管消息 ID 如何。

    队列与 FIFO 类似、但器件首先会比较队列中所有消息的消息 ID 值、并根据 CAN FD 仲裁协议按最低消息 ID 的优先级进行消息传输。  这确保了最高优先级的消息始终先从队列中发送出去、这与 FIFO 不同、FIFO 会按照在 FIFO 中放置的顺序发送这些消息。

    此致、

    乔纳森

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

    Jonathan、您好!


    谢谢你的答复,这是非常解释性的。

    这是否意味着、如果要向 TX 缓冲区写入多条消息、那么设置 TXBAR 位就会发送一条消息?

    或者、对于所有形式的缓冲器是否都是这种情况? 因此、一个发送请求将始终发送一条消息、缓冲区类型之间唯一/主要的区别是缓冲区中消息的发送顺序?

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

    你好、Laura。

    一次只能向 TX 缓冲器写入一条消息。  如果要对多条消息使用同一个 TX 缓冲区、则必须将第一条消息写入 TX 缓冲区并设置相应的 TX 缓冲区添加请求位。  然后、器件将在尝试发送消息时设置 TX 缓冲区请求挂起中的相应位。  根据总线活动和用于仲裁的消息 ID 的不同、发送消息所需的时间也会有所不同。  但是、成功发送报文后、TX 缓冲区请求挂起位将失效、并设置 TX 缓冲区请求传输发生寄存器中的相应位、以指示传输成功。  您还可以启用器件中断、以将此信息中继到 MCU。

    TX 缓冲区再次可用后、可以将其重复用于额外的消息、并且将重复该过程。

    如果需要一次发送多条消息、则需要配置多个 TX 缓冲区、以便可以将所有消息写入它们自己的 TX 缓冲区、然后为要传输的所有消息设置相应的 TX 缓冲区地址请求位。  然后、TCAN4550将尝试使用与我针对单条消息所介绍的事件序列相同的事件来传输所有消息。

    您最多可以配置32个 TX 缓冲器元件。  如果它们都是专用缓冲区、可以监视 TX 缓冲区请求挂起寄存器以确定哪些缓冲区元素可用、哪些缓冲区元素仍有消息等待传输。  然后您可以确定将下一条消息存储在何处进行传输。

    如果你为 FIFO 或队列配置 TX 缓冲区、你将需要监视 TX FIFO/队列状态寄存器来确定哪些缓冲区元素被占用以及通过 Put 索引将你的下一条消息发送到何处。

    如果你愿意、你也可以拥有专用缓冲区和 FIFO/队列的组合(但仍然最多只能有32个)。  例如、如果经常发送的特定消息不改变值、那么您可能需要使用专用缓冲区。  通过将其存储在未覆盖的专用 TX 缓冲器中、您只需重新发送消息、而不必在每次要再次发送消息时通过 SPI 将其写回缓冲器元素。  您只需再次设置该缓冲区的 TX 缓冲区添加请求位即可开始新的传输。

    此致、

    乔纳森

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

    Jonathan、您好!

    非常感谢您的详细解释!
    事情变得更加清晰! :)

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

    你好、Laura。

    不用客气。  如果您有任何其他问题、请告诉我们。

    此致、

    乔纳森

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

    我现在要实现正确的 MRAM 结构(在使用示例代码结构之前)。

    因此、如果我理解正确:

    在 MRAM 分配方面、单独的 Tx 缓冲区与 Tx FIFO (具有相同的元素大小和数量)相同。
    这两者之间的主要区别在于 Tx FIFO 具有获取索引和输出索引、这有助于程序设计人员确定在哪个缓冲区中放置数据/从哪个缓冲区读取数据。

    因此、为了使用 Tx FIFO 将消息放置到 CAN 总线上、我必须读取 Put 索引、然后写入该缓冲区、并设置与该缓冲区对应的发送请求位?

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

    您好、Laura。

    单独的 Tx 缓冲区在 MRAM 分配方面与 Tx FIFO 相同(元素大小和数量相同)。
    这两者的主要区别在于 Tx FIFO 具有 get-index 和 put -index、这有助于程序员确定在哪个缓冲区中放置数据/从其中读取数据。

    是的。 您最多可以创建32个 TX 缓冲区、每个缓冲区都有一个缓冲区索引 ID 号(0-31)和一个物理 MRAM 存储器位置。  "专用"、"FIFO"和"队列"术语的区别在于如何管理要用于报文的 TX 缓冲区。  它们都指向 MRAM 空间中的相同物理缓冲器。  

    您可以将所有 TX 缓冲区配置为专用缓冲区、以便 MCU 跟踪缓冲区及其传输状态。  

    也可以让所有 TX 缓冲区都是 FIFO 或队列、在这种情况下、MCU 必须首先读取下一个应使用的可用 TX 缓冲区的 Put Index 值。

    或者、也可以混合使用一些专用 TX 缓冲区和一些 FIFO/队列 TX 缓冲区。  在此配置中、专用 TX 缓冲区的索引号较低、FIFO/队列 TX 缓冲区使用的索引号较高。

    为了帮助说明缓冲区、MCAN 用户手册中的图如下。  如果您只有 TX FIFO、则 TX FIFO 将从缓冲器索引0开始。

    因此,为了使用 Tx FIFO 将消息放在 CAN 总线上,我必须读取 Put-index,然后写入该缓冲区,并设置与该缓冲区对应的发送请求位?

    是的。  

    过程始终是相同的。  首先将消息写入 TX 缓冲器、然后设置 TXBAR 中与缓冲器索引相关的相应位。  如果向多个 TX 缓冲区写入消息、则需要为要发送的包含新消息的所有缓冲区设置 TXBAR 位。

    当使用 FIFO 或队列时、你只需首先读取 Put Index、以便将该消息正确放置在设备想要使用的下一个可用的 TX 缓冲区元素中。

    此致、

    乔纳森

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

    非常感谢! :)

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

    不用客气。  如果您有任何其他问题、请告诉我。

    此致、

    乔纳森