工具/软件: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);
}
希望能迅速得到答案。
非常感谢