本章为系列指南的第四章,这一章将正式进入以太网的配置和使用。首先我们关注一下PHY的配置,前面讲到,我们的工程使用了开发板上的一颗DP83848芯片。
RMII和ADDR的确定
接下来我们来看开发板的原理图:
通过电路原理图可以看到接线方式是使用RMII接口模式接线的,因此接下来我们在配置PHY的时候注意要是用RMII。
我们知道DP83848,以及任何一个PHY芯片,都是有5个bit的地址信号的,RMII通信时会携带ADDR数据,只有ADDR吻合的PHY才会有响应。先来看看原理图上DP83848的管脚定义,原理图上DP83848的42号脚标注的PHYAD0,并且引脚悬空了,没有特别的处理。我们再来看看DP83848的数据手册,在P18页,有如下描述:
红框标记部分阐述了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,如果你在其他工程项目中能看到这么一个文件,十有八九都会有这么一个函数,我也是参考了一些其他项目这么写的,文件保存后,我们会在以后用到,这一章暂时结束。