国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

這篇具有很好參考價(jià)值的文章主要介紹了【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

開(kāi)發(fā)環(huán)境

  • KEIL:MDK_ARM_5.27
  • MCU:STM32F429IGT6
  • PHY_IC:LAN8720A
  • LWIP:LWIP2.1.2
  • STM32CUBEMX:6.6.1
  • HAL:V1.27.1

LAN8720A使用RMII接口與STM32的ETH外設(shè)進(jìn)行數(shù)據(jù)通信
STM32使用SMI接口讀/寫(xiě)LAN8720A的寄存器

硬件原理圖

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
LAN8720A由外部25MHz晶振提供時(shí)鐘,LED2/NINTSEL引腳配置為下拉,故PHY(LAN8720A)提供50MHz時(shí)鐘給RMII的NINT/REFCLKO(此時(shí)引腳NINT/REFCLKO僅作為時(shí)鐘輸出,中斷功能不可用),RMII需要50MHz時(shí)鐘

LED1/REGOFF配置為下拉,使用LAN8720A內(nèi)部穩(wěn)壓器

上電后MODE引腳的電平會(huì)被鎖存,用于設(shè)置PHY的工作模式,后續(xù)也可以寫(xiě)寄存器來(lái)修改HPY工作模式,也可以設(shè)置PHY為自適應(yīng)模式,自動(dòng)適配最佳模式,然后通過(guò)讀寄存器來(lái)獲取PHY的工作模式,無(wú)非就是速率與雙工。

上電復(fù)位后,RXER/PHYAD0,引腳的電平被鎖存在一個(gè)內(nèi)部寄存器中;
可以使用硬件配置將設(shè)備的 SMI 地址配置為值 0 或 1,不接的話認(rèn)為為0。

CUBEMX配置

基本的時(shí)鐘、調(diào)試下載、Systick 不過(guò)多介紹

PHY引腳配置

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

設(shè)置MAC地址、接收緩沖區(qū)的大小、數(shù)據(jù)接收模式

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

設(shè)置PHY的類型為L(zhǎng)AN8742A

(最好根據(jù)LAN8742A來(lái)設(shè)置自己使用的PHY,否則CUBEMX不會(huì)生成void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)GPIO、DMA、NVIC等初始化函數(shù))
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
這些生成的宏均在路徑Core\Inc\stm32f4xx_hal_conf.h下,大家可以去看看

生成的void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)在工程文件夾LWIP\Target\ethernetif.c下
在生成的HAL_ETH_MspInit()函數(shù)中添加PHY上電復(fù)位代碼(其實(shí)也可以不用添加,HAL庫(kù)生成會(huì)通過(guò)寫(xiě)B(tài)CR寄存器RESET位來(lái)實(shí)現(xiàn)軟件復(fù)位,然后讀取RESET位來(lái)確認(rèn)是否PHY已經(jīng)復(fù)位完畢)

HAL庫(kù)生成的HAL_ETH_MspInit()如下:

/**
  * @brief  Initializes the ETH MSP.
  * @param  ethHandle: ETH handle
  * @retval None
  */

void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(ethHandle->Instance==ETH)
  {
  /* USER CODE BEGIN ETH_MspInit 0 */

  /* USER CODE END ETH_MspInit 0 */
    /* Enable Peripheral clock */
    __HAL_RCC_ETH_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    /**ETH GPIO Configuration
    PC1     ------> ETH_MDC
    PA1     ------> ETH_REF_CLK
    PA2     ------> ETH_MDIO
    PA7     ------> ETH_CRS_DV
    PC4     ------> ETH_RXD0
    PC5     ------> ETH_RXD1
    PB11     ------> ETH_TX_EN
    PG13     ------> ETH_TXD0
    PG14     ------> ETH_TXD1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /* USER CODE BEGIN ETH_MspInit 1 */

    /* 手動(dòng)添加 PHY 需要的復(fù)位延時(shí)代碼 */
    HAL_GPIO_WritePin(LAN8720A_RESET_GPIO_Port, LAN8720A_RESET_Pin, GPIO_PIN_RESET);
    HAL_Delay(60);
    HAL_GPIO_WritePin(LAN8720A_RESET_GPIO_Port, LAN8720A_RESET_Pin, GPIO_PIN_SET);
    HAL_Delay(60);

  /* USER CODE END ETH_MspInit 1 */
  }
}

void HAL_ETH_MspDeInit(ETH_HandleTypeDef* ethHandle)
{
  if(ethHandle->Instance==ETH)
  {
  /* USER CODE BEGIN ETH_MspDeInit 0 */

  /* USER CODE END ETH_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ETH_CLK_DISABLE();

    /**ETH GPIO Configuration
    PC1     ------> ETH_MDC
    PA1     ------> ETH_REF_CLK
    PA2     ------> ETH_MDIO
    PA7     ------> ETH_CRS_DV
    PC4     ------> ETH_RXD0
    PC5     ------> ETH_RXD1
    PB11     ------> ETH_TX_EN
    PG13     ------> ETH_TXD0
    PG14     ------> ETH_TXD1
    */
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5);

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7);

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11);

    HAL_GPIO_DeInit(GPIOG, GPIO_PIN_13|GPIO_PIN_14);

  /* USER CODE BEGIN ETH_MspDeInit 1 */

  /* USER CODE END ETH_MspDeInit 1 */
  }
}

設(shè)置PHY寄存器及相應(yīng)掩碼

打開(kāi) Drivers\BSP\Components\lan8742\lan8742.h 對(duì)照LAN8720A的BCR寄存器修改相應(yīng)位的掩碼

/**
  ******************************************************************************
  * @file    lan8742.h
  * @author  MCD Application Team
  * @brief   This file contains all the functions prototypes for the
  *          lan8742.c PHY driver.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */ 

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef LAN8742_H
#define LAN8742_H

#ifdef __cplusplus
 extern "C" {
#endif   
   
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/** @addtogroup BSP
  * @{
  */ 

/** @addtogroup Component
  * @{
  */
    
/** @defgroup LAN8742
  * @{
  */    
/* Exported constants --------------------------------------------------------*/
/** @defgroup LAN8742_Exported_Constants LAN8742 Exported Constants
  * @{
  */ 
  
/** @defgroup LAN8742_Registers_Mapping LAN8742 Registers Mapping
  * @{
  */ 
#define LAN8742_BCR      ((uint16_t)0x0000U)
#define LAN8742_BSR      ((uint16_t)0x0001U)
#define LAN8742_PHYI1R   ((uint16_t)0x0002U)
#define LAN8742_PHYI2R   ((uint16_t)0x0003U)
#define LAN8742_ANAR     ((uint16_t)0x0004U)
#define LAN8742_ANLPAR   ((uint16_t)0x0005U)
#define LAN8742_ANER     ((uint16_t)0x0006U)
#define LAN8742_ANNPTR   ((uint16_t)0x0007U)
#define LAN8742_ANNPRR   ((uint16_t)0x0008U)
#define LAN8742_MMDACR   ((uint16_t)0x000DU)
#define LAN8742_MMDAADR  ((uint16_t)0x000EU)
#define LAN8742_ENCTR    ((uint16_t)0x0010U)
#define LAN8742_MCSR     ((uint16_t)0x0011U)
#define LAN8742_SMR      ((uint16_t)0x0012U)
#define LAN8742_TPDCR    ((uint16_t)0x0018U)
#define LAN8742_TCSR     ((uint16_t)0x0019U)
#define LAN8742_SECR     ((uint16_t)0x001AU)
#define LAN8742_SCSIR    ((uint16_t)0x001BU)
#define LAN8742_CLR      ((uint16_t)0x001CU)
#define LAN8742_ISFR     ((uint16_t)0x001DU)
#define LAN8742_IMR      ((uint16_t)0x001EU)
#define LAN8742_PHYSCSR  ((uint16_t)0x001FU)
/**
  * @}
  */

/** @defgroup LAN8742_BCR_Bit_Definition LAN8742 BCR Bit Definition
  * @{
  */    
#define LAN8742_BCR_SOFT_RESET         ((uint16_t)0x8000U)
#define LAN8742_BCR_LOOPBACK           ((uint16_t)0x4000U)
#define LAN8742_BCR_SPEED_SELECT       ((uint16_t)0x2000U)
#define LAN8742_BCR_AUTONEGO_EN        ((uint16_t)0x1000U)
#define LAN8742_BCR_POWER_DOWN         ((uint16_t)0x0800U)
#define LAN8742_BCR_ISOLATE            ((uint16_t)0x0400U)
#define LAN8742_BCR_RESTART_AUTONEGO   ((uint16_t)0x0200U)
#define LAN8742_BCR_DUPLEX_MODE        ((uint16_t)0x0100U) 
/**
  * @}
  */

/** @defgroup LAN8742_BSR_Bit_Definition LAN8742 BSR Bit Definition
  * @{
  */   
#define LAN8742_BSR_100BASE_T4       ((uint16_t)0x8000U)
#define LAN8742_BSR_100BASE_TX_FD    ((uint16_t)0x4000U)
#define LAN8742_BSR_100BASE_TX_HD    ((uint16_t)0x2000U)
#define LAN8742_BSR_10BASE_T_FD      ((uint16_t)0x1000U)
#define LAN8742_BSR_10BASE_T_HD      ((uint16_t)0x0800U)
#define LAN8742_BSR_100BASE_T2_FD    ((uint16_t)0x0400U)
#define LAN8742_BSR_100BASE_T2_HD    ((uint16_t)0x0200U)
#define LAN8742_BSR_EXTENDED_STATUS  ((uint16_t)0x0100U)
#define LAN8742_BSR_AUTONEGO_CPLT    ((uint16_t)0x0020U)
#define LAN8742_BSR_REMOTE_FAULT     ((uint16_t)0x0010U)
#define LAN8742_BSR_AUTONEGO_ABILITY ((uint16_t)0x0008U)
#define LAN8742_BSR_LINK_STATUS      ((uint16_t)0x0004U)
#define LAN8742_BSR_JABBER_DETECT    ((uint16_t)0x0002U)
#define LAN8742_BSR_EXTENDED_CAP     ((uint16_t)0x0001U)
/**
  * @}
  */

/** @defgroup LAN8742_PHYI1R_Bit_Definition LAN8742 PHYI1R Bit Definition
  * @{
  */
#define LAN8742_PHYI1R_OUI_3_18           ((uint16_t)0xFFFFU)
/**
  * @}
  */

/** @defgroup LAN8742_PHYI2R_Bit_Definition LAN8742 PHYI2R Bit Definition
  * @{
  */
#define LAN8742_PHYI2R_OUI_19_24          ((uint16_t)0xFC00U)
#define LAN8742_PHYI2R_MODEL_NBR          ((uint16_t)0x03F0U)
#define LAN8742_PHYI2R_REVISION_NBR       ((uint16_t)0x000FU)
/**
  * @}
  */

/** @defgroup LAN8742_ANAR_Bit_Definition LAN8742 ANAR Bit Definition
  * @{
  */
#define LAN8742_ANAR_NEXT_PAGE               ((uint16_t)0x8000U)
#define LAN8742_ANAR_REMOTE_FAULT            ((uint16_t)0x2000U)
#define LAN8742_ANAR_PAUSE_OPERATION         ((uint16_t)0x0C00U)
#define LAN8742_ANAR_PO_NOPAUSE              ((uint16_t)0x0000U)
#define LAN8742_ANAR_PO_SYMMETRIC_PAUSE      ((uint16_t)0x0400U)
#define LAN8742_ANAR_PO_ASYMMETRIC_PAUSE     ((uint16_t)0x0800U)
#define LAN8742_ANAR_PO_ADVERTISE_SUPPORT    ((uint16_t)0x0C00U)
#define LAN8742_ANAR_100BASE_TX_FD           ((uint16_t)0x0100U)
#define LAN8742_ANAR_100BASE_TX              ((uint16_t)0x0080U)
#define LAN8742_ANAR_10BASE_T_FD             ((uint16_t)0x0040U)
#define LAN8742_ANAR_10BASE_T                ((uint16_t)0x0020U)
#define LAN8742_ANAR_SELECTOR_FIELD          ((uint16_t)0x000FU)
/**
  * @}
  */

/** @defgroup LAN8742_ANLPAR_Bit_Definition LAN8742 ANLPAR Bit Definition
  * @{
  */
#define LAN8742_ANLPAR_NEXT_PAGE            ((uint16_t)0x8000U)
#define LAN8742_ANLPAR_REMOTE_FAULT         ((uint16_t)0x2000U)
#define LAN8742_ANLPAR_PAUSE_OPERATION      ((uint16_t)0x0C00U)
#define LAN8742_ANLPAR_PO_NOPAUSE           ((uint16_t)0x0000U)
#define LAN8742_ANLPAR_PO_SYMMETRIC_PAUSE   ((uint16_t)0x0400U)
#define LAN8742_ANLPAR_PO_ASYMMETRIC_PAUSE  ((uint16_t)0x0800U)
#define LAN8742_ANLPAR_PO_ADVERTISE_SUPPORT ((uint16_t)0x0C00U)
#define LAN8742_ANLPAR_100BASE_TX_FD        ((uint16_t)0x0100U)
#define LAN8742_ANLPAR_100BASE_TX           ((uint16_t)0x0080U)
#define LAN8742_ANLPAR_10BASE_T_FD          ((uint16_t)0x0040U)
#define LAN8742_ANLPAR_10BASE_T             ((uint16_t)0x0020U)
#define LAN8742_ANLPAR_SELECTOR_FIELD       ((uint16_t)0x000FU)
/**
  * @}
  */

/** @defgroup LAN8742_ANER_Bit_Definition LAN8742 ANER Bit Definition
  * @{
  */
#define LAN8742_ANER_RX_NP_LOCATION_ABLE    ((uint16_t)0x0040U)
#define LAN8742_ANER_RX_NP_STORAGE_LOCATION ((uint16_t)0x0020U)
#define LAN8742_ANER_PARALLEL_DETECT_FAULT  ((uint16_t)0x0010U)
#define LAN8742_ANER_LP_NP_ABLE             ((uint16_t)0x0008U)
#define LAN8742_ANER_NP_ABLE                ((uint16_t)0x0004U)
#define LAN8742_ANER_PAGE_RECEIVED          ((uint16_t)0x0002U)
#define LAN8742_ANER_LP_AUTONEG_ABLE        ((uint16_t)0x0001U)
/**
  * @}
  */

/** @defgroup LAN8742_ANNPTR_Bit_Definition LAN8742 ANNPTR Bit Definition
  * @{
  */
#define LAN8742_ANNPTR_NEXT_PAGE         ((uint16_t)0x8000U)
#define LAN8742_ANNPTR_MESSAGE_PAGE      ((uint16_t)0x2000U)
#define LAN8742_ANNPTR_ACK2              ((uint16_t)0x1000U)
#define LAN8742_ANNPTR_TOGGLE            ((uint16_t)0x0800U)
#define LAN8742_ANNPTR_MESSAGGE_CODE     ((uint16_t)0x07FFU)
/**
  * @}
  */

/** @defgroup LAN8742_ANNPRR_Bit_Definition LAN8742 ANNPRR Bit Definition
  * @{
  */
#define LAN8742_ANNPTR_NEXT_PAGE         ((uint16_t)0x8000U)
#define LAN8742_ANNPRR_ACK               ((uint16_t)0x4000U)
#define LAN8742_ANNPRR_MESSAGE_PAGE      ((uint16_t)0x2000U)
#define LAN8742_ANNPRR_ACK2              ((uint16_t)0x1000U)
#define LAN8742_ANNPRR_TOGGLE            ((uint16_t)0x0800U)
#define LAN8742_ANNPRR_MESSAGGE_CODE     ((uint16_t)0x07FFU)
/**
  * @}
  */

/** @defgroup LAN8742_MMDACR_Bit_Definition LAN8742 MMDACR Bit Definition
  * @{
  */
#define LAN8742_MMDACR_MMD_FUNCTION       ((uint16_t)0xC000U) 
#define LAN8742_MMDACR_MMD_FUNCTION_ADDR  ((uint16_t)0x0000U)
#define LAN8742_MMDACR_MMD_FUNCTION_DATA  ((uint16_t)0x4000U)
#define LAN8742_MMDACR_MMD_DEV_ADDR       ((uint16_t)0x001FU)
/**
  * @}
  */

/** @defgroup LAN8742_ENCTR_Bit_Definition LAN8742 ENCTR Bit Definition
  * @{
  */
#define LAN8742_ENCTR_TX_ENABLE             ((uint16_t)0x8000U)
#define LAN8742_ENCTR_TX_TIMER              ((uint16_t)0x6000U)
#define LAN8742_ENCTR_TX_TIMER_1S           ((uint16_t)0x0000U)
#define LAN8742_ENCTR_TX_TIMER_768MS        ((uint16_t)0x2000U)
#define LAN8742_ENCTR_TX_TIMER_512MS        ((uint16_t)0x4000U)
#define LAN8742_ENCTR_TX_TIMER_265MS        ((uint16_t)0x6000U)
#define LAN8742_ENCTR_RX_ENABLE             ((uint16_t)0x1000U)
#define LAN8742_ENCTR_RX_MAX_INTERVAL       ((uint16_t)0x0C00U)
#define LAN8742_ENCTR_RX_MAX_INTERVAL_64MS  ((uint16_t)0x0000U)
#define LAN8742_ENCTR_RX_MAX_INTERVAL_256MS ((uint16_t)0x0400U)
#define LAN8742_ENCTR_RX_MAX_INTERVAL_512MS ((uint16_t)0x0800U)
#define LAN8742_ENCTR_RX_MAX_INTERVAL_1S    ((uint16_t)0x0C00U)
#define LAN8742_ENCTR_EX_CROSS_OVER         ((uint16_t)0x0002U)
#define LAN8742_ENCTR_EX_MANUAL_CROSS_OVER  ((uint16_t)0x0001U)
/**
  * @}
  */

/** @defgroup LAN8742_MCSR_Bit_Definition LAN8742 MCSR Bit Definition
  * @{
  */
#define LAN8742_MCSR_EDPWRDOWN        ((uint16_t)0x2000U)
#define LAN8742_MCSR_FARLOOPBACK      ((uint16_t)0x0200U)
#define LAN8742_MCSR_ALTINT           ((uint16_t)0x0040U)
#define LAN8742_MCSR_ENERGYON         ((uint16_t)0x0002U)
/**
  * @}
  */

/** @defgroup LAN8742_SMR_Bit_Definition LAN8742 SMR Bit Definition
  * @{
  */
#define LAN8742_SMR_MODE       ((uint16_t)0x00E0U)
#define LAN8742_SMR_PHY_ADDR   ((uint16_t)0x001FU)
/**
  * @}
  */

/** @defgroup LAN8742_TPDCR_Bit_Definition LAN8742 TPDCR Bit Definition
  * @{
  */
#define LAN8742_TPDCR_DELAY_IN                 ((uint16_t)0x8000U)
#define LAN8742_TPDCR_LINE_BREAK_COUNTER       ((uint16_t)0x7000U)
#define LAN8742_TPDCR_PATTERN_HIGH             ((uint16_t)0x0FC0U)
#define LAN8742_TPDCR_PATTERN_LOW              ((uint16_t)0x003FU)
/**
  * @}
  */

/** @defgroup LAN8742_TCSR_Bit_Definition LAN8742 TCSR Bit Definition
  * @{
  */
#define LAN8742_TCSR_TDR_ENABLE           ((uint16_t)0x8000U)
#define LAN8742_TCSR_TDR_AD_FILTER_ENABLE ((uint16_t)0x4000U)
#define LAN8742_TCSR_TDR_CH_CABLE_TYPE    ((uint16_t)0x0600U)
#define LAN8742_TCSR_TDR_CH_CABLE_DEFAULT ((uint16_t)0x0000U)
#define LAN8742_TCSR_TDR_CH_CABLE_SHORTED ((uint16_t)0x0200U)
#define LAN8742_TCSR_TDR_CH_CABLE_OPEN    ((uint16_t)0x0400U)
#define LAN8742_TCSR_TDR_CH_CABLE_MATCH   ((uint16_t)0x0600U)
#define LAN8742_TCSR_TDR_CH_STATUS        ((uint16_t)0x0100U)
#define LAN8742_TCSR_TDR_CH_LENGTH        ((uint16_t)0x00FFU)
/**
  * @}
  */

/** @defgroup LAN8742_SCSIR_Bit_Definition LAN8742 SCSIR Bit Definition
  * @{
  */
#define LAN8742_SCSIR_AUTO_MDIX_ENABLE    ((uint16_t)0x8000U)
#define LAN8742_SCSIR_CHANNEL_SELECT      ((uint16_t)0x2000U)
#define LAN8742_SCSIR_SQE_DISABLE         ((uint16_t)0x0800U)
#define LAN8742_SCSIR_XPOLALITY           ((uint16_t)0x0010U)
/**
  * @}
  */

/** @defgroup LAN8742_CLR_Bit_Definition LAN8742 CLR Bit Definition
  * @{
  */
#define LAN8742_CLR_CABLE_LENGTH       ((uint16_t)0xF000U)
/**
  * @}
  */

/** @defgroup LAN8742_IMR_ISFR_Bit_Definition LAN8742 IMR ISFR Bit Definition
  * @{
  */
#define LAN8742_INT_8       ((uint16_t)0x0100U)
#define LAN8742_INT_7       ((uint16_t)0x0080U)
#define LAN8742_INT_6       ((uint16_t)0x0040U)
#define LAN8742_INT_5       ((uint16_t)0x0020U)
#define LAN8742_INT_4       ((uint16_t)0x0010U)
#define LAN8742_INT_3       ((uint16_t)0x0008U)
#define LAN8742_INT_2       ((uint16_t)0x0004U)
#define LAN8742_INT_1       ((uint16_t)0x0002U)
/**
  * @}
  */

/** @defgroup LAN8742_PHYSCSR_Bit_Definition LAN8742 PHYSCSR Bit Definition
  * @{
  */
#define LAN8742_PHYSCSR_AUTONEGO_DONE   ((uint16_t)0x1000U)
#define LAN8742_PHYSCSR_HCDSPEEDMASK    ((uint16_t)0x001CU)
#define LAN8742_PHYSCSR_10BT_HD         ((uint16_t)0x0004U)
#define LAN8742_PHYSCSR_10BT_FD         ((uint16_t)0x0014U)
#define LAN8742_PHYSCSR_100BTX_HD       ((uint16_t)0x0008U)
#define LAN8742_PHYSCSR_100BTX_FD       ((uint16_t)0x0018U) 
/**
  * @}
  */
    
/** @defgroup LAN8742_Status LAN8742 Status
  * @{
  */    

#define  LAN8742_STATUS_READ_ERROR            ((int32_t)-5)
#define  LAN8742_STATUS_WRITE_ERROR           ((int32_t)-4)
#define  LAN8742_STATUS_ADDRESS_ERROR         ((int32_t)-3)
#define  LAN8742_STATUS_RESET_TIMEOUT         ((int32_t)-2)
#define  LAN8742_STATUS_ERROR                 ((int32_t)-1)
#define  LAN8742_STATUS_OK                    ((int32_t) 0)
#define  LAN8742_STATUS_LINK_DOWN             ((int32_t) 1)
#define  LAN8742_STATUS_100MBITS_FULLDUPLEX   ((int32_t) 2)
#define  LAN8742_STATUS_100MBITS_HALFDUPLEX   ((int32_t) 3)
#define  LAN8742_STATUS_10MBITS_FULLDUPLEX    ((int32_t) 4)
#define  LAN8742_STATUS_10MBITS_HALFDUPLEX    ((int32_t) 5)
#define  LAN8742_STATUS_AUTONEGO_NOTDONE      ((int32_t) 6)
/**
  * @}
  */

/** @defgroup LAN8742_IT_Flags LAN8742 IT Flags
  * @{
  */     
#define  LAN8742_WOL_IT                        LAN8742_INT_8
#define  LAN8742_ENERGYON_IT                   LAN8742_INT_7
#define  LAN8742_AUTONEGO_COMPLETE_IT          LAN8742_INT_6
#define  LAN8742_REMOTE_FAULT_IT               LAN8742_INT_5
#define  LAN8742_LINK_DOWN_IT                  LAN8742_INT_4
#define  LAN8742_AUTONEGO_LP_ACK_IT            LAN8742_INT_3
#define  LAN8742_PARALLEL_DETECTION_FAULT_IT   LAN8742_INT_2
#define  LAN8742_AUTONEGO_PAGE_RECEIVED_IT     LAN8742_INT_1
/**
  * @}
  */

/**
  * @}
  */

/* Exported types ------------------------------------------------------------*/ 
/** @defgroup LAN8742_Exported_Types LAN8742 Exported Types
  * @{
  */
typedef int32_t  (*lan8742_Init_Func) (void); 
typedef int32_t  (*lan8742_DeInit_Func) (void);
typedef int32_t  (*lan8742_ReadReg_Func)   (uint32_t, uint32_t, uint32_t *);
typedef int32_t  (*lan8742_WriteReg_Func)  (uint32_t, uint32_t, uint32_t);
typedef int32_t  (*lan8742_GetTick_Func)  (void);

typedef struct 
{                   
  lan8742_Init_Func      Init; 
  lan8742_DeInit_Func    DeInit;
  lan8742_WriteReg_Func  WriteReg;
  lan8742_ReadReg_Func   ReadReg; 
  lan8742_GetTick_Func   GetTick;   
} lan8742_IOCtx_t;  

  
typedef struct 
{
  uint32_t            DevAddr;
  uint32_t            Is_Initialized;
  lan8742_IOCtx_t     IO;
  void               *pData;
}lan8742_Object_t;
/**
  * @}
  */ 

/* Exported macro ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
/** @defgroup LAN8742_Exported_Functions LAN8742 Exported Functions
  * @{
  */
int32_t LAN8742_RegisterBusIO(lan8742_Object_t *pObj, lan8742_IOCtx_t *ioctx);
int32_t LAN8742_Init(lan8742_Object_t *pObj);
int32_t LAN8742_DeInit(lan8742_Object_t *pObj);
int32_t LAN8742_DisablePowerDownMode(lan8742_Object_t *pObj);
int32_t LAN8742_EnablePowerDownMode(lan8742_Object_t *pObj);
int32_t LAN8742_StartAutoNego(lan8742_Object_t *pObj);
int32_t LAN8742_GetLinkState(lan8742_Object_t *pObj);
int32_t LAN8742_SetLinkState(lan8742_Object_t *pObj, uint32_t LinkState);
int32_t LAN8742_EnableLoopbackMode(lan8742_Object_t *pObj);
int32_t LAN8742_DisableLoopbackMode(lan8742_Object_t *pObj);
int32_t LAN8742_EnableIT(lan8742_Object_t *pObj, uint32_t Interrupt);
int32_t LAN8742_DisableIT(lan8742_Object_t *pObj, uint32_t Interrupt);
int32_t LAN8742_ClearIT(lan8742_Object_t *pObj, uint32_t Interrupt);
int32_t LAN8742_GetITStatus(lan8742_Object_t *pObj, uint32_t Interrupt);
/**
  * @}
  */ 

#ifdef __cplusplus
}
#endif
#endif /* LAN8742_H */


/**
  * @}
  */ 

/**
  * @}
  */

/**
  * @}
  */ 

/**
  * @}
  */       
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
LAN8720A的BSR寄存器
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

注意GPIO復(fù)用

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

LWIP配置

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

添加代碼

  • 復(fù)位PHY引腳
    本次PI1連接PHY的復(fù)位引腳,低電平復(fù)位
    在生成的void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)在工程文件夾LWIP\Target\ethernetif.c下添加復(fù)位PHY代碼,具體延時(shí)時(shí)間根據(jù)PHY來(lái)設(shè)置

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

  • PHY配置
    置位LAN8720A的自動(dòng)協(xié)商(自適應(yīng)、自動(dòng)適配,速率與雙工)并等待配置完畢
    在Drivers\BSP\Components\lan8742\lan8742.c的函數(shù)LAN8742_Init()
    注意:每次配置最好做備份,因?yàn)槊渴褂肅UBEMX生成工程,用戶代碼都會(huì)被清除
    【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)
  • 主函數(shù)中添加MX_LWIP_Process();
  • Keil工程配置,勾上就對(duì)了(不勾上會(huì)生成 BKPT 0xAB,此時(shí)MCU會(huì)死機(jī),具體原因未知)
    【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

下載代碼,實(shí)現(xiàn)現(xiàn)象

【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)

工程文件下載鏈接
【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)-PING

說(shuō)明

初始化調(diào)用過(guò)程

MX_LWIP_Init() -> netif_add() -> ethernetif_init() -> low_level_init() -> HAL_ETH_Init() -> LAN8742_Init() -> ethernet_link_check_state()Get link state文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-475283.html

到了這里,關(guān)于【STM32】HAL庫(kù)-以太網(wǎng)外設(shè)-LAN8720A-LWIP-無(wú)操作系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32的以太網(wǎng)外設(shè)+PHY(LAN8720)使用詳解(5):MAC及DMA配置

    STM32的以太網(wǎng)外設(shè)+PHY(LAN8720)使用詳解(5):MAC及DMA配置

    stm32的ETH外設(shè)掛載在AHB1總線上,位于RCC_AHB1ENR的bit25-bit27: 相關(guān)語(yǔ)句如下: 直接調(diào)用ETH_DeInit函數(shù)來(lái)復(fù)位ETH外設(shè) 上述語(yǔ)句操作的寄存器如下: 首先設(shè)置位25為1復(fù)位以太網(wǎng)MAC(復(fù)位MAC寄存器到默認(rèn)值),然后設(shè)置為0取消復(fù)位。 首先調(diào)用ETH_SoftwareReset函數(shù)復(fù)位MAC的DMA 上述語(yǔ)句操

    2024年02月03日
    瀏覽(22)
  • STM32CubeMX+STM32F407+FreeRTos+LAN8720 以太網(wǎng)通信實(shí)現(xiàn)數(shù)據(jù)收發(fā)功能

    STM32CubeMX+STM32F407+FreeRTos+LAN8720 以太網(wǎng)通信實(shí)現(xiàn)數(shù)據(jù)收發(fā)功能

    目錄 前言 一、STM32CubeMX配置 二、修改代碼 三、硬件測(cè)試 總結(jié) 該工程應(yīng)用的以太網(wǎng)芯片是LAN8720,代碼是基于STM32CUbeMx6.2.1配置生成的,在CubeMx中配置了ETH和LWIP,還有串口1和FREERTOS,最后通過(guò)創(chuàng)建任務(wù)函數(shù)實(shí)現(xiàn)udp的以太網(wǎng)數(shù)據(jù)收發(fā)功能。在測(cè)試中,可以在電腦的DOS窗口ping通在

    2024年02月08日
    瀏覽(26)
  • 關(guān)于STM32F4和GD32F4以太網(wǎng),LAN8720+lwip+freemodbus,實(shí)現(xiàn)modbus tcp

    關(guān)于STM32F4和GD32F4以太網(wǎng),LAN8720+lwip+freemodbus,實(shí)現(xiàn)modbus tcp

    關(guān)于STM32F4和GD32F4以太網(wǎng),LAN8720+lwip+freemodbus 這里使用了大佬 小灰灰搞電子 的代碼,文章看 STM32F407+LAN8720移植Lwip和freeModbus實(shí)現(xiàn)MODBUS TCP 代碼看 STM32F407+LAN8720+LWIP移植freemodbus TCP.zip 他的代碼是基于正點(diǎn)原子F407的板子開(kāi)發(fā)的,如果是別的板子,需要修改引腳 小灰灰的代碼里,沒(méi)

    2024年02月14日
    瀏覽(27)
  • ESP32以太網(wǎng)(ETH)環(huán)境和參數(shù)配置,基于內(nèi)部mac和外部PHY(LAN8720A)

    ESP32以太網(wǎng)(ETH)環(huán)境和參數(shù)配置,基于內(nèi)部mac和外部PHY(LAN8720A)

    ESP32在網(wǎng)上的資料很多,但問(wèn)題也各式各樣。由于ESP32主要做wifi功能,因此對(duì)于以太網(wǎng)的資料也很少。相對(duì)應(yīng)的開(kāi)發(fā)板也很少。 本人使用的是淘寶上購(gòu)買(mǎi)的雨甄機(jī)電的帶網(wǎng)口的開(kāi)發(fā)板(如下圖) 安信可ESP-32S 參考資料主要以熱心博主《興趣使然_ 》的 (5條消息) ESP32 單片機(jī)學(xué)習(xí)

    2024年02月15日
    瀏覽(27)
  • 【ETH】以太網(wǎng)----PHY芯片LAN8720A----電路原理圖

    【ETH】以太網(wǎng)----PHY芯片LAN8720A----電路原理圖

    LAN8720A 是低功耗的 10/100M 以太網(wǎng) PHY 層芯片,I/0 引腳電壓符合EEE802.3-2005 標(biāo)準(zhǔn),支持通過(guò) RMI 接口與以太網(wǎng) MAC 層通信,內(nèi)置 10-BASE-T/100BASE-TX 全雙工傳輸模塊,支持 10Mbps 和 100Mbps。 LAN8720A 可以通過(guò)自協(xié)商的方式與目的主機(jī)最佳的連接方式(速度和雙工模式),支持 HPAuto-MDIX 自動(dòng)

    2024年02月06日
    瀏覽(76)
  • 手把手教-gd32f450基于rt-thread發(fā)布的bsp包手動(dòng)添加以太網(wǎng)外設(shè)

    手把手教-gd32f450基于rt-thread發(fā)布的bsp包手動(dòng)添加以太網(wǎng)外設(shè)

    一、開(kāi)發(fā)環(huán)境 rt-thread發(fā)布版本4.1.0; bsp包選用的是gd32目錄下的gd32450z-eval 開(kāi)發(fā)板gd32f450z系列開(kāi)發(fā)板。 二、手動(dòng)添加以太網(wǎng)ETH外設(shè) 先看下初始結(jié)構(gòu) 可以看到,配置中什么也沒(méi)有。 手動(dòng)添加步驟如下: ①?gòu)?fù)制相應(yīng)的驅(qū)動(dòng)到gd32_drivers文件夾中,同時(shí)修改該文件夾中的SConscript文件

    2024年02月15日
    瀏覽(26)
  • STM32以太網(wǎng)通信-LWIP簡(jiǎn)介

    STM32以太網(wǎng)通信-LWIP簡(jiǎn)介

    LwIP全名:Light weight IP,意思是輕量化的TCP/IP協(xié)議,是瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開(kāi)發(fā)的一個(gè)小型開(kāi)源的TCP/IP協(xié)議棧。 LwIP的設(shè)計(jì)初衷是:用少量的資源消耗實(shí)現(xiàn)一個(gè)較為完整的TCP/IP協(xié)議棧,其中“完整”主要指的是TCP協(xié)議的完整性,實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能

    2024年02月07日
    瀏覽(24)
  • STM32+W5500實(shí)現(xiàn)以太網(wǎng)通信

    STM32+W5500實(shí)現(xiàn)以太網(wǎng)通信

    STM32系列32位微控制器基于Arm? Cortex?-M處理器,旨在為MCU用戶提供新的開(kāi)發(fā)自由度。它包括一系列產(chǎn)品,集高性能、實(shí)時(shí)功能、數(shù)字信號(hào)處理、低功耗/低電壓操作、連接性等特性于一身,同時(shí)還保持了集成度高和易于開(kāi)發(fā)的特點(diǎn)。本例采用STM32作為MCU。 W5500是一款全硬件TCP/

    2023年04月22日
    瀏覽(24)
  • STM32以太網(wǎng)接口的配置和使用方法詳解

    STM32以太網(wǎng)接口的配置和使用方法詳解

    STM32 微控制器提供了多種系列和型號(hào),不同型號(hào)的芯片可能有不同的以太網(wǎng)接口,包括MAC(媒體訪問(wèn)控制器)和PHY(物理層接口)等組件。 在這里,我們以STM32F4系列為例來(lái)詳細(xì)介紹以太網(wǎng)接口的配置和使用方法。 ?作者簡(jiǎn)介:熱愛(ài)科研的嵌入式開(kāi)發(fā)者,修心和技術(shù)同步精進(jìn)

    2024年04月26日
    瀏覽(21)
  • STM32H723配置以太網(wǎng)+Freertos注意事項(xiàng)

    STM32H723配置以太網(wǎng)+Freertos注意事項(xiàng)

    由于STM32H743漲價(jià)到300元以上,項(xiàng)目換用了Pin2Pin替換的STM32H723,看上去cpu運(yùn)行速度快了20%達(dá)到550Mhz。 但是內(nèi)存布局存在很大不一樣,而且ST官方代碼庫(kù)升級(jí)迭代快,要手動(dòng)修改地方每個(gè)版本不一樣,在有H743的經(jīng)驗(yàn)下,花了2天時(shí)間搞好了記錄一下。很多信息來(lái)源于英文ST支持論

    2023年04月18日
    瀏覽(37)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包