1 遇到的问题
- ETH_Init(Ð_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中定义不会生效。
由于系统时钟较快,假如出现不能获取或者偶尔不能获取系统时钟时,可以在DP83848引脚和时钟初始化后加一个19ms的系统延时即可。