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.
我一直在使用 《TCAN45xx 软件用户指南》SLLU270和示例软件、这有助于器件运行。
我正在努力区分 Tx FIFO 和 Tx 队列设置和使用情况。 我认为 我的应用需要使用 Tx FIFO 拓扑。
1) 1)示例软件函数 TCAN4x5x_MRAM_Configure 始终设置 REG_BITS_MCAN_TXBC_TFQM。 这不应该是输入结构的可配置部分? (虽然我知道 main()中的发送示例是"专用 Tx 缓冲器")。
2) 2)示例第 4.3.1节"将 CAN 消息写入 Tx 缓冲器"似乎描述了发送一条消息的 Tx FIFO。 如果我想发送多条消息、 是再次读取 TXFQS.TFQPI 的步骤4到5之间、还是只能根据我最初从 TXFQS.TFFL 读取的值递增/打包?
3) 3)加载多条消息后、步骤5是否是从 TXFQS.TFGI 索引而不 是 TXFQS.TFPi 发送请求? 或者我是否误解了:
"二. TX FIFO:TCAN45xx 处理缓冲区管理。 微控制器读取 Tx FIFO Put
将新消息放入正确缓冲区的索引。 当请求发送多条消息时
TX FIFO 获取索引被引用、并根据最初添加到 FIFO 的内容发送数据"
非常感谢、
编辑
尊敬的 Ed:
我很高兴听到软件用户指南和示例软件对您有所帮助。 你提出了很多好的问题、我会为你明确回答。 但首先、我将指出一个额外资源、您可能会发现它对了解如何配置 TCAN4551非常有帮助。
TCAN4551包含一个由 Bosch 开发的 CAN FD 内核、称为 M_CAN、该控制器在 CAN FD 社区中广为人知。 博世拥有许多优秀的文档和资源、这些文档和资源不能复制到 TCAN4551数据表中。 但您可以将其文档用作数据表和《TCAN45xx 软件用户指南》SLL270的补充资源。
以下 是 博世网站上的 M_CAN 用户指南链接。
[引用 userid="482283" URL"~/support/interface/f/interface-forum/991269/tcan4551-q1-distinguishing-between-tx-fifo-and-tx-queue-topologies ]我很难区分 Tx FIFO 和 Tx 队列设置和使用情况。 我认为 我的应用需要使用 Tx FIFO 拓扑。[/quot]虽然我不确定哪种 TX 方法最适合您的应用、但我将尝试简要说明每种方法、以便您可以选择最佳方法。
CAN 的优势之一是根据系统中的报文优先级为每条报文分配一个标识符、而不同的系统节点将进行仲裁、以便首先传输具有最高优先级的报文。
但是、每个节点一次只能传输一条消息、这正是这两种方法的适用之处。
是否希望根据邮件的优先级或标识符号传输邮件? 如果是、专用 TX 队列操作是一个更好的选择、因为 TCAN4551将首先传输 ID 最低的消息、而不管 MCU 使用哪种 TX 缓冲器来放置消息。 这可确保在较低优先级的较旧消息之前传输较高优先级的较新消息。 此外、任何未使用的缓冲器都可以用于消息、这可以简化固件、因为在将消息从 MCU 传输到 TCAN4551之前只需要简单地检查缓冲器的状态。
或者、您是否希望根据 MCU 何时将消息传递给 TCAN4551以时间顺序传输这些消息? 如果是这样、您将需要使用 TX FIFO、因为无论报文 ID 如何、TCAN4551都将按照将报文放入 FIFO 的顺序发送报文。 但是、当使用 FIFO 时、消息必须放置在下一个按时间顺序排列的缓冲区位置、MCU 将需要读取 Get 和 Put 索引值、并确定下一条消息使用的下一个可用缓冲区。 一旦索引到达最后一个缓冲器元件、MCU 将需要再次循环到第一个缓冲器元件。 与队列方法相比、跟踪索引和 FIFO 填充级别会使固件更复杂。
1~) 1)示例软件函数 TCAN4x5x_MRAM_Configure 始终设置 REG_BITS_MCAN_TXBC_TFQM /support/interface/f/interface-forum/991269/tcan4551-q1-distinguishing-between-tx-fifo-and-tx-queue-topologies。 这不应该是输入结构的可配置部分? (虽然我知道 main()中的传输示例是"专用 Tx 缓冲器")。示例代码默认演示了队列方法、该方法允许使用任何消息缓冲器、从而允许 TCAN4551确定哪个消息 ID 具有最高优先级。 这通常是更容易实现的方法、并且与 CAN 仲裁方案一致。 但是、如果您希望使用 FIFO 方法、欢迎您在代码中修改此内容。
[引用 userid="482283" URL"~/support/interface/f/interface-forum/991269/tcan4551-q1-distinguishing-between-tx-fifo-and-tx-queue-topologies ]2)示例第 4.3.1节"将 CAN 消息写入 Tx 缓冲器"似乎描述了发送一条消息的 Tx FIFO。 如果我想发送多条消息、 是再次读取 TXFQS.TFQPI 的步骤4到5之间、还是只能根据我最初从 TXFQS.TFFL 读取的值递增/打包? [/报价]要传输多条消息、只需将其传输到下一个连续的存储器缓冲器元素、确保第一条消息存储在 Put Index 位置。 您需要确保 FIFO 中有足够的开放元素来容纳您的所有消息。 此外、还需要确保索引达到最后一个值后、根据需要回绕到 FIFO 缓冲区的开头。 请注意、器件在传输消息时不会将消息数据从缓冲器传输到缓冲器。 相反、它只是以循环方式递增 Get 和 Put 索引值、并且 MCU 必须确定 FIFO 中是否有足够的元素可用以及要使用的索引。 但在将一条或多条消息传输到 TCAN4551 MRAM 块之前、它只需读取 TXFQS 寄存器一次。
[引用 userid="482283" URL"~/support/interface/f/interface-forum/991269/tcan4551-q1-distinguishing-between-tx-fifo-and-tx-queue-topologies 3]3)加载多条消息后,步骤5是从 TXFQS.TFGI 索引传输请求,而不 是 TXFQS.TFPi 吗? 或者我是否误解了:[/引述]否、要发送消息、您需要为存储了消息的每个 TX 缓冲器元素设置 TXBAR 位。 一旦这些位被置位、器件将按照 CAN 仲裁协议尽快发送消息、并且在消息被发送后将 TXBAR 位清零、并相应地更新 TXFQS 寄存器字段。 TXFQS 是一个只读寄存器、只需向 MCU 提供有关 FIFO 状态的信息。 TX 缓冲区添加请求是告知 MCU 哪些缓冲区包含要发送的消息的寄存器。 如果您要使用队列方法、只需将消息放置在任何可用的缓冲区中并设置相应的 TXBAR 位。 一旦消息被发送、它将被清除。
[引用 userid="482283" url="~/support/interface/f/interface-forum/991269/tcan4551-q1-distinguishing-between-tx-fifo-and-tx-queue-topologies ]"2. TX FIFO:TCAN45xx 处理缓冲区管理。 微控制器读取 Tx FIFO Put是的。 初始化后、Get Index 和 Put Index 的值都为"0"、表示 FIFO 为空。 然后、假设 MCU 将一条消息传输到缓冲器0处的 FIFO 中。 然后、Put 索引将递增至1、而 Get 索引将保持为0、直到消息已传输、然后递增至1。
如果 MCU 随后将两条消息传输到 TCAN4551、则应将它们放置在缓冲器元件1和2中(根据 Put Index = 1)。 然后、如果 MCU 再传输一条消息、则应将其放置在缓冲器3中。 如果总共使用了4个元件(缓冲器0-3)、那么 MCU 尝试发送的下一条消息需要被放置回缓冲器0、前提是获取索引不等于0、这将表示 FIFO 已满。 该过程循环重复、MCU 将新消息放置在 Put 索引中、TCAN4551根据 Get 索引传输消息。
我希望我在答复中已清楚说明,但如果你有其他问题或我不清楚,请告诉我。
此致、
Jonathan
您好、Jonathan、
非常感谢您的详细解释。
是的、我希望按时间顺序传输、因此 Tx FIFO 就是这样。
我忘记了 TXBAR 位图、因为我在想使用演示函数 TCAN4x5x_MCAN_TransmitBufferContents、它仅取一个整数作为传输参数。
我了解 Put 索引、 TFFL 和回绕的位置加载要求。 因此、我只需要确认最后一点:
如果我已经将消息加载到正确的位置、并且我发送了一个涵盖所有消息的 TXBAR 位图、那么区别在于如果 TFQM 已设置、则消息将按标识符优先级顺序传输、但如果 TFQM 已清除、 然后、它按照从 TFGI 回绕到 TFPi 的顺序传输它们?
此致、
编辑
尊敬的 Ed:
是的、没错。
如果 TXBC.TFQM 位="0"、则器件将处于"Tx FIFO 工作模式"、并按照将消息置于 FIFO 中的顺序发送消息、首先是获取索引消息、然后按其到达 Put 索引的顺序发送。
如果 TXBC.TFQM 位="1"、则器件将处于"Tx 队列操作模式"、并根据消息 ID 的优先级发送消息、其中最低 ID 值根据 CAN 协议标准具有最高优先级。
我很高兴能提供帮助。 如果您有任何其他问题、请告诉我。
此致、
Jonathan