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.

[参考译文] 编译器:DP83822i RMII 配置问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/868873/compiler-dp83822i-rmii-config-issue

主题中讨论的其他器件:TM4C1292NCPDTDP83822I

工具/软件:TI C/C++编译器

您好:

 我们在一个项目中使用 dp83822i,我们将83822配置为 RMII 模式 连接 tm4c1292ncpdt,,使用从模式。

 PHY 工作正常、但 MAC 不接收数据、也不接收中断

 PHY 100M 链路建立

时钟:

PHY Rx_d0:

  部分寄存器值:

PHY_BMCR:0x00003100
PHY_BMSR:0x00007849
PHY_ID1:0x00002000
PHY_ANA:0x000001e1
PHY_ANLPA:0x00000000
PHY_ANER:0x00000004
PHY_CR1:0x00000000
PHY_PHYCR:0x00008021
PHY_CFG2:0x00000100
PHY_FLDS:0x00000000
PHY_PHYSTS:0x00004002
PHY_RCSR:0x000000e1
PHY_10BOSCH:0x00000000
PHY_COMPT:0x00002001
PHY_FLDS:0x00000000
PHY_CR2:0x00000100
PHY_LDCTRL:0x00009fcf
PHY_EEECFG2:0x00000302
PHY_MLEDCR:0x0000002b
PHY_IOCTRL1:0x00000001
PHY_LEDCFG1:0x00000851
PHY_PHYSTS:0x00000715
PHY_PHYSCR:0x0000010b


MAC_EMACCC:0x00010000
MAC_EMACPC:0xC0000000
MAC_EMACPP:0x00000100

硬件 接口:

PHY 到 MCU

TX_EN

TX_d0

TX_D1

RX_dv

RX_d0

RX_D1

MDC

MDIO

时钟:

                       50MHz

晶体--- CDCE913PW -------- LMK00804BQWRGTTQ1 ---   PHY XI

        ----   MCU ref_clk

MCU 初始化代码:

uint8_t pui8MACArray[8]={0xAC、0xDE、0x48、0x00、0x80、 0x00};

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);

ROM_GPIOPinConfigure (GPIO_PG7_EN0RXDV);
ROM_GPIOPinConfigure (GPIO_PQ5_EN0RXD0);
ROM_GPIOPinConfigure (GPIO_PQ6_EN0RXD1);
ROM_GPIOPinConfigure (GPIO_PG3_EN0TXEN);
ROM_GPIOPinConfigure (GPIO_PG4_EN0TXD0);
ROM_GPIOPinConfigure (GPIO_PG5_EN0TXD1);
ROM_GPIOPinConfigure (GPIO_PF2_EN0MDC);
ROM_GPIOPinConfigure (GPIO_PF3_EN0MDIO);
ROM_GPIOPinConfigure (GPIO_PK4_EN0INTRN);
ROM_GPIOPinConfigure (GPIO_PM4_EN0RREF_CLK);

GPIODirModeSet (GPIO_PORTG_base、GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7、GPIO_DIR_MODE_HW);
GPIODirModeSet (GPIO_PORTQ_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3、GPIO_DIR_MODE_HW);
GPIODirModeSet (GPIO_PORTF_BASE、GPIO_PIN_2 | GPIO_PIN_3、GPIO_DIR_MODE_HW);
GPIODirModeSet (GPIO_PORTK_base、GPIO_PIN_4、GPIO_DIR_MODE_HW);
GPIODirModeSet (GPIO_PORTM_BASE、GPIO_PIN_4、GPIO_DIR_MODE_HW);

GPIOPadConfigSet (GPIO_PORTG_base、GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7、GPIO_FORMENT_8mA、GPIO_PIN_TYPE_STD);
GPIOPadConfigSet (GPIO_PORTQ_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_2 | GPIO_PIN_3、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
GPIOPadConfigSet (GPIO_PORTK_base、GPIO_PIN_4、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);
GPIOPadConfigSet (GPIO_PORTM_BASE、GPIO_PIN_4、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_EMAC0);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_EMAC0);

while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_EMAC0))




EMAPPHYConfigSet (EMAC0_BASE、EMAC_PHY_TYPE_EXTERNAL_RMII);
while (!SysCtlPeripheralReady (SYSCTL_Periph_EMAC0))



ROM_EMACReset (EMAC0_BASE);
while (!SysCtlPeripheralReady (SYSCTL_Periph_EMAC0))




EMACInit (EMAC0_BASE、120000000、EMAC_BCONFIG_TX_PRIORITY | EMAC_BCONFIG_Mixed_BURST |
EMAC_BCONFIG_DMA_PRIO_权 重2 | EMAC_BCONFIG_PRIORY_2_1、8、8、0);

ROM_EMACConfigSet (EMAC0_BASE、
(EMAC_CONFIG_FULL_DUPLEX | EMAC_CONFIG_CHECKSUM_OFFLOAD |
EMAC_CONFIG_7BYTE_PREAMBLE | EMAC_CONFIG_IF_GAP_96BITS |
EMAC_CONFIG_USE_MACADDR0 |
EMAC_CONFIG_SA_FTER_descriptor |
EMAC_CONFIG_BO_LIMIT_1024)、
(EMAC_MODE_RX_STORE_Forward |
EMAC_MODE_TX_STORE_Forward |
EMAC_MODE_TX_THRESHOLD_64_Bytes |
EMAC_MODE_RX_THRESHOLD_64_Bytes)、0);

InitDescriptors (EMAC0_BASE);

ROM_EMACAddrSet (EMAC0_BASE、0、(uint8_t *)&pui8MACArray);

while ((ROM_EMAPPHYREAD (EMAC0_BASE、EPHY_ADAR、EPHY_BMSR)& EPHY_BMR_LINKSTAT)== 0)

ROM_EMACFrameFilterSet (EMAC0_BASE、(EMAC_FRMFILTER_SADDR |
EMAC_FRMFILTER_PASS_MULTIPGAST |
EMAC_FRMFILTER_PASS_NO_CTRL);

ROM_EMACIntClear (EMAC0_BASE、EMACIntStatus (EMAC0_BASE、false));

ROM_EMACTxEnable (EMAC0_BASE);
ROM_EMACRxEnable (EMAC0_BASE);

ROM_IntEnable (INT_EMAC0);

ROM_EMACIntEnable (EMAC0_BASE、EMAC_INT_Receive);
ROM_EMACIntEnable (EMAC0_BASE、EMAC_INT_PHY);

G_psRxDescriptor[g_ui32RxDescIndex].ui32CtrlStatus |= DES0_RX_CTRL_own;

//
// LED_0配置
//

// 0101 =速度,100Base-TX 为高电平
EMACPHYExtendedWrite (EMAC0_BASE、EPHY_ADDR、EPHY_LEDCFG、0x2B);

//
// LED_1配置
//

// 1000 =链路正常/在 TX/RX 活动时闪烁
EMACPHYExtendedWrite (EMAC0_BASE、EPHY_ADDR、EPHY_IOCTRL1、0x1);

///-------------------------------------------------------
//初始化发送和接收 DMA 描述符。
///-------------------------------------------------------
空 InitDescriptors (uint32_t ui32Base)

uint32_t ui32Loop;

//
//初始化每个发送描述符。 请注意、我们保留自己的
//此处清除,因为我们尚未设置任何传输。
//
for (ui32Loop = 0;ui32Loop < NUM_TX_descriptor;ui32Loop +)

G_psTxDescriptor[ui32Loop ].ui32Count =
(DES1_TX_CTRL_SADDR_INSERT |
(TX_BUFF1_SIZE << DES1_TX_CTRL_BUFF1_SIZE);
G_psTxDescriptor[ui32Loop ].pvBuffer1 = g_pui8TxBuffer;
G_psTxDescriptor[ui32Loop ].DES3.plink =
(ui32Loop =(NUM_TX_descriptors - 1))?
G_psTxDescriptor:&g_psTxDescriptor[ui32Loop + 1];
G_psTxDescriptor[ui32Loop ].ui32CtrlStatus =
(DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG |
DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_INCINGIGNed |
DES0_TX_CTRL_IP_All_CKHSUMS);

//
//初始化每个接收描述符。 我们在此清除自己的位
//确保接收器不会开始写入任何内容
//立即。
//
for (ui32Loop = 0;ui32Loop < NUM_RX_descriptor;ui32Loop +)

G_psRxDescriptor[ui32Loop ].ui32CtrlStatus = 0;
G_psRxDescriptor[ui32Loop ].ui32Count =
(DES1_RX_CTRL_chained |
(Rx_buffer_size << DES1_RX_CTRL_BUFF1_Size_S);
G_psRxDescriptor[ui32Loop ].pvBuffer1 = g_pui8RxBuffer;
G_psRxDescriptor[ui32Loop ].DES3.plink =
(ui32Loop =(NUM_RX_descriptors - 1))?
G_psRxDescriptor:&g_psRxDescriptor[ui32Loop + 1];

//
//在硬件中设置描述符指针。
//
ROM_EMACRxDMADescriptionorListSet (ui32Base、g_psRxDescriptor);
ROM_EMACTxDMADescriptionorListSet (ui32Base、g_psTxDescriptor);

//
//从两个描述符链的开头开始。 我们实际上设置了
//发送描述符索引到链中的最后一个描述符
//因为它将在使用前递增,这意味着第一个
//我们执行的传输将使用正确的描述符。
//
G_ui32RxDescIndex = 0;
G_ui32TxDescIndex = NUM_TX_descriptors - 1;

startup_rvmdk.S

;********

; 栈大小(以字节为单位)<0x0-0xFFFFFFFF:8>

;********
堆栈 EQU 0x00000800

;********

; 堆大小(以字节为单位)<0x0-0xFFFFFFFF:8>

;********
堆 EQU 0x00000000

;********

;为堆栈分配空间。

;********
区域堆栈、NOINIT、READWRITE、ALIGN=3
StackMem
空间堆栈
_initial_sp.(初始化_sp.

;********

;为堆分配空间。

;********
区域堆、NOINIT、READWRITE、ALIGN=3
_heap_base
HeapMem
空间堆
_heap_limit

;********

;指示此文件中的代码保留堆栈的8字节对齐。

;********
预览8.

;********

;将代码放入复位代码部分。

;********
区域复位、代码、只读
拇指
;********

;应用程序使用的中断处理程序的外部声明。

;********
extern EthernetIntHandler
;********

;矢量表。

;********
导出__Vectors
_矢量
DCD StackMem + Stack;栈顶
DCD Reset_Handler;Reset Handler
DCD NmiSR;NMI 处理程序
DCD FaultISR;硬故障处理程序
DCD IntDefaultHandler;MPU 故障处理程序
DCD IntDefaultHandler;总线故障处理程序
DCD IntDefaultHandler;用法故障处理程序
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD IntDefaultHandler;SVCall 处理程序
DCD IntDefaultHandler;调试监视器处理程序
DCD 0;保留
DCD IntDefaultHandler;PendSV 处理程序
DCD IntDefaultHandler;SysTick 处理程序
DCD IntDefaultHandler;GPIO 端口 A
DCD IntDefaultHandler;GPIO 端口 B
DCD IntDefaultHandler;GPIO 端口 C
DCD IntDefaultHandler;GPIO 端口 D
DCD IntDefaultHandler;GPIO 端口 E
DCD IntDefaultHandler;UART0 Rx 和 Tx
DCD IntDefaultHandler;UART1 Rx 和 Tx
DCD IntDefaultHandler;SSI0 Rx 和 Tx
DCD IntDefaultHandler;I2C0主设备和从设备
DCD IntDefaultHandler;PWM 故障
DCD IntDefaultHandler;PWM 发生器0
DCD IntDefaultHandler;PWM 发生器1.
DCD IntDefaultHandler;PWM 发生器2.
DCD IntDefaultHandler;正交编码器0
DCD IntDefaultHandler;ADC 序列0
DCD IntDefaultHandler;ADC 序列1.
DCD IntDefaultHandler;ADC 序列2.
DCD IntDefaultHandler;ADC 序列3.
DCD IntDefaultHandler;看门狗计时器
DCD IntDefaultHandler;Timer 0子计时器 A
DCD IntDefaultHandler;Timer 0子计时器 B
DCD IntDefaultHandler;计时器1子计时器 A
DCD IntDefaultHandler;Timer 1子计时器 B
DCD IntDefaultHandler;计时器2子计时器 A
DCD IntDefaultHandler;Timer 2子计时器 B
DCD IntDefaultHandler;模拟比较器0
DCD IntDefaultHandler;模拟比较器1.
DCD IntDefaultHandler;模拟比较器2.
DCD IntDefaultHandler;系统控制(PLL、OSC、BO)
DCD IntDefaultHandler;闪存控制
DCD IntDefaultHandler;GPIO 端口 F
DCD IntDefaultHandler;GPIO 端口 G
DCD IntDefaultHandler;GPIO 端口 H
DCD IntDefaultHandler;UART2 Rx 和 Tx
DCD IntDefaultHandler;SSI1 Rx 和 Tx
DCD IntDefaultHandler;Timer 3子计时器 A
DCD IntDefaultHandler;Timer 3子计时器 B
DCD IntDefaultHandler;I2C1主站和从站
DCD IntDefaultHandler;CAN0
DCD IntDefaultHandler;CAN1
DCD EthernetIntHandler;以太网
DCD IntDefaultHandler;Hibernate
DCD IntDefaultHandler;USB0
DCD IntDefaultHandler;PWM 发生器3.
DCD IntDefaultHandler;UDMA 软件传输
DCD IntDefaultHandler;UDMA 错误
DCD IntDefaultHandler;ADC1序列0
DCD IntDefaultHandler;ADC1序列1.
DCD IntDefaultHandler;ADC1序列2.
DCD IntDefaultHandler;ADC1序列3.
DCD IntDefaultHandler;外部总线接口0
DCD IntDefaultHandler;GPIO 端口 J
DCD IntDefaultHandler;GPIO 端口 K
DCD IntDefaultHandler;GPIO 端口 L
DCD IntDefaultHandler;SSI2 Rx 和 Tx
DCD IntDefaultHandler;SSI3 Rx 和 Tx
DCD IntDefaultHandler;UART3 Rx 和 Tx
DCD IntDefaultHandler;UART4 Rx 和 Tx
DCD IntDefaultHandler;UART5 Rx 和 Tx
DCD IntDefaultHandler;UART6 Rx 和 Tx
DCD IntDefaultHandler;UART7 Rx 和 Tx
DCD IntDefaultHandler;I2C2主站和从站
DCD IntDefaultHandler;I2C3主站和从站
DCD IntDefaultHandler;计时器4子计时器 A
DCD IntDefaultHandler;计时器4子计时器 B
DCD IntDefaultHandler;Timer 5子计时器 A
DCD IntDefaultHandler;Timer 5子计时器 B
DCD IntDefaultHandler;FPU
DCD 0;保留
DCD 0;保留
DCD IntDefaultHandler;I2C4 Master 和 Slave
DCD IntDefaultHandler;I2C5主设备和从设备
DCD IntDefaultHandler;GPIO 端口 M
DCD IntDefaultHandler;GPIO 端口 N
DCD 0;保留
DCD IntDefaultHandler;防篡改
DCD IntDefaultHandler;GPIO 端口 P (摘要或 P0)
DCD IntDefaultHandler;GPIO 端口 P1
DCD IntDefaultHandler;GPIO 端口 P2
DCD IntDefaultHandler;GPIO 端口 P3
DCD IntDefaultHandler;GPIO 端口 P4
DCD IntDefaultHandler;GPIO 端口 P5
DCD IntDefaultHandler;GPIO 端口 P6
DCD IntDefaultHandler;GPIO 端口 P7
DCD IntDefaultHandler;GPIO 端口 Q (摘要或 Q0)
DCD IntDefaultHandler;GPIO 端口 Q1
DCD IntDefaultHandler;GPIO 端口 Q2
DCD IntDefaultHandler;GPIO 端口 Q3
DCD IntDefaultHandler;GPIO 端口 Q4
DCD IntDefaultHandler;GPIO 端口 Q5
DCD IntDefaultHandler;GPIO 端口 Q6
DCD IntDefaultHandler;GPIO 端口 Q7
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD IntDefaultHandler;Timer 6子计时器 A
DCD IntDefaultHandler;Timer 6子计时器 B
DCD IntDefaultHandler;Timer 7子计时器 A
DCD IntDefaultHandler;Timer 7子计时器 B
DCD IntDefaultHandler;I2C6主设备和从设备
DCD IntDefaultHandler;I2C7主站和从站
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD 0;保留
DCD IntDefaultHandler;I2C8主站和从站
DCD IntDefaultHandler;I2C9主站和从站
DCD 0;保留
DCD 0;保留
DCD 0;保留

;********

;这是处理器首次开始执行时调用的代码
;重置事件后。

;********
导出 Reset_Handler
RESET_Handler

;启用浮点单元。 必须在此处执行此操作才能处理
; main()使用浮点且函数 prologueue 保存的情况
;浮点寄存器(如果浮点不是浮点则会出现故障)
;已启用)。 使用的浮点单元的任何配置
; DriverLib API 必须在浮点单元之前在此处完成
;正在启用。

;请注意,这不使用 DriverLib,因为它可能不包含在内
;在该项目中。

MOVW R0、#0xED88
MOVT R0、#0xE000
LDR R1、[R0]
ORR R1、#0x00F00000
STR R1、[R0]


;调用 C 库处理启动的足够点。 这将复制
;.data 段初始化闪存至 SRAM,并填充零
;.bss 段。

导入_main
b _main

;********

;这是处理器收到 NMI 时调用的代码。 这种情况
;只需进入无限循环,保持系统状态以供检查
;由调试器执行。

;********
NmiSR
b NmiSR

;********

;这是处理器收到故障时调用的代码
;中断。 这只是进入一个无限循环、从而保持系统状态
;供调试器检查。

;********
FaultISR
b FaultISR

;********

;这是处理器收到意外时调用的代码
;中断。 这只是进入一个无限循环、从而保持系统状态
;供调试器检查。

;********
IntDefaultHandler
b IntDefaultHandler

;********

;确保此段的末尾对齐。

;********
对齐

;********

;常规代码部分中用于初始化堆和堆栈的一些代码。

;********
Area |.text|、code、readonly

;********

; C 库启动代码用于定义栈的预期函数
;和堆内存位置。 对于启动代码的 C 库版本、
;提供此函数,以便 C 库初始化代码可以找到
;堆栈和堆的位置。

;********
如果:DEF:__MICROLIB
导出_initial sp
导出_heap_base
导出_heap_limit
其他
导入__use_two_region_memory
导出_user_initial_stackheap
_user_initial_stackheap
LDR R0、= HeapMem
LDR R1、=(StackMem +堆栈)
LDR R2、=(HeapMem +堆)
LDR R3、=StackMem
BX LR
字节序

;********

;确保此段的末尾对齐。

;********
对齐

;********

;告诉汇编器我们已完成。

;********
结束

//

// // 这里没有中断

//

空 EthernetIntHandler (空)

uint32_t ui32Status;

ui32Status = MAP_EMACIntStatus (EMAC0_BASE、TRUE);
MAP_EMACIntClear (EMAC0_BASE、ui32Status);

UARTprintf ("INT:%08x \r\n"、ui32Status);

希望能迅速得到答案。

非常感谢

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

    您好!

    PHY_BMSR:0x00007849

    PHY_ANLPA:0x00000000

    基于这些寄存器、自动协商被启用并完成、但是没有建立连接和连接伙伴能力。

    您的软件为什么说有链接? 这里似乎存在问题、因为 PHY 寄存器指示存在其他问题。

    谢谢、

    Vibhu