tm32f207 + DP83848 + Lwip初始化问题

时间:2023-01-17 22:18:21

1 遇到的问题

  • ETH_Init(&ETH_InitStructure,DP83848_PHY_ADDRESS);初始化不成功问题
  • 在while (ETH_GetSoftwareResetStatus() == SET);卡死
  • 动态IP获取不成功问题

2 阐述可能原因

出现上述问题主要是PHY芯片DP83848初始化不成功引起的,主要从以下几个方面入手检查:

  • 检查是否引脚有虚焊
  • 检查DP83848_PHY_ADDRESS地址是否正确,查看手册,一般是0x01,这个需要根据具体电路
  • 最后查看系统时钟,DP83848芯片要求需要外部输入50MHZ的时钟。(我也是在这坑的,我主要讲一下这个解决方案)

3 解决方案(针对问题三)

主要是先了解单片机系统的时钟树,针对stm32f207,他的系统时钟最高可达120M,为了输出PHY芯片DP83848芯片所需的时钟,我们必须将单片机设置为100M时钟输出,具体怎么设置,可以将如下代码复制到系统的system_stm32f2xx.c中,主要是替换以前系统时钟设置时的宏定义。

`#ifndef RMII_MODE
/* System clock frequency configured for 120 MHz ****************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 25
#define PLL_N 240

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 5
#else
/* System clock frequency configured for 100 MHz ****************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 4
#define PLL_N 64

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 4

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 5

/* IMPORTANT NOTE
==============
This configuration is valid only when MCO pin is used as RMII clock source.
To output a 50 MHz clock signal on the MCO pin, the following conditions
must be respected:
25 MHz external crystal connected to OSCIN/OSCOUT pins
– RCC_PLLCFGR PLL factors configured as follows:
PLLMx = 4, PLLNx = 64, PLLP = 4.
This leads to a system clock of 100 MHz.
– Then set the MCO prescaler to 2 in the RCC_CFGR register to configure
the system clock to 50 MHz.
*/
#endif /* RMII_MODE */`

为了是系统启动时就是时钟生效设置为100MHZ,必须提前定义RMII_MODE,我采用如下的方法,也可以在SetSysClock()函数之前定义,但是在main.c中定义不会生效。
tm32f207 + DP83848 + Lwip初始化问题
由于系统时钟较快,假如出现不能获取或者偶尔不能获取系统时钟时,可以在DP83848引脚和时钟初始化后加一个19ms的系统延时即可。