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.

[参考译文] TMS320C6678:C6678偶尔无法与以太网通信

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/630594/tms320c6678-c6678-occasionally-cannot-communicate-with-ethernet

器件型号:TMS320C6678

你(们)好

我使用带有 C6678的定制板和88e1111作为桥接模式(SGMII 至 RGMII)。

我想向您询问以太网和 MAC_STATUS_register。

我正在尝试使用以太网连接到电路板。
通常可以使用 tftp 等进行通信、
但有时甚至 ping 响应也不会返回。
其概率为每10到20次加电/断电周期一次

我检查了以太网相关寄存器。
我发现 MAC_STATUS_REGISTER 已更改。
(SGMII、MDIO、SERDES 寄存器不变)

通常情况下、该值为0x8000008、其中我确认了 ping 的响应。
当无法与 ping 通信时、它将更改为0x00000008。
但是、我不访问代码上的 MAC 相关寄存器。

您能告诉我发生这种情况的原因是什么以及我如何解决这种情况吗?

谢谢你。

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将对此进行研究。 反馈将发布在此处。

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

    您正在运行哪个 SDK 版本?

    一般情况下
    0x8000008表示:
    位31被置位=> 1 = MAC 处于空闲状态=> MAC 不处理任何东西。
    位3被置位=>外部全双工。 这是 EXT_FULLDUPLEX 输入位=>启用全双工模式的值。

    如果您无法 ping 通电路板、则表示您启用了全双工模式且 MAC 处于忙状态(活动状态):
    位31为0 = MAC 未处于空闲状态。

    我正在运行您的定制裸机示例、您能否发布您的项目?

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

    抱歉、我们的项目无法发布。
    SDK 版本为"processor_sdk_rtos_c667x_3_01_00_06"。

    我确认在调用 BIOS_start()后 MAC_STATUS 值发生了变化。
    我使用的是 SYS/BIOS 6.45.1.29。

    是否有类似的报告?


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

    你(们)好

    我发现了有关该问题的新信息。

    当 NC_NetStart 函数调用 NetIPAddr 时、

    MAC_STATUS 的值始终更改为0x00000008、位于 NetIPAddr 顶部。

    在我可以连接到 DSP 的情况下、

    在 NetIPAddr 的下一步中、它更改为0x800008。

    但是、该值有时不能从0x00000008更改、

    这似乎是原因之一。

     

    我认为 NC_NetStart 会出现问题、但我不理解。

     

    请帮帮我。

     

    谢谢。

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

    我已通知软件团队。 他们的反馈将在此处发布。

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

    "NC_NetStart"=== >您是否为此使用 NDK 封装? 这是什么版本? 您是否运行示例 NIMU_emacClientExample_EVMC6678C66BiosExampleProject 或您的示例是如何运行的? 您使用了 PHY、因此 C6678的 SGMII 设置为从模式、并在? 1Gbps 完全开脱罪责?

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

    我在此项目中使用 ndk2.24.03.35。

    不过、我还没有通过该示例确认、
    在我的项目中、当我尝试将 MAC 连接到 MAC 时
    DSP 处于 MasterMode。
    它还具有100M 全双工和自协商功能。

    这是正确的方法吗?

    我的定制板由 DSP 88e1111组成。
    DSP 通过 SGMII 连接到88e1111、
    其信号使用 RGMII 桥接模式转换为 RGMII 信号。
    然后、它连接到以太网交换机 IC。

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

    它看起来 DSP 使用100 MB 双工和主模式、如果您有链路、应该可以。 在工作和故障情况下、您是否看到 MDIO 活动状态和链路寄存器的任何更改?

    我们这里的 EVM 是连接到 PHY 的 SGMII 端口、具有1Gbps 从模式+自动协商功能。 在我给卡上电后、MAC_STATUS 为0。 然后有一个 GEL 文件用于初始化 SGMII 和 SerDes、MAC_STATUS 更改为0x8100_0018。 MAC 已空闲。

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

    你(们)好

    到目前为止,我还没有解决这个问题。

    在工作和故障情况下、
    MDIO_ALIVE 寄存器和 MDIO_LINK 寄存器指示无错误:
    CSL_MDIO_isPhyAlive (phyAddr)和 CSL_MDIO_isPhyLinked (phyAddr)返回的值为1。

    我还直接检查和读取 MDIO 寄存器(活动:0x02090308、链接:0x0209030C)
    并确认 MDIO 以及 SGMII_Status 和88E111111_register 在这两种情况下都不会改变。

    我不明白为什么 MAC_STATUS 会被固定为 BUSY、以及是什么使它成为 BUSY。
    因此、我怀疑各种因素。

    我想知道的一个示例是、
    在 NDK 内容/nettools/config/config.c 中、
    _CfgEntryProcess ()不会返回,因为“returncode =PC->pCbService[PE->Tag-1](PC、PE->Tag、PE->Item、op、PE)”线剂量没有完成。
    它是否正常工作?

    此致。

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

    在运行任何代码之前、什么是 MAC_STATUS? 它是否忙?

    "我发现了新的问题。

    当 NC_NetStart 函数调用 NetIPAddr 时、

    MAC_STATUS 的值始终更改为0x00000008、位于 NetIPAddr 顶部。"

    您是指 NC_NetStart--> NS_BootTask--> CfgSetService(),哪一个回调没有返回? MAC_STATUS 如何与函数返回或不返回相关?

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

    你(们)好

    如果回调不相关、则没关系、谢谢。

    顺便说一下、在 NC_NetStart 之前、MAC_STATUS 值似乎是0x800008 (非繁忙)。
    我发现 Nimu 似乎是更改 MAC_STATUS 的原因。
    NIMU_qmsQPush 之后(gPaTxQHnd[8]、pCpiDesc、dataBufferSize、Size_HOST_DESC、Qmss_Location_tail); 在尼姆伊姆斯特德,
    状态更改为0x8、之后保持为0x8。 这是我遇到问题的时候。

    我认为 Cppi_setPSFlags 会评估某个内容、然后它会将 MAC_STATUS 更改为 BUSY、但我不理解。
    根据上面的注释 qmsQPush、

    /*将数据包从 Mac 发送出去。 如果是 Mac/开关、它将回路到 PA

    *已正确配置
    *

    我知道、如果 MAC 设置错误、就无法与以太网通信。
    但它仅在有时发生。

    什么参数是相关的? 您认为这会发生什么情况?
    请帮帮我。

    此致

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

    您好!

    我能够解决这个问题。

    我在 Nimu_eth.c 的 Init_MAC()中进行了以下更改
    正如我在上一个帖子中提到的、它是100M/Fullduplex 设置。

    CSL_CPGMAC_SL_enableFullDuplex (macPortNum);
    CSL_CPGMAC_SL_enableGMII (macPortNum);
    /CSL_CPGMAC_enableGigabit (macPortSL);
    CSL_CPGMAC_SL_disableGigabit (macPortNum);
    /CSL_CPGMAC_enableControl (macPortNum);
    CSL_CPGMAC_SL_disableExtControl (macPortNum);
    

    我有一些问题。

    在 SGMII 的初始设置中、
    ADV_ability 寄存器和与 SGMII 相关的寄存器已正确完成、
    并且自动协商也成功完成。

    在 MAC_STATUS 寄存器中、
    "EXT_GIG"位表示0、"EXT_FD"位表示1
    在故障情况和工作情况下都是如此。
    (这显示了 FULLDUPLEX_IN 和 GIG_IN 的状态、剂量不是吗?)

    以下所有命令在原始设置中返回 true、
    不仅处于正常状态、还处于异常状态。
    因此、我确信这些设置正确。

    CSL_CPGMAC_SL_isExtControlEnabled ()
    CSL_CPGMAC_SL_isFullDuplexEnabled ()
    CSL_CPGMAC_SL_isGigabitEnabled ()
    

    尽管启用了 ExtControl、
    我认为 MAC 不适用于 EXT_GIG 和 EXT_FD。

    这是 MAC 外部控制错误、和
    如何检查 MAC 的工作模式?

    SGMII 的初始化代码如下所示。

    CSL_SGMII_startRxTxSoftReset (macPortNum);
    // CSL_SGMII_disableMasterMode (macPortNum);
    CSL_SGMII_enableMasterMode (macPortNum);
    CSL_SGMII_maceAutoNegotiation (macPortNum);CSL_SGMII_enableRxPortNum (macPortNum)
    ;CSL_MacRendSoftTxTxTxTxReset);
    
    /*为此端口设置通告的能力寄存器:
    *(1)启用全双工模式
    *(2)启用自动协商
    *(3)启用链路
    */
    sgmiiCfg.linkSpeed = CSL_SGMII_100_Mbps;
    sgmiCfg.GMexMode = CSL_SGMII_FULL_DUPLEX;
    sgmiCf_S = sgmiCfg_DIP_S;sgmiLink_1 = sgmiCfg_ad&sgMII
    ;sgmiLink_adportality1;sgmiLink_miLink_ad
    
    执行
    {
    CSL_SGMII_getStatus (macPortNum、&sgmiStatus);
    if (waitcn++>10000000){
    platform_write ("SGMII is not linked up!!!!!!\n");
    platform_write ("halt start up\n");
    while (1);
    }
    while (sgmergiPortII is not link/isdegr\n
    
    );
    
    if sgmibngsmituLinkStatus=完成!
    
    
    (sgsmibng_isng_isuLinkNum!);//返回 Ismibng_rg_rgsmibuLinkNum! /*这是一个错误条件*/
    } while (sgmiiStatus.bIsAutoNegComplete != 1);
    


    我认为这与以下帖子类似。
    e2e.ti.com/.../168148


    此致。

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

    很高兴知道问题已通过设置解决:
    禁用千兆位模式并禁用 ext_en。 这些是 MAC_CONTROL 寄存器。

    代码更改后、MAC_CONTROL 寄存器的位7 (gig)和位18 (EXT_EN)是多少? 它们都是零吗? 什么是位0 (FULLDUPLEX)、它是1?

    然后、下面的函数只需读取 MAC_CONTROL 位、它们如何都成立?
    CSL_CPGMAC_SL_isExtControlEnabled ()
    CSL_CPGMAC_SL_isFullDuplexEnabled ()
    CSL_CPGMAC_SL_isGigabitEnabled()

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

    您好!

    我们使用 CSL 函数实现了这些命令来读取设置值、
    然后、我们直接从指针地址读取这些值。
    我们确认位18 (EXT_EN)和位7 (gig)已更改、
    并且位0 (FULLDUPLEX)保持为零。

    之前(工作):
     mac0:全双工
     mac0:GMII 启用
     mac0:千兆位启用
     mac0:ExtControl 启用
     mac0:RxCSF 启用
     mac1:全双工
     Mac1:GMII 启用
     mac1:千兆位启用
     mac1:ExtControl 启用
     mac1:RxCSF 启用
     MAC0control REG-READ:add= 2090904,value= 8400a1
     MAC0status reg-read:add= 2090908,value= 8000000
     MAC1control reg-read:add= 2090944,value= 8400a1
     MAC1status reg-read:add= 2090948,value= 800008

    之前(失败):
     mac0:全双工
     mac0:GMII 启用
     mac0:千兆位启用
     mac0:ExtControl 启用
     mac0:RxCSF 启用
     mac1:全双工
     Mac1:GMII 启用
     mac1:千兆位启用
     mac1:ExtControl 启用
     mac1:RxCSF 启用
     MAC0control REG-READ:add= 2090904,value= 8400a1
     MAC0status reg-read:add= 2090908,value= 8000000
     MAC1control reg-read:add= 2090944,value= 8400a1
     MAC1status reg-read:add= 2090948,value= 8

    之后:
     mac0:全双工
     mac0:GMII 启用
     mac0:千兆位禁用。 10/100M 使能
     mac0:ExtControl 禁用
     mac0:RxCSF 启用
     mac1:全双工
     Mac1:GMII 启用
     mac1:千兆位禁用。 10/100M 使能
     mac1:ExtControl 禁用
     mac1:RxCSF 启用
     MAC0control reg-read:add= 2090904,value= 800021
     MAC0status reg-read:add= 2090908,value= 8000000
     MAC1control reg-read:add= 2090944,value= 800021
     MAC1status reg-read:add= 2090948,value= 800008


    此外、我们还找到了以下两种替代解决方案。

    1)

    CSL_CPGMAC_SL_enableFullDuplex (macPortNum);
    CSL_CPGMAC_SL_enableGMII (macPortNum);
    /CSL_CPGMAC_enableGigabit (macPortSL);
    CSL_CPGMAC_SL_disableGigabit (macPortNum);CSL_CPGMAC_enableSL (macPortNum)
    ;macPortExtControl;macPortExtNum) 

    2)

    CSL_CPGMAC_SL_enableExtControl (macPortNum);//first enableExtCtrl
    CSL_CPGMAC_SL_enableFullDuplex (macPortNum);
    CSL_CPGMAC_SL_enableGMII (macPortNum);
    CSL_CPGMAC_SL_enableGBIT (macPortMAC);CSL_enableGMAC_enableControl
    ;(macPortNum)
    

    在这两种情况下、MAC_CONTROL 寄存器都设置为所需的值、

    在超过100次重新启动检查时未发生网络故障。

    考虑到2种情况、
    首先设置 ExtControl,然后设置 FullDuplex 和 Gigabit。
    因此,对于 enableExtControl,应将其设置为10/100M,而不应启用千兆位。

    但是、在默认情况下、
    首先设置双工和千兆位、然后设置 ExtControl、
    因此、外部信号设置为10/100M、但它暂时具有千兆位设置。

    我认为这有时可能会导致网络问题。

    您认为这是个问题吗?
    如果配置不是千兆位、
    它是否取决于 ExtControlll 设置值?
    它是否需要使用 DisableGigabit 功能设置10/100M 设置?


    此致。

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

    您好!

    我找到了另一种解决方案。

    它将在以下命令的末尾运行 CSL_CPGMAC_SL_enableGMII()。

    CSL_CPGMAC_SL_enableFullDuplex (macPortNum);
    /CSL_CPGMAC_SL_enableGMII (macPortNum);
    CSL_CPGMAC_enableGigabit (macPortSL);
    CSL_CPGMAC_SL_enableExtControl (macPortNum);CSL_CPGMAC_enableGMAC_enableGSL
    (macPortII); 

    根据 MAC_CONTROL 寄存器中 GMII_EN 的说明、

    0表示"GMII 接收和发送"的复位状态、1表示其复位释放状态。

    我认为在每个设置之后应该释放复位。

    此外、当 MAC_STATUS 卡在"繁忙状态"中时、

    我发现有必要暂时禁用 GMII_EN、然后将其设置为启用以解决此问题。

    Mac_STSATUS 指示"idle_state"、在这种情况下工作正常。

    因此、我认为 MAC 进入忙状态的原因是"GMII 接收和发送"异常。

    我认为最好在初始化序列结束时设置 GMII_EN。

    你怎么看?

    此致。

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

    您好!

    很抱歉耽误你的回答! 您提到这是 TI SGMII 至88E1111 SGMII 连接、而 TI SGMII 是具有自动协商功能的主器件。

    在我们的驱动程序代码中、我们使用连接到 EVM PHY 的 SGMII、其中 PHY 是主器件、TI SGMII 是具有自动协商功能的从器件。  我们首先调用 init_SGMII(),然后调用 init_mac()。 您在 init_mac()函数中展示了几种解决此问题的方法。 我不确定您是否正确修改了 init_SGMII(),请检查 TI KeyStone 架构千兆位以太网(GbE)交换子系统 UG 2.4.3。 如果您将 TI SGMII 设置为主器件、我假设您将其设置为具有全双工的100Mbps、我不知道为什么您必须设置 EXT_EN 以实现稳定连接。 请参阅2.4.3.3.1、"在 MAC 模块中、用户可以选择设置 MAC_CONTROL 寄存器中的 EXT_EN 位、以便通过 SGMII 信号设置速度和双工模式。" 您能否通过查看 SGMII_CONTROL 和 MR_ADV_ANability 寄存器来仔细检查 TI SGMII 是否为主器件?

    此致、Eric

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

    您好!

    我知道 EXT_EN 位的设置是可选的。
    但是、所提供的驱动程序的 EXT_EN 处于打开状态。
    我认为您正在打开 EXT_EN 以实现多功能性、但它可能无法正常工作。

    考虑到我显示的一些代码、我认为当通过外部控制切换运行模式和复位后 GMII_EN 释放时、可能会发生异常。
    即使外部控制打开、当操作模式切换未发生时、也不会变得异常。

    根据您的建议、此问题的结论将 MAC 驱动程序修改为"EXT_EN 为 OFF、100Mbps 和全双工设置"。
    我还确认在修改前后两种情况下、"TI SGMII"都设置为主器件。

    我想知道以下几点。
    这是否意味着需要用户直接修改 PDK 库代码?
    这是否意味着未经修改不得使用 PDK 库?

    此致

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

    感谢您的反馈并检查您的代码中的 TI SGMII 确实处于主模式。 TI PDK Nimu 驱动程序和 PA 示例基于 TI EVM、其中 SGMII 以1000Mbps 的设置连接到 PHY。 您与另一个 SGMII 的连接速率为100Mbps、您需要修改代码并重新构建。

    此致、Eric