STM32开发笔记50:STM32F4+DP83848以太网通信指南系列(四):PHY配置

本章为系列指南的第四章,这一章将正式进入以太网的配置和使用。首先我们关注一下PHY的配置,前面讲到,我们的工程使用了开发板上的一颗DP83848芯片。

RMII和ADDR的确定

接下来我们来看开发板的原理图:

STM32开发笔记50:STM32F4+DP83848以太网通信指南系列(四):PHY配置_第1张图片

通过电路原理图可以看到接线方式是使用RMII接口模式接线的,因此接下来我们在配置PHY的时候注意要是用RMII。

我们知道DP83848,以及任何一个PHY芯片,都是有5个bit的地址信号的,RMII通信时会携带ADDR数据,只有ADDR吻合的PHY才会有响应。先来看看原理图上DP83848的管脚定义,原理图上DP83848的42号脚标注的PHYAD0,并且引脚悬空了,没有特别的处理。我们再来看看DP83848的数据手册,在P18页,有如下描述:

STM32开发笔记50:STM32F4+DP83848以太网通信指南系列(四):PHY配置_第2张图片

红框标记部分阐述了PHYAD0内部上拉了,其余4个AD位内部下拉了,因此悬空状态下这颗DP83848的默认ADDR就是0x01

PHY配置

PHY的配置主要解决GPIO的配置和RMII的接口,这部分比较简单,因为GPIO很多都是专用的,基本都是定义死的,查看原理图或者STM32F4xx的数据手册,都能很容易确定用到哪些GPIO,每个GPIO用来干什么的,代码如下:

#define     DP83848_PHY_ADDRESS     0x01    // DP83848 PHY芯片地址.

void ETH_GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    /* Enable GPIOs clocks */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOC , ENABLE);

    /* Enable SYSCFG clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); //MAC和PHY之间使用RMII接口

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

    /* Configure PA1, PA2 and PA7 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

    /* Configure PC1, PC4 and PC5 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

    /* Configure PG11, PG14 and PG13 */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
    GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH);
}

综上,就是PHY部分配置的全过程,还是比较简单的,第一行定义的DP83848_PHY_ADDRESS我们会在下一章配置MAC层的章节使用到。这个函数完成的任务也比较单一,就是初始化系统配置SYSCFG、确定RMII协议接口、初始化各个需要用到的GPIO。

我们将这个文件保存为stm32f4x7_eth_bsp.c,如果你在其他工程项目中能看到这么一个文件,十有八九都会有这么一个函数,我也是参考了一些其他项目这么写的,文件保存后,我们会在以后用到,这一章暂时结束。

 

 

 

你可能感兴趣的:(#,STM32快速开发,STM32快速开发)