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.

[参考译文] TMS570LS3137-EP:EMAC 分段

Guru**** 2589280 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1057576/tms570ls3137-ep-emac-fragmentation

器件型号:TMS570LS3137-EP
主题中讨论的其他器件:HALCOGEN

我们在项目中使用 EMAC 外设进行外部通信、如果数据包大小超过1500、则进行碎片整理。 根据 TRM (29.2.6.5.7) ,当接收到完整的数据包时,EMAC 将设置 Pocket 的结尾。  

问题是当外部系统发送2K 字节时、它会将 EMAC 数据包碎片 整理为两个1500字节和500字节的帧。 EMAC 外设在 接收所有片段后如何在 Rx 描述符中设置 EOP 标志。  

谢谢、

Subash

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

    您好、Subash、

     我看到 QJ 已在该帖子中回答了您的问题。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1052884/tms570ls3137-ep-emac-data-receive-dma。 

     EMAC 将为具有小于主机初始化的片段的描述符设置 EOP 标志。 虽然我不是一名有关 EMAC 实际工作方式的专家、但我认为这是由 EMAC 硬件负责的。  我认为在接收期间、软件不需要干预设置此标志。  

    复位后、主机必须向所有 Rx DMA 状态头描述符指针写入零。 Rx 端口
    可启用。 为了启动数据包接收、主机在中构造接收队列
    存储器、然后写入适当的 Rx DMA 状态头描述符指针。 每个 Rx 的值
    缓冲区描述符添加到队列中、主机必须将 Rx 缓冲区描述符值初始化为
    如下:
    ? 在下一个描述符指针中写入下一个描述符的32位对齐地址
    队列(如果最后一个描述符为零)
    ? 向缓冲区指针写入缓冲区数据的字节对齐地址
    ? 清除偏移字段
    ? 在 Buffer Length 中写入缓冲区中的字节数
    ? 清除 SOP、EOP 和 EOQ 位
    ? 设置所有权位
    主机通过写入第一个缓冲区的地址来启用给定通道上的数据包接收
    队列中的描述符(非零值)与通道中通道的头描述符指针的关系
    RX DMA 状态。 当数据包在给定通道上开始接收时、端口会填充每个 Rx 缓冲器
    数据、顺序从第一个缓冲区开始、并继续通过 Rx 队列。 如果是缓冲区
    Rx DMA 状态中的偏移量为非零、则端口将在偏移量后开始写入数据

    SOP 缓冲区中的字节数。 端口在结束时执行以下操作
    每个数据包接收:
    ? 用字节数覆盖数据包的 EOP 缓冲区描述符中的缓冲区长度
    数据包的最后一个缓冲区中实际接收到的数据包。 主机初始化值是缓冲区大小。 。
    覆盖的值将小于或等于主机初始化的值。
    ? 在数据包的 EOP 缓冲区描述符中设置 EOP 位。
    ? 如果当前数据包是最后一个数据包,则在数据包的 EOP 缓冲区描述符中设置 EOQ 位
    在队列中。
    ? 使用 Rx DMA 状态值覆盖数据包的 SOP 缓冲区描述符缓冲区偏移(
    主机已将缓冲区描述符缓冲区偏移值初始化为零)。 所有非 SOP 缓冲器
    描述符必须具有由主机初始化的零缓冲区偏移量。
    ? 用有效数据的数量覆盖数据包的 SOP 缓冲区描述符缓冲区长度
    缓冲器中的字节。 如果缓冲区被填满、缓冲区长度将为缓冲区大小减去
    缓冲器偏移。
    ? 在数据包的 SOP 缓冲描述符中设置 SOP 位。
    ? 写入 SOP 缓冲区描述符数据包长度字段。
    ? 清除数据包 SOP 缓冲区描述符中的所有权位。
    ? 通过将数据包的最后一个缓冲区描述符的地址写入来发出一个 Rx 主机中断
    队列的 Rx DMA 状态完成指针。 中断由对 Rx 的写操作产生
    DMA 状态完成指针地址位置、与写入的值无关。
    中断时、主机处理 Rx 缓冲器队列、根据的状态检测接收到的数据包
    每个数据包的 SOP 缓冲区描述符中的所有权位。 如果所有权位被清零
    数据包已完全接收、可由主机处理。 主机
    可以继续 RX 队列处理、直到队列结束或读取缓冲区描述符
    其中包含一组所有权位,表示下一个数据包的接收没有完成。 。
    当队列中的最后一个数据包被清除时、主机确定 Rx 队列为空
    SOP 缓冲区描述符中的所有权位、EOP 缓冲区描述符中的设置队列结束位、
    EOP 缓冲区描述符中的下一个描述符指针为零。

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

    您好、Charles、

    非常感谢 您的快速响应! QJ 回答 了我的不同问题。  

    由于我的数据包大小是动态的并且超过1500字节、因此数据包将被碎片化。 例如、如果数据包大小为2000字节、则接收到第一个帧1500字节、第二个帧500字节。   EMAC 外设如何理解在接收1500字节后即将到来的500字节并在 Rx 描述符中设置 EOP 标志。

    谢谢、

    Subash  

     

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

    您好!

     请记住、一个以太网帧的 MTU (最大传输单元)约为1500字节。  这意味着,如果上层协议数据报超过 MTU 字节,则主机必须对数据报进行碎片整理并将其发送到多个以太网数据包中。 当我说主机时、我是指运行 TCP/IP 上层堆栈的处理器。  无论您的传入数据包是1MB 还是2000字节、上层 TCP/IP 堆栈都将负责将它们分解为数据包。 如果是2000字节、则映象 TCP/IP 堆栈会将其分解为两个不同以太网数据包的1500和500字节。 这两个以太网数据包将占用链接列表中的两个接收描述符(数据包 A 具有1500字节到下一个500字节描述符的链接)。 在第二个描述符中、数据包长度等于500。 由于它小于最大值、EMAC 应该知道在描述符中设置 SOP 和 EOP 标志。 回答该问题的另一种方法是询问如果来自另一个节点的传入数据仅为500字节而不是2000字节、会发生什么情况。 EMAC 应该知道它小于最大值、并在同一描述符上设置 SOP 和 EOP。  

     抱歉、我不知道 EMAC 的实际设计方式。 我是根据我认为它应该如何工作来回答的。  

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

    您好、Charles、  

    根据 TRM 示例、如果发送端将1514字节本身碎片整理成512、502和500字节的三个碎片、那么接收端 EMAC 将如何 在 接收第三个碎片时准确设置 EOP 标志。 因为所有三个片段都小于1500字节(EMAC 最大有效载荷)。

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

    您好、Subash、

     我认为该图显示了硬件可以支持的功能。 但我不确定这是主机软件如何设置接收缓冲区描述符的。 硬件不知道如何/何时/为什么创建512、502和500字节的三个片段。 因此、这必须由主机软件设置。  如果主机软件真的想设置碎片化的缓冲区描述符、我想它将为每个描述符指定缓冲区大小、例如512、502和500。  当接收到数据包长度为1514字节时、它将 用数据填充三个 Rx 缓冲区中的每一个、顺序从第一个缓冲区开始、并继续通过 Rx 队列。  请注意、只有第一个缓冲区描述符具有 SOP、而接下来的两个缓冲区不具有 SOP。 我想 EMAC 有情报知道1514字节的数据包只会在第三个缓冲区结束。 因此、它只会在第三个缓冲区描述符上设置 EOP。 我认为您只需要相信这就是将要发生的情况。 当为最后一个缓冲区描述符设置 EOP 时、我无法查看实际电路以了解算法以了解确切条件。 如果您真的想证明这是否正确、则需要创建自己的驱动程序。 我不认为库存 HalCoGen 生成的 EMAC 驱动程序正在进行碎片整理。  

     同样、我对实际 EMAC 硬件的了解有限。 我会尽力回答我所期望的最佳行为。  我也不明白为什么你需要了解这一级别的细节。 您是否正在创建自己的驱动程序? 您是否正在创建自己的 TCP/IP 堆栈?