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.

[参考译文] TMS320F28377S:CAN FIFO 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/680270/tms320f28377s-can-fifo-issues

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

您好!

如今、我们将配置 f28377S CAN FIFO 来接收报文对象、但会出现以下问题:

1) 1) IF3是唯一可用于 FIFO 的接口。 对吗?

2) 2) FIFO 和中断之间的关系是什么? 如果6个对象组成一个 FIFO 缓冲区、何时会发生中断? 接收到6个物体、那么中断? 还是每个接收到的对象、是否启动了一个中断?  

3) 3)如何实现客户请求:检查6个物体到达后读取。 在此过程中、还有一些其他问题:

  读取所有6个对象需要多长时间? 读取位于 CAN_ISR 中、客户希望尽量缩短时间;

  读取期间,如果另一个物体到达,会发生什么情况? 另一个 CAN 中断将被处理? 在退出 CAN_ISR 之前、它们是否需要清除中断位 INT0_FLG_CLR?  

4) 4)是否有任何详细的文档供参考?  

非常感谢。

BR、Jordan

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

    请在下面查找我的答案:

    1) 1)没有 IF3不是唯一可用于 FIFO 的 IF3、但也可以使用 IF1和 IF2。 IF3只有读访问权限。
    2) 2)如果有一个中断被启用、它将在每个接收的对象上发生。
    3) 3)在 ISR 中读取数据的时间取决于您的要求和代码。 如果产生另一个中断、则在读取前一个报文对象后会发生中断。
    4) 4)您可以参阅《技术参考手册》以了解更多详细信息。 链接 www.ti.com/.../spruhx5e.pdf


    如有任何疑问、请告知我。

    谢谢、此致
    Harshmeet Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    辛格
    感谢您的回复。
    实际上、客户和我做了几次测试、但仍然很困惑。
    1) 1)如果不使用 IF3、则 FIFO 不起作用。
    2) 2)根据用户指南、我们无法很好地理解 FIFO。
    客户的请求是使用中断和 FIFO 来接收6个对象。
    但我们不知道如何处理中断、以确保没有物体丢失。
    您能为我们提供演示代码吗?
    或者、我们是否可以规划一个通话来更好地了解它的工作原理。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦、您好!

    您是否尝试运行 C2000Ware 示例?

    您能详细介绍一下您要做什么吗? 以便我可以更好地理解并帮助您解决这个问题。

    谢谢、此致
    Harshmeet Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    辛格
    是的、代码来自 C2000ware。
    客户的请求是:使用 CAN FIFO 接收1+3对象。 首先发送第一个对象。 3ms 后、3个物体将一起发送、彼此之间没有任何延迟。 如果未使用 FIFO、某些对象将丢失。 接收物体的频率约为10ms。
    在其应用中、还有一些其他中断、如 Timer1 0.1ms。 PWM 50ms、timer2 2ms、SCI 接收/发送。 我们想知道、这是检查1+3对象并在最短时间内读取它们的最佳方法。

    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    有任何反馈吗?
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    很抱歉、我无法处理此问题。

    据我所知、您尝试执行的操作是发送第一个对象、然后在经过3ms 的延迟后立即将三个对象一起发送、而不会有任何延迟。
    您正在尝试使用 FIFO。

    配置是否正确完成?

    您是否使用了相同的 driverlib 示例代码、以及您对其进行了哪些更改? 您能否分享详细信息?

    您能提供更多详细信息。

    我可以尝试以您描述的相同方式进行复制、并为您举例?

    此致
    Harshmeet

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

    实际上、客户的请求是:使用 CAN FIFO 来接收1+3 (总计)个对象。 首先接收第一个对象。 3ms 后、其他3个物体将被接收、彼此之间没有任何延迟。 如果未使用 FIFO、某些对象将丢失。 接收物体的频率约为10ms。
    在其应用中、还有一些其他中断、如 Timer1 0.1ms。 PWM 50ms、timer2 2ms、SCI 接收/发送。 我们想知道、这是检查接收到的1+3对象并在最短时间内读取它们的最佳方法。

    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    若尔登我理解您的问题陈述。

    您能否分享您所引用的 C2000Ware 示例的详细信息以及是否进行了任何更改?

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    该代码不基于任何 C2000ware、因为客户在 F2837x 仅为样片时就执行了该项目。
    但他们的代码对于 C2000ware 的最后一个版本非常熟悉。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    有任何反馈吗?
    谢谢。 BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    很抱歉耽误你的回答。

    因此、我尝试复制您刚才提到的情形。 我正在发送一个消息对象、然后等待3ms 并发送接下来的三个消息对象。

    是如果未使用 FIFO、则对象将丢失。 根据我对 CAN 和我的工作的理解、我尝试了以下操作:

    我将 C2000Ware 示例(CAN_ex3_external_transmit)分解为两个不同的示例:一个用于传输数据、另一个用于接收数据。 我使用两个 F2837XS Launchpad。

    在第一个示例中、我发送根据配置消息框的数据、并在接收到第一个数据后提供3ms 的延迟。

    在第二个示例中、我在配置消息对象后接收数据并进入 while (1)循环。 因此、每当接收到数据时、它都会进入 ISR。

    如果我使用相同的消息 ID、则消息可能会丢失。 因此、我对数据使用不同的消息 ID、并且能够正确接收数据。

    如果要使用相同的消息 ID、则需要延迟等待数据成功接收。

    我需要详细了解如何在硬件中实现 FIFO。 希望这些信息有所帮助


    谢谢、此致
    Harshmeet Singh

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

    您是否有时间了解这一点?

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    客户正在处理您之前的建议。
    目前、客户有一个问题、即如何判断是否成功接收到数据。 在他们的应用中、不可能只是等待检查是否已收到。 有多个中断。 他们可以做的是、每2ms、他们就可以检查是否收到。 这是它们的代码结构、就像 RTOS 一样。 在这种情况下、它们可以做什么?
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    CAN 中断用于接收数据。
    现在、客户需要:
    1) 1) CAN FIFO 中有多少个对象将触发 CAN ISR? 也就是说、可以读取多少个对象?
    2) 2)在 CAN ISR 中、如何复位 ISR 标志?
    您是否有基于 C2000ware 中示例的演示?
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    每个 CAN 数据将触发一个中断。

    您能否参阅 CAN 的 c2000ware 示例: CAN_ex3_external_transmit

    在本示例中、数据从 CAN A 发送到 CAN B。清除中断和中断。

    谢谢、此致

    Harshmeet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    今天、客户再次要求演示 CAN FIFO。
    您是否会根据"CAN_ex3_external_transmit "准备演示?
    我向他们介绍了逻辑、但他们不接受。 这是他们第一次使用 C2000。 M3/M4对他们非常熟悉。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    我可以共享这两个 c 文件吗?

    但愿这有所帮助。

    此致

    Harshmeet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    让我尝试使用这两个 C 文件、然后为您提供反馈。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    请在下面找到这两个文件。

    根据您提供的信息、我尝试复制它。

    我正在使用两个 Launchpad、因为它们具有板载 CAN 收发器。 您可以在 CAN_ex3_external_receive 工程中复制该文件、以替换原始工程文件、

    只需如下所示更改 device.h 文件中的 GPIO 配置、然后在项目中选择 define _LAUNCHXL_F28377S 即可。

    //
    // CANA
    //
    #define DEVICE_GPIO_PIN_CANTXA 71U // CANTXA 的 GPIO 编号
    #define DEVICE_GPIO_PIN_CANRXA 70U // CANRXA 的 GPIO 编号

    //
    // CAN 外部环回
    //
    #define DEVICE_GPIO_CFG_CANRXA GPIO_70_CANRXA //针对 CANA RX 的"pinConfig"
    #define DEVICE_GPIO_CFG_CANTXA GPIO_71_CANTXA //针对 CANA TX 的"pinConfig"

    您必须具有两个 launchpad 和两个 CCS 实例、在这些实例中、您可以在项目中的两个 c 文件上运行、然后运行包含项目的接收 c 文件、然后运行传输项目。  您应该在结尾看到 rxMsgCount 为4

    e2e.ti.com/.../can_5F00_ex3_5F00_external_5F00_receive.ce2e.ti.com/.../can_5F00_ex3_5F00_external_5F00_transmit.c

    谢谢、此致

    Harshmeet Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我检查代码、尤其是接收代码。 这不是一个客户的需求。
    他们只需要一个演示代码:
    1) 1)接收、不发送
    2) 2) FIFO 接收、用于保存所有对象(ID 不同)
    3) 3)接收中断
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    接收文件有两个文件、它们有一个 while (1);等待接收数据、接收数据时会有一个中断。

    接收代码中的代码中有一个 ISR。 您将接收具有不同 ID 的对象、这些 ID 由传输代码传输。

    此致

    Harshmeet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    对 CAN FIFO 的另一个疑问:客户将4个对象组合为 FIFO。 如果它们用来接收所有对象(未使用标识掩码、这意味着将接收所有对象)、则哪个中断可以中断。 它们是否需要启用全部四个对象的中断、还是只启用一个对象的中断?
    我们的目标是仅启用一个 CAN 中断、以接收所有对象。 在 CAN ISR 内部、代码检查 NewDat 和 EOB 以保存所有对象。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任何反馈?
    谢谢。
    BR Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦、您好!

    很抱歉我休假了、所以无法回复。

    需要启用报文对象中断。 您需要配置消息框对象。

    我没有清楚地了解您启用所有四个消息目标中断的含义。 您能解释一下这个问题吗、并告诉我这是否是您问题的答案。

    谢谢、此致
    Harshmeet Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、当前只有一个中断被启用。 可能发生的目标中断。 但客户表示 NewDat 和 EOB 无法获取其他对象。 我的问题是、客户应该使用哪个中断来获取 FIFO CAN 对象?
    BR Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦、您好!

    CAN 支持三个中断。 报文对象、错误和状态中断。 客户需要启用消息对象中断。
    客户需要配置邮箱、以便在使用同一邮箱时获取数据或等待一段时间、然后再发送另一个数据。
    客户是否正在执行上述操作之一?

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

    有什么帮助吗?

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Harshmeet
    我通知了客户该解决方案、但他们无法通过 FIFO 和中断进行接收。
    客户在外面出差(在德国)很长时间。 我正在等待他们回来、并在实验室中与他们合作。
    这是他们第一次使用 C2000。 此外、我没有两个板来进行测试。 如果您可以提供测试代码、则会更好。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦

    我使用两个板载收发器的 Launchpad。 其中一个用作发送器、另一个用作接收器。
    我对代码进行了修改、使传输接收成为可能、我可以向您提供该代码。

    您能告诉我您正在使用的硬件吗? 您是否有外部 CAN 收发器?

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有 CAN 收发器。
    但客户有。 您可以向我提供代码、然后我将其发送给客户。
    实际上、要点如下:
    1) 1)配置4个 FIFO 对象、以接收所有 ID 对象
    2) 2)中断以接收和清除中断标志。
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    约旦、您好!

    如果没有 CAN 收发器、则两个 CAN 控制器之间无法通信。

    1) 1) CAN_EXTERNAL_Transmit 中配置了四个 FIFO 对象。 这四个报文对象将数据发送到第二个 CAN 控制器、该控制器接收数据。 我这样做是为了在发送数据之间没有延迟。

    注意:如果使用同一个报文对象、则两次数据传输之间必须有一定的延迟。

    2) 2)在 CAN_EXTERNAL_Receive 中有 while (1)等待接收报文对象。 它进入代码中的 ISR"canaISR()"。 ISR 中有用于清除中断的代码。  读取报文后、会有一个 API CAN_clearInterruptStatus 清除中断状态、以便下一个报文对象可以触发中断。 CAN_clearGlobalInterruptStatus 和 Interrupt_clearACKGroup API 清除全局中断状态和 ACKGroup API。

    我有两个 F2837xS Launchpad。 控制卡上有用于 CAN 控制器的片上 CAN 收发器。 我连接 CAN H、CAN L 和接地。 我运行两个代码、这两个代码具有两个 CCS 实例。 现在、我运行 CAN_EXTERNAL_Receive、它进入等待状态以接收数据。 然后、我运行 CAN_EXTERNAL_SEND 代码并发送数据。  

    指针:时钟配置和 GPIO 配置必须正确。 检查消息 RAM 以查看配置是否正确完成、以及当数据被接收检查时、是否在消息 RAM 中的正确对象中接收到数据。

    谢谢、此致、

    Harshmeet


    发送端代码:

    /cfs-file/__key/communityserver-discussions-components-files/171/can_5F00_external_5F00_transmit.c

    接收边代码:

    /cfs-file/__key/communityserver-discussions-components-files/171/can_5F00_external_5F00_receive.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    感谢您的代码。 我将传递代码并向他们解释。

    实际上、我没有 CAN 收发器、我无法编写任何代码来尝试和测试。
    客户、所有团队都在出差、他们也无法为我提供合作平台。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    根据客户的电路板、我们修复了代码、现在可以使用 CAN FIFO。
    另外两个疑问:
    1) 1)数据从消息 RAM 传输到接口寄存器的时间、在 UG 中、它显示4~14 μ s 时钟。 它是如何计算的? 在客户的应用中、1Mbps、外部10MHz 时钟输入、8字节应用数据。 传输需要多长时间。 最长延迟时间是多少?
    //等待忙位清零
    while (HWREGH (ui32Base + CAN_O_IF2CMD)和 CAN_IF2CMD_BUSY)

    2) 2)在接收中断中、如果 FIFO 中有3个对象、中断将如何工作? 我的意思是、在 ISR 中、它只读取和清除一个对象状态、然后清除这两个状态。 退出 ISR 后、其他2个对象仍处于 FIFO 中。 如果没有接收到新的对象、是否会由于 FIFO 中的剩余2个对象而再次触发 ISR?
    //
    //清除 CAN 中断线的全局中断标志
    //
    CAN_clearGlobalInterruptStatus (CANA_base、CAN_GLOBAL_INT_CANINT0);
    //
    //确认位于组9中的此中断
    //
    INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
    非常感谢。
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦、您好!

    很抱歉耽误你的回答。

    代码的问题是什么以及如何解决。

    1) 1)我不确定、但还是在我执行该操作时、我在返回中断以获取时钟周期时使用了已配置的 API。 我不确定是如何完成的以及 UG 中给出的数据。 如果您愿意、我可以与他人联系。

    2) 2)它将读取一个并清除一个对象状态、然后接收另两个对象状态。

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2) 2)它将读取一个并清除一个对象状态、然后接收另两个对象状态。
    您的意思是、另外两个仍将触发 CAN 中断吗?
    BR、Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    约旦。

    您能告诉我您如何解决该问题吗? 我对那个很好奇。

    此致
    Harshmeet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Harshmeet、
    关于该问题、首先存在配置错误、要求使用"EOB"来设置 FIFO。 客户已使用、但 ISR 接收失败、然后他们更改了"EOB"的配置。 最后、只创建了一个对象的 FIFO。 在 ISR 中、它们没有检查循环中新对象的"NewDat"。 他们还误解了寄存器 CAN_NDAT_21中的"NewDAT"。
    BR、Jordan