1. 程式人生 > >STM32開發筆記50:STM32F4+DP83848乙太網通訊指南系列(四):PHY配置

STM32開發筆記50:STM32F4+DP83848乙太網通訊指南系列(四):PHY配置

本章為系列指南的第四章,這一章將正式進入乙太網的配置和使用。首先我們關注一下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,如果你在其他工程專案中能看到這麼一個檔案,十有八九都會有這麼一個函式,我也是參考了一些其他專案這麼寫的,檔案儲存後,我們會在以後用到,這一章暫時結束。