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.

[参考译文] TMS320F28384D:FSI:缓冲区操作、缓冲区溢出和缓冲区欠运转

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1469333/tms320f28384d-fsi-buffer-operation-buffer-overrun-and-buffer-underrun

器件型号:TMS320F28384D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

TRM 的 FSI 部分表明数据缓冲区是循环的。 但没有为此操作和生成的事件提供良好的详细定义。 我没有看到处理数据缓冲区的示例。 我也没有看到任何其他论坛回复解决了这一问题。

CURR_BUF_ptr–这是消息的最后一个数据字还是第一个数据字? TRM 表示这是未读取的数据字的数量。 当我读出单词时、这会下降吗? 如果不是、什么会将其复位? 它是否只是每个新消息更改一个(TRM 说这些字未读出、因此读取后会更新)?

CURR_WORD_CNT–是最后一次接收的数据的大小或数量。 与 CURR_BUF_PTR 类似的问题。

是否在每次接待时更新这些信息?

buf_overrun -如何生成这个函数? TRM 会提示它是在发生溢出情况时生成的。  当缓冲区溢出或超过16而不进行读取或写入时是这样吗? 准确地跟踪或检测此复位/重启(不是 EVT 状态)。

buf_underrun -如何生成这个函数? 软件读取的位置是否自上次读取后未接收到任何数据? 准确地跟踪或检测此复位/重启(不是 EVT 状态)。

当缓冲区不是循环的并且缓冲区 ptr 在每个 Rx 上以及每个 Tx 之前重新加载或设置回零时会发生什么情况?

我的解释是、当缓冲区指针被强制设置一个值、并使其不符合 FSI 控制器的想法时、将会生成缓冲区 BUF_OVERRUNG 和 BUF_UNDERRUN 错误? 同样、TRM 缺乏足够的细节、因此可以就此作出任何结论。

FRAME_OVERRIDE 实际上有一个合理的定义。 当接收到一个新的帧、但前一个 Rx 尚未清除错误或帧接收状态时、就会生成该位。 此类信息更有用。

提前感谢。

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

    尊敬的 Kevin:

    您可以尝试  C2000ware 中提供的 fsi_ex8_ext_p2pconnection_XX 项目。

    使用循环缓冲器可使数据以圆周运动方式流动。 例如、 如果您将 nword 长度设置为6、它应该每6个字循环循环执行 circbuf、并调用 FSI_setRxBufferPtr 函数并将其设置为0、它 将始终接收到位置0的第一个字节。

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

    FSI_EX8_ext_p2pconnection_XX 工程不会将缓冲区视为循环缓冲区。

    对您的第一个评论:我的理解是,将长度设置为6应该将外发消息设置为6个字。 如果所有消息都是6个字、则缓冲区将在第三条消息上绕回、因为缓冲区是16个字。 对吧?

    关于 Tx 欠载:您认为 Tx 欠载是以零长度触发的吗?
    关于 Tx 溢出:无论缓冲区指针的位置如何、当超过16个字加载到缓冲区中时、您说的 Tx 溢出是触发的吗? 或者数据从缓冲区 ptr 位置绕回、然后经过缓冲区 ptr?

    现在、您能在收到时回答我的原始问题吗?
     
    此致

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

    尊敬的 Kevin:

    如前所述、这取决于是否 调用 FSI_setRxBufferPtr 函数并设置相应值。

    如果未调用上述函数、那么您的理解是正确的。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于 Tx 欠载:您说 Tx 欠载是以零长度触发的吗?

    关于 Tx 溢出:您认为无论缓冲区指针的位置如何、如果将超过16个字加载到缓冲区中、将触发 Tx 溢出? 或者数据从缓冲区 ptr 位置换行、然后经过缓冲区 ptr?[/QUOT]

    抱歉、我没搞清楚。

    但简化方式如下:

    TX

     欠运转:当发送器尝试从一个尚未被 CLA、CPU 或 DMA 写入的位置读取数据时、发生缓冲器欠运转。

    溢出:如果数据在传输前被覆盖、则会发生缓冲区溢出

     

     

    接收

    欠运转:当软件读取一个空缓冲器时出现这个情况。

    溢出:接收到新数据但尚未读取旧数据

    谢谢!

    Susmitha

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

    参考 TRM (spruii0e):TRM 指示初始化过程。 在另一节中、它指的是在错误恢复后初始化或重新初始化后需要完成的同步/刷新过程。 这使用了 ping 帧。 除在开始通信(Rx)之前初始化命令外、还必须执行此操作。 是否需要 Ping 帧和/或 WD 帧来保持同步和通信?如果需要、发送频率如何?

     

    以下是关于接待的情况:

    CURR_BUF_ptr–在测试时、这似乎指向将存储的下一个位置数据?

     

    CURR_WORD_CNT–TRM 表示这是未读取的数据字的数量。 当我读出单词时、这会下降吗? 如果不是、什么会将其复位? 它只是在每条新消息上发生变化(TRM 指出这些字词未读出、因此读数使其更新)、还是在帧清除完成时更新?

     

    这些缓冲区索引是否在每次接收时更新?

     

    当缓冲区不是循环的并且缓冲区 ptr 在每个 Rx 上以及每个 Tx 之前重新加载或设置回零时会发生什么情况?

     

    我的解释是、当缓冲区指针被强制设置一个值、并使其不符合 FSI 控制器的想法时、将会生成缓冲区 BUF_OVERRUNG 和 BUF_UNDERRUN 错误?  TRM 说、在这种情况下、您"可以"忽略这些事件( 32.3.3.7) . 我认为用户必须忽略这些事件、因为这些事件可能是由缓冲指针人为生成的、会被强制回零或偏离圈的另一个位置。 是这样吗?

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

    尊敬的 Kevin:

    参考 TRM (spruii0e):TRM 指示初始化进程。 在另一节中、它指的是在错误恢复后初始化或重新初始化后需要完成的同步/刷新过程。 这使用了 ping 帧。 除在开始通信(Rx)之前初始化命令外、还必须执行此操作。 是否需要 Ping 帧和/或 WD 帧来维持同步和通信?如果需要、发送频率如何?[/QUOT]

    只要 FSI RX 模块复位、您只需执行一个清空序列。 然后、FSI RX 可以接收任何类型的帧、您可以继续进行正常通信。 如何使用 ping、Error 或数据帧取决于您和您的应用。

    FSI 中设计了 ping 和数据帧看门狗功能。 它不是必需使用的、但却是一个很好的功能。

    CURR_BUF_ptr–从测试来看、这似乎是指向将要存储的下一个位置数据?

    对于 RX 模块来说是这样。 下面的第32.3.3.7节"缓冲器管理"包含重要的相关信息。

    CURR_WORD_CNT–TRM 表示这是未读取的数据字数。 当我读出单词时、这会下降吗? 如果不是、什么会将其复位? 它只是在每条新消息上发生变化(TRM 指出其字词未读出、因此读数使其更新)还是在帧清除完成时更新?

    正确。 从缓冲区中读取数据时、此计数将减少、在接收到带有新数据的整个帧后、此计数将增加。

    这些缓冲区索引是否在每次接收时更新?

    可以、但如果发生超限/欠运转、它们将无效、因此您需要复位 FSI RX 模块。 因此需要在软件中避免超限/欠运转。

    如果缓冲区不是循环的并且缓冲区 ptr 在每个 Rx 上和每个 Tx 之前重新加载或设置回零、会发生什么情况?

    请参阅下面的寄存器说明。 CURR_BUF_PTR 不会立即有效、您需要实际接收或发送一个帧才能正确。

    我解释说、缓冲区 BUF_OVERRUNG 和 BUF_UNDERRUN 错误将在缓冲区指针被强制设置为一个值并使其与 FSI 控制器认为应该设置的值不一致时生成?  TRM 说、在这种情况下、您"可以"忽略这些事件( 32.3.3.7) . 我认为用户必须忽略这些事件、因为这些事件可能是由缓冲指针人为生成的、会被强制回零或偏离圈的另一个位置。 是这样吗?

    是的、根据什么/何时复位缓冲器指针、它会创建一个错误标志。

    此致!

    Kevin

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

    握手序列似乎存在差异。 我参考 spruii0e TRM 第32.4.1.1节、spracm3e 应用手册第3节图和示例代码。 问题是、当"lead"发送 ping tag0时、"后续"器件或节点以 ping tag1进行响应。 本应用手册描述了 ping tag0的响应(在一个图中、它似乎与图3-2中的响应相矛盾)。 示例代码似乎与 TRM 一致、因为"潜在客户"发送 ping tag0、然后"后续"器件执行清除操作并使用 tag1响应"潜在客户"。  

     

    对于 TRM 32.4.1.2、对于"后续"器件(或从器件)、"后续"必须等待 ping tag0、然后再进行刷新?  是这样吗?

    由于正常操作、我不打算定期发送 ping 消息(减少软件中断)。 我正在使用所有端口。 如果"遵循"握手过程需要、那么我可能必须检测通信失败、然后发送 ping Tag0?

    可能的选项似乎是、我可以在"lead"(引导)设置自动 ping Tx、并在"folland"(跟随)上生成 Ping WD 超时、然后启动"folland"(跟随)握手?

    此致、

    Kevin E.

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

    来解决其他问题。 如应用手册中的图3.2所示:

    1. 上电时:主机会在从以下任何一项接收到任何 ping tag1时继续。 在 ping 回中没有身份、这似乎就是这种情况?
    2. 操作过程中:铅必须知道后续操作何时需要握手。 例如、如果后续命令复位(1/3)、那么线索必须识别此情况并开始发送 ping tag0、以便接收器可以开始其刷新握手。 ping 消息本身内部没有标识。 这可以通过其他方法来实现。
    3. 关于上面的2、我猜猜 ping 标签0可以自动发送、然后再手动发送 ping 标签1?
    4. 关于上述2;虽然需要执行后面的步骤并获取握手过程、但是领导是否需要停止发送/搜索其他流量(即数据帧)? 如果是、则需要在哪个时间点停止所有节点的正常流量(即数据帧)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    同意。 如果 "lead"发送 ping tag0、则"后续"器件或节点应使用 ping tag0进行响应。

    如果使用 TRM 32.4.1.2、对于"后续"设备(或从设备)、"后续"必须等待 ping tag0才能进行刷新?  正确吗?

    是的、就是这样。  主控器件通过带有 Tag0的 ping 帧将刷新序列发送到 node1。 节点1会接收 刷新序列并通过带有 Tag0...的 ping 帧将刷新序列发送到节点2、然后重复执行、直到刷新序列返回到主控器件。

    正常操作时、我不打算定期发送 ping 消息(减少软件中断)。 我正在使用所有端口。 如果"遵循"握手过程需要、我可能必须检测通信失败、然后发送 ping tag0?[/QUOT]

    是否使用握手机制取决于用户。 实施握手可确保主控器件和节点器件准备好发送/接收数据。  

    谢谢!
    Susmitha

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

    其他内容:

    1. 似乎点到点握手与领导和跟随握手是不同的。 TRM 第34.4.1.1和34.4.1.2节似乎仅描述了两个器件的握手。  TRM 第34.4.1.1和34.4.1.2节似乎仅描述了两个器件的握手。 应用手册中的图3.2似乎描述了以下几个线索(似乎不同的代码示例支持这一点)。 我没有看到任何表明过程为何不同的东西。 它们为什么不同?  应用手册中的图3.2中也存在错误。 下面的是使用 ping tag0进行回复、但主机会收到带有 tag1的 ping。
    2. 根据应用手册中的图3.2:在正常运行期间、引线必须知道后续信号何时需要握手。 例如、如果重置了单次跟随(1/3)、则 LEAD 必须识别此情况(通信跟踪丢失)并开始发送 ping tag0、以便接收器开始其刷新握手。 是这样吗?
    3. 关于上述2;虽然需要执行后面的步骤并获取握手过程、但是领导是否需要停止发送/搜索其他流量(即数据帧)? 如果是、则需要在哪个时间点停止所有节点的正常流量(即数据帧)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    点到点握手似乎不同于领导和跟随握手。 TRM 第34.4.1.1和34.4.1.2节似乎仅描述了两个器件的握手。  TRM 第34.4.1.1和34.4.1.2节似乎仅描述了两个器件的握手。 应用手册中的图3.2似乎描述了以下几个线索(似乎不同的代码示例支持这一点)。 我没有看到任何表明过程为何不同的东西。 它们为什么不同?  应用手册中的图3.2中也存在错误。 下面是使用 ping tag0进行回复、但主机会收到带有 tag1
    的 ping

    点对点连接是指您具有单个导联和单个节点的位置。 如果连接了多个设备、则使用星型和菊花型连接。

    在所有情况下、发送的 ping 标签都应与接收到的 PINT 标签相同、以确保节点正常工作。

    以及应用手册中的图3.2:在正常运行期间、主管必须知道后续操作何时需要握手。 例如、如果重置了单次跟随(1/3)、则 LEAD 必须识别此情况(通信跟踪丢失)并开始发送 ping tag0、以便接收器开始其刷新握手。 这是正确的吗?

    如果有任何从器件处于复位状态、它不会向 lead 发回 ping 标签。 这会表明连接已断开。

    关于上述2项;在需要跟进并获取握手过程的同时、潜在客户是否需要停止发送/发送其他流量(即数据帧)? 如果是、则需要在哪个时间点停止所有节点的正常流量(即数据帧)

    在它接收到从器件的确认来确保建立正确的链路之前、建立线索不应发送任何数据。

    谢谢!
    Susmitha