Part Number: TMS320F28384S
Other Parts Discussed in Thread: C2000WARE
1. 硬件与软件环境
-
芯片型号:TMS320F28384S(176引脚)
-
以太网PHY:LAN8720A,RMII模式,外部50MHz时钟(PHY提供)
-
开发环境:CCS 20.4.1,C2000Ware v6.00.01.00,FreeRTOS + lwIP
-
工程:CM核运行
enet_lwip_freertos例程,C28x核负责GPIO复用和时钟配置
2. 问题现象
-
网络通信不稳定,ping丢包严重(50%)。
-
调试发现
EMACSS_CTRLSTS寄存器(地址0x400C2004)被错误配置为0xA307(RevMII模式,外部时钟,密钥0xA3)。 -
正确配置应为 RMII模式(
PHY_INTF_SEL=4),外部时钟(CLK_SRC_SEL=0)。
3. 已定位的根本原因
-
Ethernet_getHandle函数内部调用了Ethernet_enableDmaInterrupt。 -
该函数在执行后将
EMACSS_CTRLSTS从0x8304(RMII)改为了0xA307(RevMII)。 -
进一步分析发现,驱动库中存在多处寄存器偏移宏定义错误:
-
ETHERNET_O_MAC_INNER_VLAN_INCL定义为0x64(正确),但实际写入时地址计算错误? -
但
Ethernet_enableDmaInterrupt应操作DMA_CH0_INTERRUPT_ENABLE(偏移0x1134),却写到了EMACSS_CTRLSTS(偏移0x2004)。 -
怀疑
base参数被错误传递为EMAC_SS_BASE(0x400C2000)而非EMAC_BASE(0x400C0000),或者ETHERNET_O_DMA_CH0_INTERRUPT_ENABLE在某些条件下被重定义为0x4。
-
4. 已尝试的修复方法(均无效)
-
直接在
Ethernet_init末尾强制写0x304(RMII+外部时钟,密钥0)。 -
保留高16位(当前密钥)仅修改低16位。
-
先清零再写正确值。
-
半字写入、位操作、写入其他测试值。
-
使用正确密钥
0xA5写入0xA50004。 -
所有尝试后寄存器值不变,仍为
0xA307或0x9007。
5. 疑问与求助
-
为什么
Ethernet_enableDmaInterrupt会错误写入EMACSS_CTRLSTS?是驱动库bug还是我们的工程配置问题? -
为何后续任何直接写
EMACSS_CTRLSTS的操作都无法改变其值?是否该寄存器被锁定或需要特定时序? -
请问官方是否有计划修复C2000Ware v6.00.01.00中的这些偏移错误?或者是否有已知的补丁/勘误?
-
除了修改驱动库源码,是否有其他方法(如通过C28x侧配置)可以强制锁定RMII模式?
6. 附件
-
关键代码片段:
Ethernet_enableDmaInterrupt调用处、Ethernet_init中的强制写入。 -
寄存器截图:
0x400C2004在执行前后的值变化。 -
hw_emac.h中相关宏定义(确认正确)。 -
整个工程已经提供。
-
pInitCfg = Ethernet_initInterface(initInterfaceConfig); //这里能正确配置为RMII模式Ethernet_getHandle((Ethernet_Handle)1, pInitCfg, &emac_handle); //执行到这被改为了RevMII 模式。请尽快提供技术支持!谢谢!