主题中讨论的其他器件: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 示例适用于
该板)。 如果此代码看起来正确、接下来我应该探索哪些途径?

