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:EMAC 模块被初始化、但不发送数据包

Guru**** 2477705 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/686161/tms570ls3137-emac-module-is-initialized-but-no-packets-are-sent

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGENTMS570LC4357

大家好、

我使用 IAR 编译器来实现以太网驱动程序。 我一直在使用 halcogen 生成的代码和 code composer studio、我可以看到在 Wireshark 上发送的数据包。  

我初始化了 EMAC、MDIO 和 EMAC 控制模块、如数据表中所示、并在 halcogen 生成的代码中完成。 我创建具有适当标志和数据数组的单个缓冲描述符、然后将地址添加到 TX0HDP 寄存器。 我可以看到 TXGOODFRAMES 编号正在递增、但我仍然无法读取 Wireshark 上的以太网数据包。

我是否遗漏了额外的任务?

谢谢、

哈希

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

    两个项目(CCS 和 IAR)使用通过 HALCoGen 生成的相同驱动程序。 CCS 工程可以正常工作、但 IAR 工程无法正确传输数据包。 我的理解是否正确?

    您是否尝试使用环回代码来确保 EMAC/phy 配置正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #include "sys_common.h"
    #include "system.h"

    /*用户代码开始(1)*/
    #include "emac.h"
    #include "hw_reg_access.h"
    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    uint8 emacAddress[6U]={0x00U、0x08U、0xEEU、0x03U、0xA6U、 0x6CU};
    uint32 emacPhyAddress = 1U;

    /*用户代码开始(2)*/
    extern hdkif_t hdkif_data[1];
    pbuf_t pack[5];
    静态 uint8数据[5][100];
    uint32 Size1 = 470、size2 = 94;

    void create_packet()

    int i、j;

    for (i=0;i<5;i++)

    PACK[i].to_len = SIZE1;
    pack[i].len = size2;
    for (j=0;j<6;j++)

    data[i][j]= 0xffffff;


    for (j=0;j<6;j++)

    data[i][j+6]= emacAddress[j];

    DATA[I][12]= 0;
    DATA[I][13]= 80;

    for (j=0;j<80;j++)

    Data[i][j+14]= i+5;

    PACK[I].PAYLOAD =&DATA[I][0];
    if (i!=4)
    PACK[I].next =&PACK[I+1];

    PACK[4].NEXT =空;

    /*用户代码结束*/

    void main (void)

    /*用户代码开始(3)*/
    _enable_IRQ ();
    EMACHWInit (emacAddress);
    create_packet();
    EMACTransmit (&hdkif_data[0]、&pack[0]);
    Size1=600;
    Size2=120;
    create_packet();
    EMACTransmit (&hdkif_data[0]、&pack[0]);

    while (1);
    /*用户代码结束*/

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

    您好 QJ、

    好的、我用 code composer studio 尝试该代码、一切都正常、我可以看到数据包。 我尝试编写自己的代码并在 IAR 编译器上发送相同的数据包、但以太网电缆上没有任何内容、寄存器显示所有 TX 帧都是手动生成的良好帧。 我将尝试启用回送、但我不知道如何知道是否有问题??
    谢谢   

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

    很抱歉、我没有 IAR Workbench 的许可证、因此我无法对其进行测试。 如果使用 CCS、它是否与 linker.cmd 文件中定义的存储器映射和段映射相关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我有一个问题、TXGOODFRAMES 的递增到底意味着什么? 这是否意味着帧已成功从芯片发送到物理层? 还是意味着帧是从电缆上的物理层发送的? 我很难知道错误的位置、但仍然不幸运。  

    另一件事是、何时将帧传输到 CPPI RAM? 这是否应该是发送前的最后一步??

    此致、

    哈希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想、由于某种原因、在我用指向缓冲区描述符的指针更新 TXnHDP 寄存器后、数据不会写入 CPPI RAM 中。 我是否缺少一些东西来使 DMA 正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在 MACINVECTOR 寄存器的 TXPEND 域中看到了中断标志?

    当 EMAC 完成数据包的传输时,EMAC 会在将数据包的最后一个缓冲描述符地址写入相应通道队列的传输时向 CPU 发出中断(通过 EMAC 控制模块)
    位于状态 RAM 块中的完成指针。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否未设置。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现我从 MACSTATUS 寄存器中得到"零缓冲器长度"错误。 我将空链接列表初始化为 CPPI RAM 中的列表、然后在将地址写入 TXnHDP 寄存器之前用数据填充该列表。 这是正确的吗?
    此致、
    哈希
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、还有一件事、MACSTATUS 寄存器中的 IDLE 位不会置为无效。 我在 CCS 中看到、启用广泛转换后、它会被置为无效、而 EMAC 不会处于空闲状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、很方便、

    TMS570LC4357是一款大端字节序器件、因此应轻扫写入 TXnHDP 的描述符。 CCS 工程具有 if-else、可根据器件名称混合数据。

    如果 IAR 没有_rev ()函数、请使用以下函数进行替换(这是我的代码供您参考):  

    int swizledata (int indata)

     #if ((__little_endian__= 1)||(__little_ENDIAN__= 1)
      return (indata);
     #else //大端字节序
      int outdata=0;
      outdata =((indata&0xFF)<<24)|((indat&0xFF00)<<8)|((indata&0xFF0000)>8)|(((indat&0xFF000000)>>24);
      返回(outdata);

     #endif

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

    您好 QJ、

    我认为器件在字节序方面配置正确。 我可以看到 MACSTATUS 寄存器中的 IDLE 位是导致问题的原因。 我将 IAR 中执行的 EMAC、MDIO 和 IOMM 的初始化步骤复制到 CCS 中、一切正常。 我似乎缺少其他东西、可能与 EMAC 模块的时钟有关? 我已经看到它正在使用我已经启用的 vclk3。 是否有方法测试它是否正常运行?

    哈希

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

    我认为时钟设置应该可以、因为它在 CCS 中工作。 寄存器的读取和写入不使用混合函数。 请仔细检查 CPPI RAM 以确保数据包数据采用正确的字节序格式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我已经检查了 cpi ram、endiannes 是可以的。 我认为主要问题是、在 CCS 上运行时、IDLE 位被清零、表示 EMAC 不空闲。 在 IAR 上、IDLE 位保持为1并且从不清零。 EMAC 的空闲状态是否意味着它不工作? 我在数据表中找不到相关信息、

    此致

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

    经过大量调试后、我发现问题所在。 在 CCS 中、我可以看到寄存器 PINMMR25[0:7]和 PINMMR29[24:31]都设置为零、但我没有这样做、因为数据表中的 EMAC 模块部分中没有提到这一点。 我将其设置为零、最后我将获取数据包。
    感谢您的帮助、
    哈希