日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【STM32F429】第6章 RL-TCPnet V7.X底层驱动说明

發布時間:2023/12/31 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32F429】第6章 RL-TCPnet V7.X底层驱动说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=95243

第6章?? RL-TCPnet底層驅動說明

本章節為大家講解RL-TCPnet的底層驅動,主要是STM32自帶MAC的驅動實現和PHY的驅動實現。

目錄

第6章?? RL-TCPnet底層驅動說明

6.1?? 初學者重要提示

6.2?? MAC+PHY驅動實現方案

6.3?? CMSIS-Driver簡介和驅動工作流程

6.4?? CMSIS-Driver的PHY底層驅動實現

6.4.1????? DM9161和DM9162的區別

6.4.2????? 函數GetVersion

6.4.3????? 函數Initialize

6.4.4????? 函數Uninitialize

6.4.5????? 函數PowerControl

6.4.6????? 函數SetInterface

6.4.7????? 函數SetMode

6.4.8????? 函數GetLinkState

6.4.9????? 函數GetLinkInfo

6.5?? CMSIS-Driver的MAC底層驅動實現

6.5.1????? 函數GetVersion

6.5.2????? 函數GetCapabilities

6.5.3????? 函數Initialize

6.5.4????? 函數Uninitialize

6.5.5????? 函數PowerControl

6.5.6????? 函數GetMacAddress

6.5.7????? 函數SetMacAddress

6.5.8????? 函數SetAddressFilter

6.5.9????? 函數SendFrame

6.5.10 函數ReadFrame

6.5.11 函數GetRxFrameSize

6.5.12 函數GetRxFrameTime

6.5.13 函數GetTxFrameSize

6.5.14 函數ControlTimer

6.5.15 函數Control

6.5.16 函數PHY_Read

6.5.17 函數PHY_Write

6.6?? 總結


6.1?? 初學者重要提示

  • ? 學習本章節前,務必學習STM32參考手冊中MAC章節的基礎知識講解,非常重要。
  • ? DM9161和DM9162的手冊可以在官網地址下載,本章節需要用到部分寄存器:http://www.davicom.com.tw/production-item.php。
  • ? 早期STM32F407開發板使用的PHY芯片是DM9161,不過現在基本已經停產了,當前F407,F429和H7開發板統一使用DM9162。底層代碼對這兩個芯片都可以正確驅動。
  • ? MAC全稱Media Access Control,媒介訪問控制。
  • ? PHY全稱Physical Interface Transceiver,物理層接口收發器。
  • 6.2?? MAC+PHY驅動實現方案

    STM32F4自帶MAC,所以只需外置PHY芯片即可使用以太網,示意圖如下:

    當前V5開發板使用的PHY芯片是DM9162。反映到硬件設計上,原圖如下:

    ?

    通過這個原理圖,我們要注意以下兩點:

    • ? 1.8V的電壓是PHY芯片DM916x自己產生的。
    • ? PHY芯片的地址由PHYAD[0:3]引腳決定,當前是將PHYAD[0]引腳接了一個上拉電阻,也就是說DM916x的地址是0x01。

    ?

    教程配套的開發板采用的RMII接口,即下面這種硬件接口方式:

    RMII接口降低了 10/100Mbps下微控制器以太網外設與外部PHY間的引腳數。根據IEEE 802.3u標準, MII包括16個數據和控制信號的引腳。RMII規范將引腳數減少為7個(引腳數減少62.5%)。RMII具有以下特性:

    • ? 支持10Mbps和100Mbps的運行速率。
    • ? 參考時鐘必須是 50 MHz。
    • ? 相同的參考時鐘必須從外部提供給 MAC 和外部以太網 PHY。
    • ? 它提供了獨立的2位寬(雙位)的發送和接收數據路徑,即發生和接收都是占用了兩個引腳。

    6.3?? CMSIS-Driver簡介和驅動工作流程

    這個是ARM做好的驅動框架,支持的外設如下:

    針對不同廠商,ARM會出一個完整的驅動包,比如STM32F4系列,在MDK安裝目錄的此路徑下(前提是大家安裝了STM32H7軟件包):ARM\PACK\Keil\STM32F4xx_DFP\2.14.0\CMSIS\Driver。

    ARM做的這個驅動跟HAL庫有什么區別呢?ARM做的這個庫要調用到HAL的一些API(H7版的有調用到,F4版的很少調用到,基本是獨立的),然后封裝了一些比較好用的API,方便用戶調用。

    關于這些不同外設的驅動文件,它們都有統一的API函數,調用流程如下:

    關于這個驅動的流程,大家有個認識即可,網絡協議棧會直接調用這些API進行操作,無需用戶去調用。

    6.4?? CMSIS-Driver的PHY底層驅動實現

    PHY驅動由CMSIS-Driver軟件包提供,當前支持的PHY如下(位于MDK安裝路徑ARM\CMSIS-Driver\2.4.0\ETH,數字2.4.0表示當前的CMSIS-Driver版本):

    這些驅動文件主要分為兩類:

    • ? 以ETH開頭的,這些芯片是MAC+PHY二合一。
    • ? 以PHY開頭的,這些芯片僅是個PHY。

    ?

    CMSIS-Driver現有的驅動里面是沒有DM9162,所以需要用戶自己實現,這里將DM9162的實現函數逐一為大家做個說明。CMSIS-Driver已經定義好了API,用戶實現每個API的具體功能即可。

    6.4.1????? DM9161和DM9162的區別

    早期我們發布的STM32F407開發板的PHY芯片使用的是DM9161,現在這個芯片基本已經停產,所以已經統一改成使用DM9162,這兩個型號主要在以下兩個地方有區別,其它基本都一樣。

    • ? 兩個PHY芯片的的ID不一樣,DM9161的ID是0x0181B8B1,DM9162的ID是0x0181B8A0。
    • ? 系統剛上電時,DM9161的ID寄存器支持立即讀取,但是DM9162不支持,這一點用戶在使用的時候要特別注意。但是DM9161和DM9162都支持立即寫寄存器BMCR,所以當前的操作就是直接對寄存器BMCR發復位命令,然后再進行相關設置。

    ?

    對于這兩個芯片,了解這兩點區別就可以了。另外,這兩個芯片的手冊和其它的相關知識在這個帖子里面進行了簡單的匯總:http://www.armbbs.cn/forum.php?mod=viewthread&tid=19577

    6.4.2????? 函數GetVersion

    函數原型:

    static ARM_DRIVER_VERSION GetVersion (void) {return DriverVersion; }

    函數描述:

    用于獲取當前的PHY驅動版本。

    6.4.3????? 函數Initialize

    函數原型:

    static int32_t Initialize (ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) {if ((fn_read == NULL) || (fn_write == NULL)) { return ARM_DRIVER_ERROR_PARAMETER; }if ((PHY.flags & PHY_INIT) == 0U) {/* Register PHY read/write functions. */PHY.reg_rd = fn_read;PHY.reg_wr = fn_write;PHY.bmcr = 0U;PHY.flags = PHY_INIT;}return ARM_DRIVER_OK; }

    函數描述:

    初始化讀寫PHY芯片所需要的API

    函數參數:

    • ? 第1個參數是讀PHY芯片API地址。
    • ? 第2個參數是寫PHY芯片API地址。
    • ? 返回值,無參數錯誤返回ARM_DRIVER_OK。有參數錯誤返回ARM_DRIVER_ERROR_PARAMETER。

    6.4.4????? 函數Uninitialize

    函數原型:

    static int32_t Uninitialize (void) {PHY.reg_rd = NULL;PHY.reg_wr = NULL;PHY.bmcr = 0U;PHY.flags = 0U;return ARM_DRIVER_OK; }

    函數描述:

    復位讀寫PHY芯片所需要的API。

    函數參數:

    • ? 返回值,返回ARM_DRIVER_OK

    6.4.5????? 函數PowerControl

    函數原型:

    static int32_t PowerControl (ARM_POWER_STATE state) {uint16_t val;switch ((int32_t)state) {/* 將PHY斷電 */case ARM_POWER_OFF:/* 初始化狀態才可以配置POWER OFF */if ((PHY.flags & PHY_INIT) == 0U) {return ARM_DRIVER_ERROR;}PHY.flags &= ~PHY_POWER;PHY.bmcr = BMCR_POWER_DOWN;/* 設置BMCR寄存器,斷電 */return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr));/* PHY上電,并清除BMCR寄存器 */case ARM_POWER_FULL:/* 初始化狀態才可以配置POWER FULL */ if ((PHY.flags & PHY_INIT) == 0U) {return ARM_DRIVER_ERROR;}/* 已經處于POWER ON狀態,直接返回OK */if (PHY.flags & PHY_POWER) {return ARM_DRIVER_OK;}/* 讀取設備 */PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR1, &val);/* 讀取ID1 */if (val != PHY_ID1) {return ARM_DRIVER_ERROR_UNSUPPORTED;}PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR2, &val);/* 讀取ID2, 此處做了一個特別處理,屏蔽后面8個bit,方便DM9162和DM9161都可以識別,因為這兩個PHY后面的ID不同。*/if ((val & 0xFF00) != PHY_ID2) {return ARM_DRIVER_ERROR_UNSUPPORTED;}/* DM916X用不到這個 */#if (ETH_PHY_REF_CLK_50M != 0)PHY.reg_rd(ETH_PHY_ADDR, REG_PHYCR2, &val);val |= PHYCR2_REF_CLK_SELECT;PHY.reg_wr(ETH_PHY_ADDR, REG_PHYCR2, val);#endifPHY.bmcr = 0U;/* BMCR寄存器清零 */if (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr) != ARM_DRIVER_OK) {return ARM_DRIVER_ERROR;}PHY.flags |= PHY_POWER;return ARM_DRIVER_OK;/* 不支持低功耗操作 */case ARM_POWER_LOW:default:return ARM_DRIVER_ERROR_UNSUPPORTED;} }

    函數描述:

    用于控制PHY的上電和斷電。

    函數參數:

    • ? 第1個參數是PHY配置
      • ? ARM_POWER_OFF 表示斷電,程序此處做了BMCR寄存器斷電操作。
      • ? ARM_POWER_FULL 表示上電,程序此處讀取PHY的ID,并清除BMCR寄存器。
      • ? ARM_POWER_LOW 表示低功耗,程序此處不支持。
    • ? 第2個參數是寫PHY芯片API地址。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.4.6????? 函數SetInterface

    函數原型:

    static int32_t SetInterface (uint32_t interface) {int32_t status;if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }/* 僅作了RMII接口支持 */switch (interface) {case ARM_ETH_INTERFACE_RMII: status = ARM_DRIVER_OK; break;default:status = ARM_DRIVER_ERROR_UNSUPPORTED; break;}return (status); }

    函數描述:

    用于配置使用SMII,RMII還是MII接口外接的PHY芯片。

    函數參數:

    • ? 第1個參數設置使用的PHY接口類型。
      • ? ARM_ETH_INTERFACE_MII,Media Independent Interface (MII)
      • ? ARM_ETH_INTERFACE_RMII,Reduced Media Independent Interface (RMII)
      • ? ARM_ETH_INTERFACE_SMII,Serial Media Independent Interface (SMII)
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.4.7????? 函數SetMode

    函數原型:

    static int32_t SetMode (uint32_t mode) {uint16_t val;/* 上電狀態才可以配置 */if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }val = PHY.bmcr & BMCR_POWER_DOWN;/* 速度配置10M或者100M */switch (mode & ARM_ETH_PHY_SPEED_Msk) {case ARM_ETH_PHY_SPEED_10M:break;case ARM_ETH_PHY_SPEED_100M:val |= BMCR_SPEED_SELECT;break;default:return ARM_DRIVER_ERROR_UNSUPPORTED;}/* 全雙工或者半雙工配置 */switch (mode & ARM_ETH_PHY_DUPLEX_Msk) {case ARM_ETH_PHY_DUPLEX_HALF:break;case ARM_ETH_PHY_DUPLEX_FULL:val |= BMCR_DUPLEX_MODE;break;default:return ARM_DRIVER_ERROR_UNSUPPORTED;}/* 自動協商配置使能 */if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) {val |= BMCR_ANEG_EN;}/* 回環配置使能,方便回環測試 */if (mode & ARM_ETH_PHY_LOOPBACK) {val |= BMCR_LOOPBACK;} /* 設置隔離,電氣隔離RMII/MII/SMII接口 */if (mode & ARM_ETH_PHY_ISOLATE) {val |= BMCR_ISOLATE;}PHY.bmcr = val;return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr)); }

    函數描述:

    用于設置PHY芯片的工作模式。

    函數參數:

    • ? 第1個參數設置工作模式,這幾項支持或操作。

    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.4.8????? 函數GetLinkState

    函數原型:

    static ARM_ETH_LINK_STATE GetLinkState (void) {ARM_ETH_LINK_STATE state;uint16_t val = 0U;if (PHY.flags & PHY_POWER) {PHY.reg_rd(ETH_PHY_ADDR, REG_BMSR, &val);}state = (val & BMSR_LINK_STAT) ? ARM_ETH_LINK_UP : ARM_ETH_LINK_DOWN;return (state); }

    函數描述:

    用于獲取網線插拔狀態。

    函數參數:

    • ? 返回值,返回ARM_ETH_LINK_UP表示網線在連接狀態,返回ARM_ETH_LINK_DOWN表示網線處于斷開狀態。

    6.4.9????? 函數GetLinkInfo

    函數原型:

    static ARM_ETH_LINK_INFO GetLinkInfo (void) {ARM_ETH_LINK_INFO info;uint16_t val = 0U;if (PHY.flags & PHY_POWER) {/* 讀取PHY DSCSR 寄存器 */PHY.reg_rd(ETH_PHY_ADDR, REG_DSCSR, &val);}/* 獲取速度和雙工模式 */info.speed = ((val & DSCSR_100M_FD)|(val & DSCSR_100M_HD)) ? ARM_ETH_SPEED_100M : ARM_ETH_SPEED_10M;info.duplex = ((val & DSCSR_100M_FD)|(val & DSCSR_10M_FD)) ? ARM_ETH_DUPLEX_FULL : ARM_ETH_DUPLEX_HALF;return (info); }

    函數描述:

    用于獲取速度和雙工模式。

    函數參數:

    • ?返回值記錄速度(10Mbps或者100Mbps)和雙工模式(半雙工或者全雙工)。

    6.5?? CMSIS-Driver的MAC底層驅動實現

    KEIL已經為STM32F4制作好MAC驅動文件EMAC_STM32F4xx.c。我們這里將相關實現函數為大家做個說明。

    6.5.1????? 函數GetVersion

    函數原型:

    static ARM_DRIVER_VERSION GetVersion (void) {return DriverVersion; }

    函數描述:

    用于獲取當前的MAC驅動版本。

    6.5.2????? 函數GetCapabilities

    函數原型:

    #ifndef EMAC_CHECKSUM_OFFLOAD #define EMAC_CHECKSUM_OFFLOAD 1 #endifstatic const ARM_ETH_MAC_CAPABILITIES DriverCapabilities = {(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_ip4 */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_ip6 */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_udp */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_tcp */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_rx_icmp */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_ip4 */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_ip6 */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_udp */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_tcp */(EMAC_CHECKSUM_OFFLOAD != 0) ? 1U : 0U, /* checksum_offload_tx_icmp */(ETH_MII != 0) ?ARM_ETH_INTERFACE_MII :ARM_ETH_INTERFACE_RMII, /* media_interface */0U, /* mac_address */1U, /* event_rx_frame */1U, /* event_tx_frame */1U, /* event_wakeup */(EMAC_TIME_STAMP != 0) ? 1U : 0U /* precision_timer */ #if (defined(ARM_ETH_MAC_API_VERSION) && (ARM_ETH_MAC_API_VERSION >= 0x201U)) , 0U /* reserved bits */ #endif };static ARM_ETH_MAC_CAPABILITIES GetCapabilities (void) {return DriverCapabilities; }

    函數描述:

    用于獲取MAC的硬件功能。

    從當前的宏定義來看,支持發送和接收的IP4,IP6,UDP,TCP和ICMP的硬件校驗和計算。

    6.5.3????? 函數Initialize

    函數原型:

    static int32_t Initialize (ARM_ETH_MAC_SignalEvent_t cb_event) { #if defined(RTE_DEVICE_FRAMEWORK_CLASSIC)GPIO_InitTypeDef GPIO_InitStruct;const ETH_PIN *io; #endif/* 使能SYSCFG時鐘 */RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;#if (ETH_MII == 0)SYSCFG->PMC |= SYSCFG_PMC_MII_RMII_SEL;#elseSYSCFG->PMC &= ~SYSCFG_PMC_MII_RMII_SEL;#endif#if defined(RTE_DEVICE_FRAMEWORK_CLASSIC)/* 配置以太網引腳 */GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_InitStruct.Alternate = GPIO_AF11_ETH;for (io = eth_pins; io != &eth_pins[sizeof(eth_pins)/sizeof(ETH_PIN)]; io++) {Enable_GPIO_Clock (io->port);GPIO_InitStruct.Pin = io->pin;HAL_GPIO_Init (io->port, &GPIO_InitStruct);}#elseheth.Instance = ETH;#endif/* 清空控制結構體 */memset ((void *)&Emac, 0, sizeof (EMAC_CTRL));Emac.cb_event = cb_event;Emac.flags = EMAC_FLAG_INIT;return ARM_DRIVER_OK; }

    函數描述:

    用于初始化MAC,配置以太網引腳,注冊回調函數。

    函數參數:

    • ? 第1個參數用于注冊回調函數。
    • ? 返回值,固定返回ARM_DRIVER_OK。

    6.5.4????? 函數Uninitialize

    函數原型:

    static int32_t Uninitialize (void) { #if defined(RTE_DEVICE_FRAMEWORK_CLASSIC)const ETH_PIN *io;/* 復位以太網引腳配置 */for (io = eth_pins; io != &eth_pins[sizeof(eth_pins)/sizeof(ETH_PIN)]; io++) {HAL_GPIO_DeInit(io->port, io->pin);} #elseheth.Instance = NULL; #endifEmac.flags &= ~EMAC_FLAG_INIT;return ARM_DRIVER_OK; }

    函數描述:

    復位初始化。

    函數參數:

    • ? 返回值,固定返回ARM_DRIVER_OK。

    6.5.5????? 函數PowerControl

    函數原型:

    static int32_t PowerControl (ARM_POWER_STATE state) {uint32_t hclk, clkdiv;if ((state != ARM_POWER_OFF) && (state != ARM_POWER_FULL) && (state != ARM_POWER_LOW)) {return ARM_DRIVER_ERROR_UNSUPPORTED;}switch (state) {/* 關閉電源 */case ARM_POWER_OFF:內容較多,省略未寫break;/* 低功耗 */case ARM_POWER_LOW:return ARM_DRIVER_ERROR_UNSUPPORTED;/* 上電 */case ARM_POWER_FULL:內容較多,省略未寫break;}return ARM_DRIVER_OK; }

    函數描述:

    用于控制MAC的上電和斷電。

    函數參數:

    • ? 第1個參數是MAC配置
      • ? ARM_POWER_OFF 表示斷電,程序此處做了MAC復位。
      • ? ARM_POWER_FULL 表示上電,程序此處初始化MAC。
      • ? ARM_POWER_LOW 表示低功耗,程序此處不支持。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.5.6????? 函數GetMacAddress

    函數原型:

    static int32_t GetMacAddress (ARM_ETH_MAC_ADDR *ptr_addr) {uint32_t val;if (ptr_addr == NULL) {return ARM_DRIVER_ERROR_PARAMETER;}if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}val = ETH->MACA0HR;ptr_addr->b[5] = (uint8_t)(val >> 8);ptr_addr->b[4] = (uint8_t)(val);val = ETH->MACA0LR;ptr_addr->b[3] = (uint8_t)(val >> 24);ptr_addr->b[2] = (uint8_t)(val >> 16);ptr_addr->b[1] = (uint8_t)(val >> 8);ptr_addr->b[0] = (uint8_t)(val);return ARM_DRIVER_OK; }

    函數描述:

    用于獲取MAC地址。

    函數參數:

    • ? 第1個參數用于存儲獲取的MAC地址。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_PARAMETER表示參數錯誤。

    6.5.7????? 函數SetMacAddress

    函數原型:

    static int32_t SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) {if (ptr_addr == NULL) {return ARM_DRIVER_ERROR_PARAMETER;}if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}/* Set Ethernet MAC Address registers */ETH->MACA0HR = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4];ETH->MACA0LR = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) |((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0];return ARM_DRIVER_OK; }

    函數描述:

    用于設置本身的MAC地址。包含這個MAC地址的以太網幀才會被這個芯片所接受。也可以通過函數ARM_ETH_MAC_SetAddressFilter設置接收其它的MAC地址。除此之外,還可以通過函數ARM_ETH_MAC_Control 的參數ARM_ETH_MAC_CONFIGURE設置廣播和組播。

    函數參數:

    • ? 第1個參數是MAC地址。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_PARAMETER表示參數錯誤。

    6.5.8????? 函數SetAddressFilter

    函數原型:

    static int32_t SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr) {uint32_t crc;if ((ptr_addr == NULL) && (num_addr != 0)) {return ARM_DRIVER_ERROR_PARAMETER;}if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}/* 使用單播過濾前三個MAC */ETH->MACFFR &= ~(ETH_MACFFR_HPF | ETH_MACFFR_HM);ETH->MACHTHR = 0U; ETH->MACHTLR = 0U;if (num_addr == 0U) {ETH->MACA1HR = 0U; ETH->MACA1LR = 0U;ETH->MACA2HR = 0U; ETH->MACA2LR = 0U;ETH->MACA3HR = 0U; ETH->MACA3LR = 0U;return ARM_DRIVER_OK;}ETH->MACA1HR = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA1HR_AE;ETH->MACA1LR = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) |((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0];num_addr--;if (num_addr == 0U) {ETH->MACA2HR = 0U; ETH->MACA2LR = 0U;ETH->MACA3HR = 0U; ETH->MACA3LR = 0U;return ARM_DRIVER_OK;}ptr_addr++;ETH->MACA2HR = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA2HR_AE;ETH->MACA2LR = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) |((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0];num_addr--;if (num_addr == 0U) {ETH->MACA3HR = 0U; ETH->MACA3LR = 0U;return ARM_DRIVER_OK;}ptr_addr++;ETH->MACA3HR = ((uint32_t)ptr_addr->b[5] << 8) | (uint32_t)ptr_addr->b[4] | ETH_MACA3HR_AE;ETH->MACA3LR = ((uint32_t)ptr_addr->b[3] << 24) | ((uint32_t)ptr_addr->b[2] << 16) |((uint32_t)ptr_addr->b[1] << 8) | (uint32_t)ptr_addr->b[0];num_addr--;if (num_addr == 0U) {return ARM_DRIVER_OK;}ptr_addr++;/* 計算剩余MAC地址的64bit Hash表 */for ( ; num_addr; ptr_addr++, num_addr--) {crc = crc32_data (&ptr_addr->b[0], 6U) >> 26;if (crc & 0x20U) {ETH->MACHTHR |= (1U << (crc & 0x1FU));}else {ETH->MACHTLR |= (1U << crc);}}/* 使能單播和Hash地址過濾 */ETH->MACFFR |= ETH_MACFFR_HPF | ETH_MACFFR_HM;return ARM_DRIVER_OK; }

    函數描述:

    用于以太網MAC接收地址過濾,通過這個函數可以設置此設備可以接收到的MAC地址(設備本身MAC以外的地址)。MAC還可以通過函數ARM_ETH_MAC_Control 的參數ARM_ETH_MAC_CONFIGURE設置廣播和組播。

    函數參數:

    • ? 第1個參數是MAC地址列表。
    • ? 第2個參數是MAC地址個數。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_PARAMETER表示參數錯誤。

    6.5.9????? 函數SendFrame

    函數原型:

    static int32_t SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) {uint8_t *dst = Emac.frame_end;uint32_t ctrl;if ((frame == NULL) || (len == 0U)) {return ARM_DRIVER_ERROR_PARAMETER;}if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}if (dst == NULL) {/* 啟動新的傳輸幀 */if (tx_desc[Emac.tx_index].CtrlStat & DMA_TX_OWN) {/* 傳輸忙 */return ARM_DRIVER_ERROR_BUSY;}dst = tx_desc[Emac.tx_index].Addr;tx_desc[Emac.tx_index].Size = len;}else {/* 分步傳輸 */tx_desc[Emac.tx_index].Size += len;}/* 快速復制數據到ETH-DMA */for ( ; len > 7U; dst += 8, frame += 8, len -= 8U) {__UNALIGNED_UINT32_WRITE(&dst[0], __UNALIGNED_UINT32_READ(&frame[0]));__UNALIGNED_UINT32_WRITE(&dst[4], __UNALIGNED_UINT32_READ(&frame[4]));}/* 復制剩余字節 */for ( ; len > 1U; dst += 2, frame += 2, len -= 2U) {__UNALIGNED_UINT16_WRITE(&dst[0], __UNALIGNED_UINT16_READ(&frame[0]));}if (len > 0U) { dst++[0] = frame++[0]; }if (flags & ARM_ETH_MAC_TX_FRAME_FRAGMENT) {/* 還有數據,記錄當前寫入位置 */Emac.frame_end = dst;return ARM_DRIVER_OK;}/* 幀就緒,發送給DMA */ctrl = tx_desc[Emac.tx_index].CtrlStat & ~DMA_TX_CIC; #if (EMAC_CHECKSUM_OFFLOAD != 0)if (Emac.tx_cks_offload) {/* The following is a workaround for EMAC silicon problem: *//* "Incorrect layer 3 (L3) checksum is inserted in the sent *//* IPv4 fragmented packets." *//* Description: *//* When automatic checksum insertion is enabled and the packet *//* is IPv4 frame fragment, then the MAC may incorrectly insert *//* checksum into the packet. This corrupts the payload data *//* and generates checksum errors at the receiver. */uint16_t prot = __UNALIGNED_UINT16_READ(&tx_desc[Emac.tx_index].Addr[12]);uint16_t frag = __UNALIGNED_UINT16_READ(&tx_desc[Emac.tx_index].Addr[20]);if ((prot == 0x0008) && (frag & 0xFF3F)) {/* Insert only IP header checksum in fragmented frame */ctrl |= DMA_TX_CIC_IP;}else {/* Insert IP header and payload checksums (TCP,UDP,ICMP) */ctrl |= DMA_TX_CIC;}} #endifctrl &= ~(DMA_TX_IC | DMA_TX_TTSE);if (flags & ARM_ETH_MAC_TX_FRAME_EVENT) { ctrl |= DMA_TX_IC; } #if (EMAC_TIME_STAMP != 0)if (flags & ARM_ETH_MAC_TX_FRAME_TIMESTAMP) { ctrl |= DMA_TX_TTSE; }Emac.tx_ts_index = Emac.tx_index; #endiftx_desc[Emac.tx_index].CtrlStat = ctrl | DMA_TX_OWN;Emac.tx_index++;if (Emac.tx_index == NUM_TX_BUF) { Emac.tx_index = 0U; }Emac.frame_end = NULL;/* 啟動幀傳輸 */ETH->DMASR = ETH_DMASR_TPSS;ETH->DMATPDR = 0U;return ARM_DRIVER_OK; }

    函數描述:

    用于控制以太網幀數據的發送。此函數會將用戶要發送的數據存入到以太網DMA緩沖里面,而不必等待發送完成,只要有緩沖,就可以繼續往里面存數據。

    函數參數:

    • ? 第1個參數是要發送的數據地址。
    • ? 第2個參數是發送的字節數。
    • ? 第3個參數支持的配置如下:

    6.5.10 函數ReadFrame

    函數原型:

    static int32_t ReadFrame (uint8_t *frame, uint32_t len) {uint8_t const *src = rx_desc[Emac.rx_index].Addr;int32_t cnt = (int32_t)len;if ((frame == NULL) && (len != 0U)) {return ARM_DRIVER_ERROR_PARAMETER;}if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}/* 快速復制數據到幀緩沖 */for ( ; len > 7U; frame += 8, src += 8, len -= 8U) {__UNALIGNED_UINT32_WRITE(&frame[0], __UNALIGNED_UINT32_READ(&src[0]));__UNALIGNED_UINT32_WRITE(&frame[4], __UNALIGNED_UINT32_READ(&src[4]));}/* 復制剩余7字節 */for ( ; len > 1U; frame += 2, src += 2, len -= 2U) {__UNALIGNED_UINT16_WRITE(&frame[0], __UNALIGNED_UINT16_READ(&src[0]));}if (len > 0U) { frame[0] = src[0]; }/* 設置此塊到ETH-DMA */rx_desc[Emac.rx_index].Stat = DMA_RX_OWN;Emac.rx_index++;if (Emac.rx_index == NUM_RX_BUF) { Emac.rx_index = 0; }if (ETH->DMASR & ETH_DMASR_RBUS) {/* 沒有緩沖,釋放 */ETH->DMASR = ETH_DMASR_RBUS;ETH->DMARPDR = 0;}return (cnt); }

    函數描述:

    用于讀取以太網幀數據。

    函數參數:

    • ? 第1個參數是讀取數據的存儲地址。
    • ? 第2個參數存儲數據的緩沖大小。
    • ? 返回值,返回數值大于0,表示讀取的字節數,返回數值小于0表示出錯。

    注意事項:

    調用此函數前,需要先調用函數ARM_ETH_MAC_Control (ARM_ETH_MAC_CONTROL_RX , 1)使能接收。

    6.5.11 函數GetRxFrameSize

    函數原型:

    static uint32_t GetRxFrameSize (void) {uint32_t stat = rx_desc[Emac.rx_index].Stat;if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return (0U);}if (stat & DMA_RX_OWN) {/* DMA使用中 */return (0U);}if (((stat & DMA_RX_ES) != 0) ||((stat & DMA_RX_FS) == 0) ||((stat & DMA_RX_LS) == 0)) {/* 錯誤,塊無效 */return (0xFFFFFFFFU);}return (((stat & DMA_RX_FL) >> 16) - 4U); }

    函數描述:

    用于獲取接收到的幀大小,此函數會在ARM_ETH_MAC_ReadFrame之前被調用。

    函數參數:

    • ? 返回值,返回接收到的數據大小。

    注意事項:

    幀大小包括MAC地址和接收到數據。此函數返回數值0表示接收緩沖區里面沒有數據,如果接收到的數數據大于最大的幀大小或者小于最小的幀大小,都將被函數ARM_ETH_MAC_ReadFrame放棄。

    6.5.12 函數GetRxFrameTime

    函數原型:

    static int32_t GetRxFrameTime (ARM_ETH_MAC_TIME *time) { #if (EMAC_TIME_STAMP)RX_Desc *rxd = &rx_desc[Emac.rx_index];if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}if (rxd->Stat & DMA_RX_OWN) {/* DMA使用中 */return ARM_DRIVER_ERROR_BUSY;}time->ns = rxd->TimeLo;time->sec = rxd->TimeHi;return ARM_DRIVER_OK; #else(void)time;return ARM_DRIVER_ERROR; #endif }

    函數描述:

    用于獲取以太網接收幀時間戳。

    函數參數:

    • ? 第1個參數用于存儲獲取的以太網發送幀時間戳。
    • ? 回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    注意事項:

    必須在調用函數ARM_ETH_MAC_ReadFrame前,調用此函數。

    6.5.13 函數GetTxFrameSize

    函數原型:

    static int32_t GetTxFrameTime (ARM_ETH_MAC_TIME *time) { #if (EMAC_TIME_STAMP)TX_Desc *txd = &tx_desc[Emac.tx_ts_index];if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}if (txd->CtrlStat & DMA_RX_OWN) {/* DMA忙 */return ARM_DRIVER_ERROR_BUSY;}if ((txd->CtrlStat & DMA_TX_TTSS) == 0) {/* 驅動錯誤,發送時間戳不可用 */return ARM_DRIVER_ERROR;}time->ns = txd->TimeLo;time->sec = txd->TimeHi;return ARM_DRIVER_OK; #else(void)time;return ARM_DRIVER_ERROR; #endif }

    函數描述:

    用于獲取以太網發送幀時間戳。

    函數參數:

    • ? 第1個參數用于存儲返回的時間戳。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.5.14 函數ControlTimer

    函數原型:

    static int32_t ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) { #if (EMAC_TIME_STAMP != 0)if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}if ((control != ARM_ETH_MAC_TIMER_GET_TIME) && (control != ARM_ETH_MAC_TIMER_SET_TIME) && (control != ARM_ETH_MAC_TIMER_INC_TIME) && (control != ARM_ETH_MAC_TIMER_DEC_TIME) && (control != ARM_ETH_MAC_TIMER_SET_ALARM) && (control != ARM_ETH_MAC_TIMER_ADJUST_CLOCK)) {return ARM_DRIVER_ERROR_PARAMETER;}switch (control) {case ARM_ETH_MAC_TIMER_GET_TIME:/* 獲取當前時間 */time->sec = ETH->PTPTSHR;time->ns = ETH->PTPTSLR;break;case ARM_ETH_MAC_TIMER_SET_TIME:/* 設置新時間*/ETH->PTPTSHUR = time->sec;ETH->PTPTSLUR = time->ns;/* 初始TS */ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI;break;case ARM_ETH_MAC_TIMER_INC_TIME:/* 增加當前時間 */ETH->PTPTSHUR = time->sec;ETH->PTPTSLUR = time->ns;/* 更新 */ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU;break;case ARM_ETH_MAC_TIMER_DEC_TIME:/* 減少當前時間 */ETH->PTPTSHUR = time->sec;ETH->PTPTSLUR = time->ns | 0x80000000U;/* 更新 */ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU;break;case ARM_ETH_MAC_TIMER_SET_ALARM:/* 設置鬧鐘時間 */ETH->PTPTTHR = time->sec;ETH->PTPTTLR = time->ns;/* 使能PTP控制中的時間戳中斷 */ETH->PTPTSCR |= ETH_PTPTSCR_TSITE;if (time->sec || time->ns) {/* 使能時間戳觸發中斷 */ETH->MACIMR &= ~ETH_MACIMR_TSTIM;} else {/* 禁能時間戳觸發中斷 Disable */ETH->MACIMR |= ETH_MACIMR_TSTIM;}break;case ARM_ETH_MAC_TIMER_ADJUST_CLOCK:/* 調整當前時間,精確校準 *//* 校準因子Q31 (0x80000000 = 1.000000000) */ETH->PTPTSAR = (uint32_t)(((uint64_t)time->ns * ETH->PTPTSAR) >> 31);/* 精確的TS時鐘校準 */ETH->PTPTSCR |= ETH_PTPTSCR_TSARU;break;}return ARM_DRIVER_OK; #else(void)control;(void)time;return ARM_DRIVER_ERROR; #endif }

    函數描述:

    高精度定時器控制。

    函數參數:

    • ? 第1個參數是高精度定時器配置選項,支持的配置如下:

    • ? 第2個參數設置時間。
    • ? 返回值,設置正確返回ARM_DRIVER_OK,設置錯誤返回ARM_DRIVER_ERROR,而ARM_DRIVER_ERROR_UNSUPPORTED表示不支持。

    6.5.15 函數Control

    函數原型:

    static int32_t Control (uint32_t control, uint32_t arg) {uint32_t maccr;uint32_t dmaomr;uint32_t macffr;if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}if ((control != ARM_ETH_MAC_CONFIGURE) && (control != ARM_ETH_MAC_CONTROL_TX) && (control != ARM_ETH_MAC_CONTROL_RX) && (control != ARM_ETH_MAC_FLUSH) && (control != ARM_ETH_MAC_SLEEP) && (control != ARM_ETH_MAC_VLAN_FILTER)) {return ARM_DRIVER_ERROR_PARAMETER;}switch (control) {case ARM_ETH_MAC_CONFIGURE:maccr = ETH->MACCR & ~(ETH_MACCR_FES | ETH_MACCR_DM |ETH_MACCR_LM | ETH_MACCR_IPCO);/* 配置100Mbps或者10Mbps模式 */switch (arg & ARM_ETH_MAC_SPEED_Msk) {case ARM_ETH_MAC_SPEED_10M: #if (ETH_MII == 0)/* RMII Half Duplex Colision detection does not work */maccr |= ETH_MACCR_DM; #endifbreak;case ARM_ETH_SPEED_100M:maccr |= ETH_MACCR_FES;break;default:return ARM_DRIVER_ERROR_UNSUPPORTED;}/* 配置全雙工或者半雙工模式 */switch (arg & ARM_ETH_MAC_DUPLEX_Msk) {case ARM_ETH_MAC_DUPLEX_FULL:maccr |= ETH_MACCR_DM;break;case ARM_ETH_MAC_DUPLEX_HALF:break;default:return ARM_DRIVER_ERROR;}/* 配置回環模式 */if (arg & ARM_ETH_MAC_LOOPBACK) {maccr |= ETH_MACCR_LM;}dmaomr = ETH->DMAOMR & ~(ETH_DMAOMR_RSF| ETH_DMAOMR_TSF); #if (EMAC_CHECKSUM_OFFLOAD != 0)/* 使能接收校驗和驗證 */if (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) {maccr |= ETH_MACCR_IPCO;dmaomr |= ETH_DMAOMR_RSF;}/* 使能發送校驗和產生 */if (arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX) {dmaomr |= ETH_DMAOMR_TSF;Emac.tx_cks_offload = true;}else {Emac.tx_cks_offload = false;} #elseif ((arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_RX) ||(arg & ARM_ETH_MAC_CHECKSUM_OFFLOAD_TX)) {/* 驅動程序禁止了硬件校驗和 */return ARM_DRIVER_ERROR;} #endifETH->DMAOMR = dmaomr;ETH->MACCR = maccr;macffr = ETH->MACFFR & ~(ETH_MACFFR_PM | ETH_MACFFR_PAM | ETH_MACFFR_BFD);/* 使能廣播幀接收 */if ((arg & ARM_ETH_MAC_ADDRESS_BROADCAST) == 0) {macffr |= ETH_MACFFR_BFD;}/* 使能組播幀接收 */if (arg & ARM_ETH_MAC_ADDRESS_MULTICAST) {macffr |= ETH_MACFFR_PAM;}/* 設置無過濾,所有幀都可以接收 */if (arg & ARM_ETH_MAC_ADDRESS_ALL) {macffr |= ETH_MACFFR_PM;}ETH->MACFFR = macffr;break;case ARM_ETH_MAC_CONTROL_TX:/* 使能或者禁止MAC發送 */maccr = ETH->MACCR & ~ETH_MACCR_TE;dmaomr = ETH->DMAOMR & ~ETH_DMAOMR_ST;if (arg != 0) {init_dma ();maccr |= ETH_MACCR_TE;dmaomr |= ETH_DMAOMR_ST;}ETH->MACCR = maccr;ETH->DMAOMR = dmaomr;break;case ARM_ETH_MAC_CONTROL_RX:/* 使能或者禁止MAC接收 */maccr = ETH->MACCR & ~ETH_MACCR_RE;dmaomr = ETH->DMAOMR & ~ETH_DMAOMR_SR;if (arg != 0) {init_dma ();maccr |= ETH_MACCR_RE;dmaomr |= ETH_DMAOMR_SR;}ETH->MACCR = maccr;ETH->DMAOMR = dmaomr;break;case ARM_ETH_MAC_FLUSH:/* 清空發送或者接收緩沖 */if (arg & ARM_ETH_MAC_FLUSH_RX) {}if (arg & ARM_ETH_MAC_FLUSH_TX) {ETH->DMAOMR |= ETH_DMAOMR_FTF;}break;case ARM_ETH_MAC_VLAN_FILTER:/* 配置VLAN過濾 */ETH->MACVLANTR = arg;break;}return ARM_DRIVER_OK; }

    函數描述:

    用于MAC的配置

    函數參數:

    • ? 第1個參數支持的配置如下

    • ? 第2個參數針對第1個參數做的具體配置。
      • ? ARM_ETH_MAC_CONFIGURE 支持的配置:

      • ? ARM_ETH_MAC_CONTROL_TX

    0表示禁止發送,1表示使能發送。

      • ? ARM_ETH_MAC_CONTROL_RX

    0表示禁止接收,1表示使能接收。

      • ? ARM_ETH_MAC_FLUSH支持的配置:

    ARM_ETH_MAC_FLUSH_RX 表示接收清空。?????

    ARM_ETH_MAC_FLUSH_TX 表示發送清空。

      • ? VLAN濾波器支持的配置:

    6.5.16 函數PHY_Read

    函數原型:

    static int32_t PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data) {uint32_t val, tick;if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}val = ETH->MACMIIAR & ETH_MACMIIAR_CR;ETH->MACMIIAR = val | ETH_MACMIIAR_MB | ((uint32_t)phy_addr << 11) |((uint32_t)reg_addr << 6) ;/* 等待操作完成 */tick = HAL_GetTick();do {if ((ETH->MACMIIAR & ETH_MACMIIAR_MB) == 0U) { break; }} while ((HAL_GetTick() - tick) < PHY_TIMEOUT);if ((ETH->MACMIIAR & ETH_MACMIIAR_MB) == 0U) {*data = ETH->MACMIIDR & ETH_MACMIIDR_MD;return ARM_DRIVER_OK;}return ARM_DRIVER_ERROR_TIMEOUT; }

    函數描述:

    用于以太網PHY芯片的讀操作。

    函數參數:

    • ? 第1個參數是PHY地址。
    • ? 第2個參數是寄存器地址。
    • ? 第3個參數是寄存器寫入的數據。
    • ? 返回值,操作正確返回ARM_DRIVER_OK,操作錯誤返回ARM_DRIVER_ERROR。

    6.5.17 函數PHY_Write

    函數原型:

    static int32_t PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data) {uint32_t val, tick;if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {return ARM_DRIVER_ERROR;}ETH->MACMIIDR = data;val = ETH->MACMIIAR & ETH_MACMIIAR_CR;ETH->MACMIIAR = val | ETH_MACMIIAR_MB | ETH_MACMIIAR_MW | ((uint32_t)phy_addr << 11) |((uint32_t)reg_addr << 6) ;/* 等待操作完成 */tick = HAL_GetTick();do {if ((ETH->MACMIIAR & ETH_MACMIIAR_MB) == 0U) { break; }} while ((HAL_GetTick() - tick) < PHY_TIMEOUT);if ((ETH->MACMIIAR & ETH_MACMIIAR_MB) == 0U) {return ARM_DRIVER_OK;}return ARM_DRIVER_ERROR_TIMEOUT; }

    函數描述:

    用于以太網PHY芯片的寫操作。

    函數參數:

    • ? 第1個參數是PHY地址。
    • ? 第2個參數是寄存器地址。
    • ? 第3個參數是寄存器寫入的數據。
    • ? 返回值,操作正確返回ARM_DRIVER_OK,操作錯誤返回ARM_DRIVER_ERROR。

    6.6?? 總結

    本章節就為大家講解這么多,主要是為學習下個章節RL-TCPnet的移植做準備。學完本章后,務必將STM32參考手冊中MAC章節讀一遍。

    ?

    總結

    以上是生活随笔為你收集整理的【STM32F429】第6章 RL-TCPnet V7.X底层驱动说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    欧美性黑人 | 91精品国产乱码在线观看 | 久久婷婷网| www操操 | 中文字幕免费中文 | 制服丝袜天堂 | 国产精品免费在线播放 | 波多野结衣在线观看视频 | 午夜精品一二区 | 亚洲精品中文字幕视频 | 国产精品成人aaaaa网站 | 欧美综合久久 | 色久网 | 天天干夜夜夜 | 97超级碰碰碰碰久久久久 | 亚洲精品在线观 | 麻豆视频国产精品 | 成人免费一级片 | 欧美日韩一区二区久久 | 久久久久久久久久久免费av | 色com| 成片免费观看视频 | 精品嫩模福利一区二区蜜臀 | 久久成人国产精品免费软件 | 国产视频精品久久 | 欧美一级日韩免费不卡 | 亚洲高清av在线 | 久久久久久久久久久久av | www.大网伊人 | 成人免费网站在线观看 | 久久久久久久电影 | 在线免费观看黄色大片 | 日韩激情av在线 | 国产精品美女久久久久久久网站 | 蜜桃av观看 | 色多多污污 | 超碰在线cao | 午夜影视一区 | 国产日韩欧美自拍 | 亚洲视频999 | 亚洲精品国产精品国自产观看 | 成人在线观看网址 | 成人午夜电影网 | 五月天六月婷婷 | 欧美精品v国产精品v日韩精品 | 91成人在线观看高潮 | 色综合久久综合中文综合网 | 欧美日韩国产免费视频 | 欧美激情另类文学 | 久草在线视频中文 | 日日夜夜国产 | 国产精品入口a级 | 国产精品美女免费视频 | 亚洲黄色在线观看 | 久久免费视频这里只有精品 | 国产午夜亚洲精品 | 国内精品一区二区 | 天天综合网国产 | 欧美va电影| 91一区啪爱嗯打偷拍欧美 | 久久午夜羞羞影院 | 国产精品12345| 日韩精品一区二区三区在线视频 | 超碰成人av| 91成人免费看 | 国产又粗又猛又色 | 天天色天天色天天色 | 欧美日韩免费观看一区二区三区 | 国产中文字幕国产 | 91精品视频免费在线观看 | 深爱婷婷激情 | 亚洲精品在线观看中文字幕 | 国产精品第三页 | 亚洲黄a | 在线观看精品黄av片免费 | 久久人人97超碰com | 久久久www成人免费毛片麻豆 | 91国内在线 | 天堂av免费看 | 国产精品中文 | 欧美国产在线看 | 久久99亚洲网美利坚合众国 | 91成人破解版 | 在线免费av电影 | 精品欧美乱码久久久久久 | 国产一区视频在线观看免费 | 欧洲视频一区 | 三级黄色网址 | 午夜国产一区二区 | 国产a精品 | 精品久久综合 | 亚洲精品国精品久久99热 | 亚洲成av人电影 | 日韩高清在线不卡 | 精品国产伦一区二区三区 | 黄污污网站 | 国内精品久久久久久久影视麻豆 | 久久综合九色综合网站 | 久久久久国产精品www | 免费高清在线视频一区· | 国产精品ⅴa有声小说 | 久久国产女人 | 国产精品99精品久久免费 | 成人在线一区二区 | 久久久综合电影 | 国产亚洲精品久久久久久电影 | 欧美国产不卡 | 国产精品国产自产拍高清av | 日韩av片无码一区二区不卡电影 | 500部大龄熟乱视频使用方法 | 超碰在线观看99 | av一区二区在线观看中文字幕 | 99热99re6国产在线播放 | 久在线观看视频 | 欧美大香线蕉线伊人久久 | 国产成人精品一区二区三区在线 | 黄色一二级片 | 在线免费观看黄色小说 | 亚洲欧美在线视频免费 | 在线三级播放 | 国内免费的中文字幕 | 日韩在线观看免费 | 高潮久久久久久 | 在线视频a | 免费在线国产精品 | 福利一区二区三区四区 | 免费观看黄 | 国产99久久久国产精品免费二区 | 中文有码在线视频 | 亚洲欧美视频在线 | 91丨九色丨国产在线 | 在线免费看片 | 九草视频在线观看 | 欧美性生活久久 | 四虎在线免费观看 | 一区二区网 | 怡红院av久久久久久久 | 日本公妇在线观看 | 免费看黄色大全 | 精品国产欧美一区二区 | 91传媒免费在线观看 | 免费视频网| 五月天婷婷综合 | 干干操操| 久久久精品国产一区二区电影四季 | 国产九九热视频 | 在线观看国产麻豆 | 99在线精品视频在线观看 | 亚洲成人精品在线观看 | 欧美日本啪啪无遮挡网站 | 在线观看免费中文字幕 | 青青色影院 | 91在线视频 | 久久久久亚洲精品男人的天堂 | 日韩精品视频在线免费观看 | 亚洲精品啊啊啊 | 天干啦夜天干天干在线线 | 天天干天天拍天天操 | 激情综合六月 | 亚洲女人av| 正在播放五月婷婷狠狠干 | 亚洲免费在线视频 | 久久国产乱 | 国产一二三在线视频 | 欧美另类sm图片 | 欧洲视频一区 | 日韩mv欧美mv国产精品 | 日韩久久精品一区二区 | 久草视频网 | 日韩一区二区免费在线观看 | 国产视频欧美视频 | 日本在线视频一区二区三区 | 2021国产精品视频 | 香蕉在线视频观看 | 91人人澡人人爽人人精品 | 国产免费一区二区三区网站免费 | 日韩性色 | 国产精品va在线 | 麻豆91精品 | 欧美性性网| 日韩有码网站 | 国产精品免费久久久久影院仙踪林 | 91在线www | 九草在线视频 | 国产精品久久久久永久免费观看 | 免费在线观看日韩欧美 | 韩国精品在线观看 | 中文字幕在线专区 | 99久久婷婷国产综合亚洲 | 日韩欧美不卡 | 亚洲精品乱码 | 日韩视频免费在线 | 久久狠狠亚洲综合 | 深夜免费福利在线 | 国产成人黄色片 | 免费在线观看一区二区三区 | 中文字幕乱码亚洲精品一区 | 久久国产精品一区二区 | 日本女人在线观看 | 欧美91精品国产自产 | 国产精品麻豆欧美日韩ww | 国产精品视频最多的网站 | 国产一级精品在线观看 | 国产特级毛片aaaaaa高清 | 日韩中文字幕一区 | 亚洲va欧洲va国产va不卡 | www.久久婷婷 | 久久福利综合 | 国产精彩视频一区二区 | 亚洲精品美女久久久久 | av在线永久免费观看 | 一级黄色片在线免费观看 | 久久久受www免费人成 | 免费av网站在线看 | 少妇资源站 | 免费观看成人av | 久久久久久国产精品免费 | 99在线看| 91免费观看国产 | 午夜视频在线观看一区二区三区 | 亚洲精品在线观看不卡 | 国产毛片久久久 | 91一区啪爱嗯打偷拍欧美 | 三级视频片 | 欧美日韩不卡一区二区三区 | 久久开心激情 | 麻豆手机在线 | av超碰免费在线 | 国产精品乱码一区二区视频 | 一级a性色生活片久久毛片波多野 | 国产黄色片在线 | 91精品国产综合久久福利 | 国产欧美综合视频 | 成人在线播放网站 | 国产成人精品三级 | 午夜资源站 | 国语对白少妇爽91 | 国产日韩欧美在线播放 | 亚洲人久久 | 国产一区二区在线播放视频 | 国产一区二区不卡在线 | 欧美日韩视频在线观看一区二区 | 在线亚洲欧美视频 | 丁香婷婷综合色啪 | 日韩精品一区二区三区免费视频观看 | 久久免费在线视频 | 国产精品久久久久久久久久久杏吧 | 91人人在线 | 午夜精品久久久久久久爽 | 亚洲国产欧美一区二区三区丁香婷 | 在线视频app | 亚洲黄色av | 9免费视频 | 国产视频资源在线观看 | 日韩欧美专区 | 久久久精品网站 | 中文字幕一区二区三区四区 | 欧美有色 | 豆豆色资源网xfplay | 久操视频在线播放 | 国产午夜精品理论片在线 | 日韩精品久久久久久久电影竹菊 | 久久综合一本 | 国产视频1区2区3区 久久夜视频 | 一区二区三区四区精品视频 | 蜜臀久久99精品久久久久久网站 | av高清网站在线观看 | www.69xx| 99色99| 国产精品久久久久久久久久久免费看 | 天天干,天天射,天天操,天天摸 | 香蕉视频国产在线观看 | 日韩午夜视频在线观看 | 国产美女精品人人做人人爽 | 欧美日韩性 | 久久精品99精品国产香蕉 | 久草在线视频资源 | 91av中文| 在线视频免费观看 | 欧美乱熟臀69xxxxxx | 国产亚洲一区二区在线观看 | 美女网站视频色 | 中文字幕久久网 | 99r在线精品 | av夜夜操 | 最近最新中文字幕 | 可以免费观看的av片 | 国产一级黄色片免费看 | 免费在线观看av网址 | 成 人 黄 色 免费播放 | 天天躁日日躁狠狠躁av中文 | 日韩在线精品视频 | 天堂麻豆| 亚洲精品影视在线观看 | 中文字幕日韩高清 | 在线高清av| 国产亚洲观看 | 黄色毛片一级 | 日韩av免费在线看 | 日韩午夜电影 | 中文字幕在线色 | 亚洲成人国产 | 中文字幕在线观看完整版电影 | 在线观看的av | 国产91精品久久久久久 | www.夜夜操.com | 婷婷久久综合九色综合 | 麻豆视频一区二区 | 亚洲一区日韩精品 | 亚洲欧美日韩国产精品一区午夜 | 亚洲精品国产精品国自 | 久久夜色电影 | 久草在线综合网 | 丝袜美腿亚洲 | 欧美精品在线一区 | 日韩乱理 | 天天曰天天曰 | 久久国产精品精品国产色婷婷 | 在线亚洲播放 | 天天躁日日躁狠狠躁 | 国产精品99精品 | av大全在线观看 | 国产 精品 资源 | 天天天综合 | 免费日韩一区二区三区 | 成人精品亚洲 | 亚洲精品永久免费视频 | 99久久精品午夜一区二区小说 | 亚洲午夜精品福利 | 91久色蝌蚪 | 久久精品成人欧美大片古装 | 精品免费久久久久久 | 五月天婷婷在线播放 | 国产亚洲精品精品精品 | 欧美日韩综合在线观看 | 91成人在线观看喷潮 | 亚洲视频免费在线 | 国产精品99蜜臀久久不卡二区 | 欧美不卡在线 | 99精品亚洲 | 91免费高清在线观看 | www.com.日本一级 | 伊人久久影视 | 久久久久夜色 | 久福利 | 欧美精品中文字幕亚洲专区 | 亚洲精品乱码久久久久 | 中文字幕av日韩 | 99r国产精品| 天天伊人狠狠 | 97操操操 | av丁香| 日韩欧美一区二区三区免费观看 | 麻豆国产视频下载 | 天天操福利视频 | 精品国偷自产国产一区 | 91爱看片 | 久久狠狠亚洲综合 | 久久久久欠精品国产毛片国产毛生 | 欧美一级电影 | 国产自在线 | 成人午夜网址 | 黄网站免费久久 | 亚洲欧美观看 | 精品久久久网 | 最近中文字幕大全 | 黄色视屏av | www日韩在线 | 高清在线一区二区 | 91大神dom调教在线观看 | 成人永久视频 | 国产91影院 | 国产精品久久久久aaaa九色 | 91成人免费观看视频 | 十八岁免进欧美 | 青青河边草免费观看完整版高清 | 国产一区二区三区四区在线 | 午夜视频99 | 又黄又爽又无遮挡的视频 | 成人avav| 国产精品高清免费在线观看 | 午夜av激情 | 一区二区三区免费网站 | 久久精品激情 | 天天色视频 | 日韩色视频在线观看 | 日韩3区 | 99精品久久久久久久久久综合 | 亚洲精品777 | 国产精品免费人成网站 | 麻豆久久久久 | 亚洲影院国产 | 亚洲三级在线 | 在线看国产日韩 | 婷婷 综合 色 | 精品久久久久久久久久 | 精品一区二区6 | 色黄www小说| 久久毛片视频 | 日韩在线播放视频 | 日韩中文字幕免费 | 国产不卡在线看 | www.伊人网 | 欧美精品一区二区三区一线天视频 | 久久久久久久久国产 | 日一日干一干 | 亚洲a资源 | 91视频-88av | 免费黄在线看 | 亚洲夜夜爽| 亚洲不卡123 | 亚洲精品tv久久久久久久久久 | av在线一二三区 | 日韩激情视频在线 | 天天综合狠狠精品 | 日韩黄色免费在线观看 | 亚洲美女在线一区 | 韩国av一区二区 | av片在线看| 九九日韩 | 96精品高清视频在线观看软件特色 | 黄色a大片 | 黄色成人在线观看 | 欧美韩国在线 | 国产色婷婷精品综合在线手机播放 | 久久久国产电影 | 成人av午夜 | 国产精品成人免费一区久久羞羞 | 精品99在线观看 | 99久久国产免费,99久久国产免费大片 | 国产精品2020 | 四虎国产免费 | 99久热在线精品 | av播放在线 | 国产一区在线视频观看 | 亚洲精品黄 | 国产69久久| 一 级 黄 色 片免费看的 | 在线你懂的视频 | 青青草在久久免费久久免费 | 草久久久 | 在线看国产视频 | 中文字幕日韩电影 | 不卡的av在线 | 草久久久久久久 | 在线91观看 | 中文字幕日韩伦理 | 午夜精品一区二区三区在线 | 久久国产精品一区二区三区四区 | 久久天天躁狠狠躁亚洲综合公司 | 日韩专区在线播放 | 91在线小视频 | 蜜桃麻豆www久久囤产精品 | 狠狠色丁香婷婷综合久久片 | 天天天在线综合网 | 99热手机在线 | 久久精品日产第一区二区三区乱码 | 久久亚洲综合色 | 色吊丝在线永久观看最新版本 | 黄色片软件网站 | 日韩精品一区二区三区视频播放 | www黄色软件| 美女国内精品自产拍在线播放 | 在线免费观看一区二区三区 | 91精品免费视频 | 男女全黄一级一级高潮免费看 | 丁香六月婷婷 | 国产精品成人久久久久 | 久久成熟 | 久久久精品网 | 免费观看黄 | 久久激情影院 | 日韩精品在线免费播放 | 国产女教师精品久久av | 99免费在线观看 | 婷婷av网站 | 91视频 - 88av | 99热国产精品 | 免费观看v片在线观看 | 天天摸日日摸人人看 | 区一区二区三区中文字幕 | 人人玩人人添人人澡超碰 | 精品99在线观看 | 91精品色 | 久草网在线 | 在线电影日韩 | 国产视频一 | 国产在线播放一区二区三区 | 亚洲精品视频在线播放 | 韩日av在线 | 视频一区视频二区在线观看 | 热久久免费视频精品 | 日本公妇在线观看高清 | 在线亚洲高清视频 | 精品成人在线 | 亚洲精品国产精品国自产观看 | 久久综合久久综合这里只有精品 | 国产精品毛片久久久久久久 | 久久久久久高潮国产精品视 | 波多野结依在线观看 | 色综合 久久精品 | 国产成人精品亚洲日本在线观看 | 色婷婷狠狠干 | 日韩欧美视频免费看 | 四虎国产精品成人免费影视 | 国产尤物在线 | 国产精品永久在线观看 | 日日夜夜天天射 | 黄色三级视频片 | 免费在线黄色av | 国产精品综合在线观看 | 五月天天色 | 欧美 日韩 性 | 欧美激情综合五月色丁香 | 免费视频网 | 在线观看一区二区精品 | 中文字幕在线有码 | www最近高清中文国语在线观看 | 亚洲精品三级 | 国产黄色片在线 | 在线免费看黄网站 | 992tv在线观看网站 | 人人插人人艹 | 免费三级黄色 | 久久久首页 | 日本精品在线视频 | 久久成人高清视频 | 免费 在线 中文 日本 | 女人久久久久 | 超碰在线人人艹 | 精品一区二区综合 | 亚洲精品中文字幕视频 | 成人资源站 | 少妇bbbb搡bbbb桶 | 精品999久久久| 国精产品999国精产品视频 | 又黄又爽又湿又无遮挡的在线视频 | 又爽又黄又刺激的视频 | 日日夜夜人人天天 | 欧美亚洲免费在线一区 | 色资源二区在线视频 | 成年美女黄网站色大片免费看 | 国产精品久久久久久久久久ktv | 亚洲精品字幕在线观看 | 久久爱影视i | 婷婷伊人五月 | 国产精品亚洲片夜色在线 | aⅴ精品av导航 | 国精产品999国精产品岳 | 欧美日韩国产精品一区二区三区 | 一区二区三区四区精品视频 | 视频在线一区 | 国产伦精品一区二区三区在线 | 国产又粗又长的视频 | 久久精品一二区 | 色妞色视频一区二区三区四区 | 黄色a视频 | 中文字幕成人一区 | 超碰公开在线观看 | 欧美成人在线免费观看 | 麻豆综合网 | 国内精品视频一区二区三区八戒 | 黄色亚洲精品 | 99在线观看免费视频精品观看 | 国产日产精品一区二区三区四区 | 亚洲精品在线观看网站 | 97超级碰碰碰视频在线观看 | 青青河边草观看完整版高清 | 亚洲自拍自偷 | 在线播放亚洲 | 人人干天天干 | 日韩午夜电影 | 国产日韩一区在线 | 欧美成人999 | 在线看片a | 五月激情久久久 | 欧美精品一区二区三区一线天视频 | 亚洲成av人片 | 婷婷丁香色 | 99草视频在线观看 | 久久人人爽人人爽人人片av软件 | 午夜影视一区 | 中文字幕在线观看一区二区 | 久久夜色精品国产欧美乱极品 | 亚洲精品国产精品国自产观看浪潮 | 超碰在线97免费 | 在线成人免费 | 国产精品久久久久av免费 | 美女网站在线播放 | 欧美色婷 | 91女子私密保健养生少妇 | 成年人黄色在线观看 | 国产中文字幕在线视频 | 色在线观看网站 | 婷婷精品国产一区二区三区日韩 | 丝袜制服天堂 | 99热在线观看 | 成人久久久久久久久 | 日韩av快播电影网 | 91在线观 | 久久久精品99 | 就要色综合 | 国产成人一区二区啪在线观看 | 97成人资源 | 免费瑟瑟网站 | 99r在线 | 日本性久久 | 亚洲国产精品成人精品 | www夜夜操com | 在线观看精品黄av片免费 | 四虎在线免费观看 | 成年人毛片在线观看 | 黄色软件视频大全免费下载 | 99视频这里只有 | 国产视频中文字幕在线观看 | 中文字幕一区二区三区久久 | 九九久久免费 | 9999激情| bayu135国产精品视频 | 免费视频久久久久久久 | 国产高清中文字幕 | 亚洲黄色免费观看 | 成人午夜网址 | 99在线免费观看视频 | 亚洲精品小视频 | 免费观看国产成人 | 天天爱天天色 | 国产精品24小时在线观看 | 日韩一二三区不卡 | 97网站| 日韩在线观看视频免费 | 日韩美女免费线视频 | 免费网站在线观看人 | 久久夜色电影 | 免费在线国产视频 | 日日夜夜国产 | 成人a免费视频 | 亚洲精品小视频在线观看 | 国产一区二区三区午夜 | 97成人精品视频在线播放 | 欧美视频在线观看免费网址 | 国产69精品久久久久99尤 | 一区二区三区在线观看免费视频 | 91九色国产蝌蚪 | 在线看v片成人 | 91麻豆免费视频 | 日韩免费 | 超碰在线观看av.com | 在线观看视频你懂得 | 国产精品免费观看国产网曝瓜 | 久久国产精品免费一区 | 国产精品情侣视频 | 久久伦理视频 | 欧美最新大片在线看 | 日韩欧美综合在线视频 | 98涩涩国产露脸精品国产网 | 亚洲最大成人免费网站 | 7777精品伊人久久久大香线蕉 | 欧美日韩视频一区二区三区 | 天天干天天操天天操 | 久久精品国产精品亚洲 | 日韩精品中文字幕久久臀 | 天天玩天天干 | 欧美-第1页-屁屁影院 | 97视频在线观看网址 | 99久久99久久精品 | 又色又爽又黄高潮的免费视频 | 精品免费久久 | 韩国视频一区二区三区 | 狠狠干综合 | 美女黄频在线观看 | 日韩av电影免费在线观看 | 色橹橹欧美在线观看视频高清 | 精品国产1区2区3区 国产欧美精品在线观看 | 日韩网页 | 在线观看中文 | 国产69精品久久久久久 | 亚洲精品视频在线播放 | 91精品国产高清自在线观看 | 久久成年人视频 | 久久精品香蕉视频 | 日本不卡123 | 美腿丝袜一区二区三区 | 日韩在线电影一区 | 97人人添人澡人人爽超碰动图 | 成人v| av网站免费看| 国产亚洲亚洲 | av在线一二三区 | 麻豆首页| 国产一级二级三级视频 | 精品一区电影国产 | 婷婷色站 | 精品国产一区二区在线 | 热久久免费视频精品 | 夜夜骑天天操 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 91成人黄色| 久久99久久久久 | 欧美日韩午夜爽爽 | av在线播放观看 | 国产在线观看高清视频 | 狠狠操夜夜操 | 日韩精品一区电影 | 日韩在线电影一区二区 | 在线视频免费观看 | 狠狠色伊人亚洲综合网站色 | 很黄很污的视频网站 | 日韩精品一区二区三区视频播放 | 精品久久视频 | 国产小视频91 | 欧美日韩不卡在线观看 | 一本一道波多野毛片中文在线 | 欧美日韩国产精品一区二区三区 | 成人免费观看a | 男女啪啪视屏 | 日本二区三区在线 | 岛国av在线免费 | 狠狠色丁香久久婷婷综合五月 | 欧美在线视频二区 | a在线观看国产 | 在线观看免费福利 | av资源免费在线观看 | 国产福利中文字幕 | 国产精品免费看久久久8精臀av | 欧美一区二区免费在线观看 | 中文字幕电影高清在线观看 | 激情av在线资源 | 免费a v观看 | 成人午夜在线观看 | 日韩网站一区二区 | 69国产盗摄一区二区三区五区 | 91av观看| 91麻豆国产福利在线观看 | 欧美a性 | 菠萝菠萝蜜在线播放 | 日本黄网站 | 欧美a性| 97色在线观看 | 久久美女高清视频 | www色,com| 婷婷久久婷婷 | 欧洲性视频 | 亚洲精品在线观看视频 | 国产美女视频免费 | 激情五月综合 | 黄色大全免费网站 | 99精品乱码国产在线观看 | 五月色婷 | 8x8x在线观看视频 | 国产成人a v电影 | 国产一级免费观看 | 日韩精品字幕 | 欧美aa一级 | 日韩欧美视频一区二区 | 久久精品91久久久久久再现 | 国产粉嫩在线 | 日韩极品在线 | 久久精品观看 | 91高清视频 | 黄色在线观看免费 | 久草视频一区 | 一级免费看视频 | 日韩欧美视频 | 亚洲成人免费在线观看 | www日韩欧美 | 在线免费观看视频一区二区三区 | av网站在线免费观看 | 99麻豆视频| 色综合天天狠天天透天天伊人 | 欧美精品做受xxx性少妇 | www.狠狠色.com | 超碰人人在线观看 | 国产精品手机在线播放 | 久久香蕉电影 | 在线观看av免费 | 黄色资源网站 | 欧美日韩网址 | 国产精品11| 96精品视频 | 69久久久久久久 | 97看片网| 91最新国产 | 久久精品理论 | 色综合五月 | 久久久久9999亚洲精品 | 人人人爽| 精品国产自 | 天天射天天干天天插 | 天堂av最新网址 | 久久久久国产一区二区三区四区 | 91亚洲精品在线 | 涩涩伊人 | 国产亚洲精品久久久久久大师 | 国产免费小视频 | av免费成人 | 国产999精品久久久久久绿帽 | 最近日韩免费视频 | 国产亚洲人成网站在线观看 | 国产在线日韩 | 激情 亚洲 | 久久久久国产一区二区三区四区 | 久久久国产精品亚洲一区 | 亚洲成av人影片在线观看 | 国产美女视频 | 中文字幕亚洲欧美日韩 | 天天草综合 | 超碰人人干人人 | 奇米影音四色 | 天天干天天摸 | 91精品视频在线免费观看 | 国产精品孕妇 | 美女网站黄免费 | 国产精品18久久久久久久网站 | 久久精品在线免费观看 | 久青草国产在线 | 精品在线视频一区 | 最新色视频 | 五月婷丁香网 | 国内视频在线 | 欧美大片mv免费 | 亚洲精品美女 | 国产午夜精品久久 | 人人超碰免费 | 国产在线观看你懂得 | 亚洲视频 一区 | 午夜精品福利影院 | 又爽又黄在线观看 | 激情综合五月婷婷 | 国产三级精品在线 | 亚洲色综合 | 久久久麻豆精品一区二区 | 97精品视频在线播放 | 成人免费观看网站 | 免费观看十分钟 | 黄色的网站免费看 | 久久综合九色99 | av高清在线观看 | 亚洲乱码一区 | a午夜在线 | 午夜视频久久久 | 国产精品免费久久久久久久久久中文 | 午夜少妇av| 久久久久亚洲精品 | 91日本在线播放 | 久草国产精品 | 91久久精 | 99精品小视频 | 日日婷婷夜日日天干 | 国产视频久久久 | 五月婷婷导航 | 五月精品 | 91在线小视频 | 久久久久国产a免费观看rela | 国产成人精品综合久久久久99 | 97人人艹 | 综合色在线 | 蜜臀精品久久久久久蜜臀 | 精品日韩在线 | 男女激情网址 | 欧美一区成人 | 日韩在线精品一区 | 国产精品嫩草影院99网站 | 亚洲另类视频 | 亚洲精品福利在线 | 国产精品一区二区av影院萌芽 | 成人一级电影在线观看 | 中文字幕在线乱 | 久久国产精彩视频 | 国产精品入口66mio女同 | 精品久久国产精品 | 婷婷综合视频 | www黄色软件 | 欧美另类老妇 | 亚洲免费av一区二区 | 欧美一区二区在线刺激视频 | 亚洲一级在线观看 | 日韩视| 欧美精品在线视频 | 国产日韩精品一区二区在线观看播放 | 国色综合 | 最新国产一区二区三区 | 99久久婷婷国产综合精品 | 久久不卡日韩美女 | 亚洲国产免费看 | 成 人 黄 色 视频 免费观看 | 欧美日韩在线免费观看 | 日韩高清一区在线 | 丁香婷婷久久久综合精品国产 | 久久久久久久久久久久久久av | 亚洲国产精品人久久电影 | 九草在线视频 | 免费高清男女打扑克视频 | 亚洲一区免费在线 | 中文字幕中文字幕 | 最新日本中文字幕 | 欧美亚洲精品一区 | 日韩在线第一区 | 日韩精品在线观看av | 免费精品视频在线观看 | 久久视讯 | 国产小视频你懂的在线 | 97成人免费视频 | 人成在线免费视频 | 97在线观| 久久国产视频网站 | 色香蕉视频 | 又黄又刺激的网站 | 国产亚洲成人精品 | 成人av资源网 | 国产亚洲精品bv在线观看 | 五月婷社区 | 国产日韩精品久久 | av三区在线| 国产成人久久精品亚洲 | 日韩高清一二区 | 婷婷新五月 | 国产精品免费观看在线 | 99综合电影在线视频 | 婷婷在线网 | 国产精品涩涩屋www在线观看 | 亚洲精品网站 | 国产精品黄色在线观看 | 少妇bbb搡bbbb搡bbbb′ | 免费黄色一区 | 国产中文自拍 | 亚洲激情综合网 | 欧美极品xxxx | 中文字幕在线观看免费高清电影 | www.久久久久 | 色综合久久综合网 | 久99精品 | 人人射人人射 | 黄色h在线观看 | 天天摸天天弄 | av黄色国产 | 999免费视频| 奇米导航 | 超碰人人草人人 | 在线视频久久 | 久久久免费精品国产一区二区 | 中文字幕国产视频 | 又黄又爽又无遮挡的视频 | 成人黄大片视频在线观看 | 国产精品久久久久婷婷二区次 | 亚洲一区二区三区91 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久精品视频网址 | 91成人免费电影 | 中文字幕精品三区 | 亚洲色图 校园春色 | 日韩高清久久 | 91av在线播放 | 久久精品首页 | 免费久久99精品国产婷婷六月 | 成人在线免费视频 | 国产午夜不卡 | 国产主播大尺度精品福利免费 | 2019天天干夜夜操 | 亚洲色图激情文学 | 国产一级免费在线 | 国产91精品看黄网站在线观看动漫 | 天天爽天天搞 | 久久狠狠干 | 婷婷丁香六月天 | 99re久久资源最新地址 | 色婷婷在线视频 | 精品国产成人av | 亚洲视频每日更新 | 国产午夜三级一区二区三 | 9i看片成人免费看片 | av一本久道久久波多野结衣 | av高清一区二区三区 | 欧美日韩一区二区在线观看 | 毛片网站在线看 | 国产99久久九九精品免费 | 视频福利在线 | 黄色视屏在线免费观看 | 日韩性网站 | 制服丝袜成人在线 | 成人免费观看视频大全 | 毛片99 | 亚洲成年人在线播放 | 在线观看视频福利 | 亚洲精品中文在线 | 国产精品久久麻豆 | 国产精品免费久久久久久久久久中文 | 久草9视频 | 久艹视频在线免费观看 | 久久久久久久久久久久久久av | 国产精品永久免费在线 | 五月激情久久久 | 欧美污在线观看 | 欧美日韩国产欧美 | 免费在线激情电影 | 97在线影视| 亚洲国产久 | 91视频免费看网站 |