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.

[参考译文] TMDSCNCD28388D:将示例 enet_lwip_udp 转换为使用具有相同 PHY 但位于定制电路板上的 RMII

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1258614/tmdscncd28388d-converting-example-enet_lwip_udp-to-use-rmii-with-same-phy-but-on-custom-board

器件型号:TMDSCNCD28388D
主题中讨论的其他器件:TMDSHSECDOCK、C2000WARE、 TMS320F28386S-Q1

使用的 TI 开发套件:
带 TMDSHSECDOCK 的 TMDSCNCD28388D

使用的 C2000Ware:
C2000Ware_4_03_00_00

使用的 TI 示例工程:
driverlib\f2838x\examples\cm\Ethernet\ccs\ethernet_c28x_config.projectspec
libraries\communications\Ethernet\third_party\lwip\examples\enet_lwip_udp

我们的定制电路板微控制器:
TMS320F28386S-Q1 (F28386S)

我们的定制电路板 PHY:
DP83826ERHB


我们的电路板使用 F28386S MCU 和 TI DP83826ERHB PHY。 它旨在使用 RMII 以太网。

在 TI 开发板套件上成功对 TI 示例进行首次训练后、我尝试修改
在我们使用 F28386S 的定制电路板上工作的相同示例具有相同的(?) 使用 RMII 以太网的 PHY
配置。 修改后的示例不起作用。 我包含 CCS 工作区的 zip 文件。

在我们的电路板上、CPU1 C28x 程序在由于时钟配置错误而自行停止之前部分运行。
它在项目"device.c"行115的 device_init ()中的 if-block 内的 ESTOP0处停止。

该代码注释指出检查以验证晶体频率仅适用于 XTAL 作为 PLL 源。
电路板设计人员告诉我、我们使用振荡器2作为内部源、而不是 XTAL、因此我
符号 DEVICE_setclock_config 添加至 device.h 第236行中的#define、并在 CCS 中按住 Control 并点击。
在这里、我指出了与时钟和时钟源相关的几个问题、这些问题必须更改
与我们的板相匹配。

我进行了一些更改、前提是我应该保持200MHz SYSCLK 频率和125MHz 辅助时钟。

所做的更改:

文件"device.h"(项目"Ethernet_C28x_config"):

(第230行)
我首先将第230行上的 DEVICE_OSCSRC_FREQ #define 从25000000U 更改为10000000U。
因为我的电路板设计人员告诉我、内部 OSC2时钟在10 MHz 处运行、我们使用它
而不是外部振荡器。

(第236行)
#define DEVICE_setClock_CFG (SysCtl_OSCSRC_ XTAL | SYSCTL_IMULT (32) |\
SYSCTL_REFDIV (2)| SYSCTL_ODIV (2)|\
SYSCTL_SYSDIV (1)| SYSCTL_PLL_ENABLE |\
SYSCTL_DCC_BASE_1)

已更改为使用 OSC2、如下所示(请注意更改了 IMULT 值以保持200MHz SYSCLK 频率):

#define DEVICE_setClock_CFG (SysCtl_OSCSRC _OSC2 | SYSCTL_IMULT (80) |\
SYSCTL_REFDIV (2)| SYSCTL_ODIV (2)|\
SYSCTL_SYSDIV (1)| SYSCTL_PLL_ENABLE |\
SYSCTL_DCC_BASE_1)

然后、我针对符号 DEVICE_SYSCLK_FREQ 更改了下一个#define、以使对 SYSCTL_IMULT 的更改匹配
以上、以便保持200MHz:

(第245行)
#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 32 )/(2 * 2 * 1)

已更改为:

#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 80 )/(2 * 2 * 1)

(第252行)
我保留了符号 DEVICE_LSPCLK_FREQ 的定义、假设50MHz 仍适用
(但我真的不知道)。

对于 AUXCLK、我进行了类似的更改、以调整内部时钟频率、并保持
AUXCLK 为125MHz:

(第258行)
#define DEVICE_AUXSETCLOCK_CFG (SYSCTL_AUXPLL_OSCSRC_ XTAL | SYSCTL_AUXPLL_IMULT (40) |\
SYSCTL_REFDIV (2U)| SYSCTL_ODIV (4U)|\
SYSCTL_AUXPLL_DIV_1 | SYSCTL_AUXPLL_ENABLE |\
SYSCTL_DCC_BASE_0)

改为使用 OSC2、就像这样(请注意对 IMULT 进行的更改、以便维持125MHz AUXCLK 频率)

#define DEVICE_AUXSETCLOCK_CFG (SYSCTL_AUXPLL_OSCSRC _OSC2 | SYSCTL_AUXPLL_IMULT (100) |\
SYSCTL_REFDIV (2U)| SYSCTL_ODIV (4U)|\
SYSCTL_AUXPLL_DIV_1 | SYSCTL_AUXPLL_ENABLE |\
SYSCTL_DCC_BASE_0)

然后、我更改了符号 DEVICE_AUXCLK_FREQ 的下一个#define、以便与 SYSCTL_AUXPLL_IMULT 的更改相匹配
以上、以便保持125MHz:

(第267行)
#define DEVICE_AUXCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40 )/(2 * 4 * 1)

已更改为:

#define DEVICE_AUXCLK_FREQ ((DEVICE_OSCSRC_FREQ * 100 )/(2 * 4 * 1)

在进行这些与时钟相关的更改后、我重建了示例、再次加载并运行了两个程序。

我运行 CPU1程序、然后是 ARM 程序。 这一次、CPU1软件运行到完成(就像它在
TI 开发板)、但每次从 Windows 执行 Ping 操作都会失败(请求超时)。

当我暂停 C28x 程序时,我发现它在 exit.c:95处处于 abort()中,在 exit.c:80处由 exit()调用。
这是预料之中的,因为程序在 main ()中到达了它的退出大括号。

当我暂停 CM 程序时,我看到它在 Ethernet.c:3113的 Ethernet_resetModule()中。
(在 Ethernet.c:733处通过 Ethernet_initInterface 调用、在 enet_lwip_udp.c:595处由 Ethernet_init 调用、
main()调用

经过一些调查、我发现在 TI 电路板上使用"MII"方法来实现以太网、但
使用 RMII 架构的特性。 我读了一些关于两者之间的差异。 我看到了
我需要更改示例中的其他代码。 接下来、我尝试进行必要的更改...


尝试重新配置 RMII (而不是默认的 MII)以太网的代码:

1.项目"enet_lwip_udp"、源文件"enet_lwip_udp.c"

在这里我把 Ethernet_init():566修改为使用
分配 phyMode 时以太网_SS_PHY_INTF_SEL_RMII 取代了 ETHERNET_SS_PHY_INTF_SEL_MII、如下所示:

initInterfaceConfig.phyMode = Ethernet_SS_PHY_INTF_SEL_RMII;// jct RMII

我还在其后面添加了这一行:

initInterfaceConfig.clockSel = Ethernet_SS_CLK_SRC_external;//jct RMII

工程"Ethernet_C28x_config"、源文件"cm_common_config_C28x.c":

我的电路板设计人员提供了我们的电路板用于带有 RMII 的以太网的引脚:

以太网
MDC GPIO42  
MDIO GPIO43
RX_ER GPIO76
TX0 GPIO75
TX1 GPIO74
REF_CLK GPIO73
RX1 GPIO72
RX0 GPIO71
CRS_DV GPIO70
TX_EN GPIO69

RMII_INRPT GPIO68
PHY_RESET GPIO67

main()函数使用 GPIO_setPinConfig()为 MII 分配特定引脚
以太网和这些引脚不同于我的电路板设计人员在电路板上提供的(为 RMII)。

因此,在源代码行95和129 (在 main()中)之间,我更改了 GPIO_setPinConfig ()调用以使用
引脚编号、由我的电路板设计工程师为我们电路板的 RMII 以太网提供。

第131-136行是一系列"使外部 PHY 退出掉电"的语句、
第138-144行是一系列针对"使外部 PHY 退出复位"的语句。

我的电路板设计人员有一条从 GPIO 68到 PHY 的 PWRDN/INT 引脚的线、因此我更改了引脚
在第131-136行中将数字从 GPIO 108更改为 GPIO 68。 该示例中的注释指出这是
将该引脚驱动为高电平、使外部 PHY 退出断电状态。

我的电路板设计人员将以太网的 PHY_RESET 显示为 GPIO67 (不是示例中使用的 GPIO 119)、
我将第138-144行中的引脚从 GPIO 119更改为67。 该示例中的注释指出这是
将该引脚驱动为高电平以使外部 PHY 退出复位状态

完成上述更改后、在软件运行时、仍然无法对电路板执行 Ping 操作。 该器件的主要
该示例的循环执行、但绝不会进入其 if-BLOCK、因为无法通过以太网访问电路板
(客户端无法通过 UDP 连接到它)。 是否需要对示例进行其他(或不同)更改?
如果没有、那么可能是因为我们的电路板有设计缺陷、或者 PHY 没有向我们发送时钟。 我相信 PHY
是与我们使用的 TI 开发板所用的器件型号相同的器件型号(该未修改/MII 示例适用于
该板)。 如果此代码看起来正确、接下来我应该探索哪些途径?


e2e.ti.com/.../TiSupport.zip

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

    您好!  

    是否能够读写 PHY 寄存器?  PHY 也必须配置为 RMII 模式。   

    请参阅位于以下位置的 C2000Ware 内提供的示例 ethernet_ex2_phy_loopback: driverlib\f2838x\examples\cm\Ethernet\ccs。  这将读取 PHY 寄存器并将其配置为 MII 模式。   同样,您必须将 PHY 配置为 RMII 模式。  

    此外、确保 RMII 接口信号已正确配置、

    如果要将 ENET_RMII_CLK 配置为外部时钟、则 PHY/外部器件应提供时钟。

    此致

    西达尔特

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

     正如您所指出的、Siddharth 以太网_ex2_phy_loopback"示例对 PHY 寄存器进行读取和写入。 不过、那仅用于为该测试设置环回模式、似乎与将 PHY 配置为 RMII 模式无关。  在我的应用中、我不希望数据包环回。  我希望 PHY 传输传出的数据包。 对于必须为 RMII 准备的 PHY 寄存器、是否有其他内容?  从您所指的示例来看,几乎没有涉及到 RMII (相对于 MII )配置: main ()中有一行用来设置 initInterfaceConfig.phyMode。  我已经在我自己的代码中更改了这样的行、以便为该字段分配 RMII 值:  

    initInterfaceConfig.phyMode = Ethernet_SS_PHY_INTF_SEL_RMII;

    如上所述,我的原始帖子在编号1下。  我也这样做了:

    initInterfaceConfig.clockSel = Ethernet_SS_CLK_SRC_external;  

    是的、我们计划使用来自 DP83826ERHB PHY 的时钟。  

    如上所述、在我的 C28x 代码中、我根据电路板原理图为 RMII 配置了引脚(大概就是我想要的)。  请查看上面第2行中所述的代码行中我更改的内容。  

    我理解您的观点、任何连接到微控制器的 PHY 都需要设置寄存器、以实现所需的任何非默认配置。

    我有一份来自 TI 站点的 TI PHY  DP83826ERHB 的文档:"https://www.ti.com/lit/ds/symlink/dp83826e.pdf?ts = 1692824765093&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FDP83826"

    我将仔细学习有关 RMII 模式寄存器设置的任何内容。  这是与您引用的示例中引用的 PHY 接近的器件型号、但我注意到它并不相同。 再说一次、我在您引用的示例中没有看到任何与针对 RMII 配置的 PHY 的寄存器写入相关的内容、因此我对您在这方面的答复感到困惑。

    [编辑]下午8时24分]-  

    今天晚些时候、8/24查看上面链接的 PHY 文档后、我看到我们的板使用"引脚自举"配置一些 PHY 功能、而无需写入 PHY 寄存器。 例如、PHY 引脚1短接至 GND、这意味着我们的 PHY 处于"基本模式"。  在基本模式下、管脚21只用于发出中断、根本不起 PWRDN 的作用。 因此、我从示例中添加了代码内容、此代码尝试通过置位该引脚使 PHY 脱离"断电"状态。  此外、我们的开发板在引脚18上使用 STRAP4以将 PHY 配置为 RMII 模式。 所以、是的、PHY 已经配置为 RMII 模式。  我已经为 RMII 信号设置了引脚复用(如上面的注释所示)。  代码运行后仍然没有 Ping 操作。   

    回顾完我所做的工作和介绍后、我在使用 RMII 模式而不是 MII 的软件配置中缺少什么(如果有的话)?  我在软件中所做的事情是否有任何缺失或错误会阻止 ping 操作或调用我的回调?

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

    如我的8月24日博文中所详述、该电路板使用"引脚自举" 在硬件中的基本模式下并针对 RMII 以太网配置 DP83826ERHB PHY。  

    如之前所述、我的代码 为 RMII 和外部 PHY 时钟设置 phMode:

    initInterfaceConfig.phyMode = Ethernet_SS_PHY_INTF_SEL_RMII;

    initInterfaceConfig.clockSel = Ethernet_SS_CLK_SRC_external;

    我使用了您引用的示例(Ethernet_ex2_phy_loopback)、其中使用了 C28x 项目设置来实现正确的 RMII 引脚分配等、并且 CM 项目分配 phyMode 和 clockSel。  在本示例中、读取 PHY 寄存器的语句返回0xFFFF、这似乎不正确。

    我无法看到缺少什么(如果有的话)。 对于我在软件中还能做些什么、您有什么想法吗?  或者、对于进一步的故障排除、您有什么想法吗?   

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

    您好!  

    是否有办法确认 PHY 配置正确?   您尝试读取哪个 PHY 寄存器? 。

    请读取  RCSR 寄存器以确定 PHY RMII 配置。   

    以下是供参考的代码片段。

    phyRegContent = Ethernet_readPHYRegister (EMAC_BASE、0x1);//Base、Address

    //
    // PHY 的地址0对应于基本模式控制寄存器(BMCR)
    //读取寄存器以了解状态
    //
    phyRegContent= Ethernet_readPHYRegister (EMAC_BASE、0);

    //
    // BMCR 的第12位配置自协商,将其关闭
    //
    phyRegContent &= 0xEFFF;
    //Ethernet_writePHYRegister (emac_BASE、0、phyRegContent);

    //
    //BMCR 的第8位用于配置双工功能-设置为全双工
    //
    phyRegContent |= 0x100;
    Ethernet_writePHYRegister (EMAC_BASE、0、phyRegContent);

    //
    //回读 BMCR 寄存器,确认正确配置
    //
    phyRegContent= Ethernet_readPHYRegister (EMAC_BASE、0);

    //在 RMII 和状态寄存器(RCSR)中将 PHY 配置为 RMII 模式
    phyRegContent= Ethernet_readPHYRegister (EMAC_BASE、0x17);

    phyRegContent |= 0x20;
    Ethernet_writePHYRegister (EMAC_BASE、0x17、phyRegContent);

    //
    //回读 RCSR 寄存器以确认正确配置
    //
    phyRegContent= Ethernet_readPHYRegister (EMAC_BASE、0x17);

    此外、还观察到您为 RMII 时钟选择外部时钟。  在这种情况下、 应为器件的 ENET_RMII_CLK 引脚提供所需的50MHz 时钟。

    此致

    西达尔特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有办法确认 PHY 配置正确?   您尝试读取哪个 PHY 寄存器? .[/报价]

    正如我在上一篇文章中提到的、我使用了您引用的示例(ethernet_ex2_phy_loopback)。  该示例读取 BMCR 寄存器。  读取该寄存器返回0xFFFF。  执行此操作的示例 main()的部分如下所示:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //
    //Low Frequency
    //value of 5 for selecting the slowest possible MDIO Clock
    //Clause 22 mode
    //
    Ethernet_configureMDIO(EMAC_BASE,0,5,0);
    //
    //The DP83822 External PHY in Control Card
    //takes a PHY address of 1 by default
    //Configure the MDIO module to use PHY address of 0x1
    //
    Ethernet_configurePHYAddress(EMAC_BASE,1);
    //
    //Address 0 of PHY corresponds to Basic Mode Control Register(BMCR)
    //Read the register to know the state
    //
    phyRegContent= Ethernet_readPHYRegister(EMAC_BASE,0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我看到您发布了一些关于使用 MDIO 来查询 PHY 配置的附加说明、我会将这些语句粘贴到示例中并执行它。  

    此外、我接下来与电路板设计工程师一起验证 PHY 是否将时钟信号发送到微控制器。

    之后我将立即在此处跟进提供结果。

    我添加了语句并执行了。 仿真结果如下。 左边空白处的十六进制数是每次执行可能会更改 phyRegContent 的值:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    0x0
    phyRegContent = Ethernet_readPHYRegister(EMAC_BASE,0x1); //Base,Address
    0xFFFF
    //
    //Address 0 of PHY corresponds to Basic Mode Control Register(BMCR)
    //Read the register to know the state
    //
    phyRegContent= Ethernet_readPHYRegister(EMAC_BASE,0);
    0xFFFF
    //
    //Bit 12 of BMCR configures the Auto-Negotiation - turn it off
    //
    phyRegContent &= 0xEFFF;
    0xEFFF
    //Ethernet_writePHYRegister(EMAC_BASE,0,phyRegContent);
    //
    //Bit 8 of BMCR configures the duplex capability - set to full duplex
    //
    phyRegContent |= 0x100;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    James:  

    EMAC 配置对我来说看起来是正确的。  如果 PHY 和 RMII 时钟配置正确,则应该可以正常工作。  

    请告诉我们您对时钟的观察结果。

    此致

    西达尔特

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

    感谢您评估 EMAC 配置。 我将告诉您我关于到微控制器的 PHY 时钟输出的发现。 我询问我的同事、我们是否可以探测信号。  但您指导我使用 MDIO 来检查 PHY 配置。 我的 PHY 寄存器读取操作总是返回0xFFFF、您觉得这是否错了?  什么原因会导致这种情况?  这在我看来不对。

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

    James:  

    寄存器总是返回0xFFFF 似乎不正确。   将请求 PHY 团队进行查看、看看是否缺少什么。

    此致

    西达尔特

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

    我期待 您或 PHY 团队 了解 MDIO、以便我们可以查看 PHY 寄存器。  在回答 您关于 PHY 时钟输出的问题时、我们已验证50 MHz 时钟是从 PHY 输出。 到目前为止、您已经检查了我的 EMAC 配置(看起来不错)、并且我们已经验证 PHY 输出了50 MHz 时钟。  对于 BMCR 和 RCSR 寄存器、读取 MDIO 串行接口将返回0xFF、我们认为这可能是不正确的。  这正是目前情况的所在。  你还有其他想法吗?

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

    您好、James:

    您能告诉我、是登记访问从一开始就不起作用、还是您刚刚失去了访问权限?

    您是否还能分享设计原理图?

    --
    此致、
    Gokul.

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

    你好,Gokul。  否、我还没有在电路板上看到 PHY 寄存器访问工作(从一开始就不工作)。  我们与 TI 签订了专利信息协议、因此我们能够以 非公开 论坛。  14年9月、我通过 Brad Caldwell (TI 处理器现场应用)申请召开会议(用于屏幕共享) 、以便我们能够与您的团队分享设计详细信息。  Caldwell 先生回答说:"我刚刚再次向我们的应用程序经理发出警报、提醒他注意这一点。 我问我们是否可以与专家通话、等待看到他的内容。 "我不会骗你的。"  我还没有听到 Brad Caldwell 关于设置电话的消息。  9月21日,我给他发了电子邮件,解释我们正在等待有关设置一个电话屏幕共享的消息。

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

    您好、James:

    要了解 MDIO 访问不可用的原因、我们需要检查

    1. MDC、MDIO 的电路或原理图、请参阅
    2. PHY 的运行状况(PHY 上电、上电时序等)

    我可以通过个人消息将我的电子邮件地址分享给您。 您可以通过电子邮件共享原理图。

    关于器件的运行状况、您能告诉我以下情况吗?

    1. 连接时、链路伙伴上是否存在可观察到的链路?
    2. 在硬件启动期间、是否有您或您的团队可以观察到的任何硬件运行良好的迹象?

    您能否进行以下捕获?

    1. 捕获1:
      MDI 线路上的信号(即 TD_P 和 TD_M)
      断开连接伙伴、并通过100 Ω 差分端接 TD_P 和 TD_M。
      使用差分探头探测 TD_P 和 TD_M 差分信号并捕获波形。

    2. 捕获2:
      寄存器访问完成时 MDC、MDIO 上的信号
      读取寄存器0x1并以单个快照捕获 MDC 和 MDIO 的波形、并将该波形放大以查看 MDC、MDIO 的边沿转换。

    如果上述两项捕获未产生结果、我们将查看上电时序和其他捕获。

    --
    此致、
    Gokul.