This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/DP83848J:带 DP83848J 的 STM32F107RC 可以#39;t 正确建立以太网链路

Guru**** 1950750 points
Other Parts Discussed in Thread: DP83848J
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/744367/compiler-dp83848j-stm32f107rc-with-dp83848j-can-t-establish-ethernet-link-correctly

器件型号:DP83848J

工具/软件:TI C/C++编译器

在我的项目中、我将 stm32f107rc 与  DP83848J 一起用于建立以太网通信、这就导致了一个问题。我将 DP83848J 配置为 RMII 模式、我可以从 DP83848J 寄存器0x10读取链路状态是正常的、但 J45链路指示灯不亮、计算机也找不到连接、我检查速度   DP83848J 和 stm32f107rc 端都匹配、因此我不会遇到什么问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、

    您能否共享设计的原理图? 您是否还可以在连接到计算机时提供 DP83848J 的所有寄存器?

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ---------

      感谢您的回复、附件是 原理图和源代码、我使用的寄存器 BCR (0x00)、寄存器 BSR (0x01)、寄存器 PHYSTS (0x10)、RBR (0x17)、所有我使用的寄存 器都位于 STM32_eth.c 文件中的函数" ETH_Init"中、 我在 BSR 中检查链路状态它的反馈为"1"、所以我认为芯片必须正常工作、我使用 RMII 模式。

    e2e.ti.com/.../MT-STM32F107-Control-Board.pdf

    uint32_t ETH_Init (ETH_InitTypeDef* ETH_InitStructurt、uint16_t PHYAddress)
    {
    uint32_t RegValue = 0;
    __IO uint32_t I = 0;
    RCC_ClocksTypeDef RCC_TIMEOUT;
    uint32_t clk = 0;
    -*-/-/-/-t
    
    参数
    /assert_param
    (is_ETH_autonegotation (ETH_InitStruct->ETH_autonegotation));
    assert_param (is_ETH_watchdog (ETH_InitSame->ETH_Watchdog));
    assert_param (is_ETH_Jabber (ETH_Initsense
    );eth_inter_ap_it_interrame_inter->ETH_ap_itrame_inter->ETH_ap_ap_itr (interrame_inter_inter_interrame_itt);
    
    assert_param (is_ETH_speed (ETH_InitStruct->ETH_Speed));
    assert_param (is_ETH_Receive_own (ETH_InitStruct->ETH_ReceiveOwn);
    assert_param (is_ETH_InitStruct->ETH_InitStructe->ETH_ReceiveOwn);assum_param_param_mode (is_it_it_it_it_it_init_emopt
    
    );et_inum_it_it_it_it_it_inum_itmode-t_it_it_eet (ETH_init_it_it_it_it_it_it_it_emopt)
    assert_param (is_ETH_retry_transmission (ETH_InitStruct->ETH_RetryTransmission));
    assert_param (is_ETH_automatic_PADCRC_strip (ETH_InitStruct->ETH_AutomaticPadCRCStrip));assert_param(is_et_init_retry_et_etr)eETH_initrfor_et_et_initrfor_et_et_et_et_etrfor_et_et_etret_etr_etr_itr_etr_etr_etr_etr_etr_etr_itr_etr_etr_etr_etr_etr_itr_etr_etr_etr_etr_etr_et_et_it_etrfor_et_et_itret_et_et_e
    
    
    
    ASSERT_param (IS_ETH_SOURCE_ADDR_FILTER (ETH_InitStruct->ETH_SourceAddrFilter);
    ASSERT_param (IS_ETH_CONTROL_FRAes (ETH_InitStruct->ETH_InitControlFrames));
    ASSERT_param (IST_ETH_broadcast_CONTROL_ETH_INEST_RAPON->ETH_ENTRIP_ETH_ENTRIP_END-
    (ETH_ENTRIP_ETH_ETH_ENTRIP_ETH_ENDIP_ENDEST_ENTRIP_END-));ASSERT_ENTRIP_ETH_ENTRIP_ETH_ENTRIP_ETH_ETH_ENTRIP_ETH_ENTRIP_ETH_ETH (ETH)
    
    ASSERT_param (IS_ETH_MULTPHONG_FRA框_FILTER (ETH_InitStructHR->ETH_MulticuseastFramesFilter);
    ASSERT_param (IS_ETH_unicast_frame_FILTER)(ETH_InitStruct->ETH_UnicuseastFramesFilter));
    ASSERT_ETOM_QUEST_ETOT_ETOHRESHOLD
    (IST_ETO_ETO_ETH_LOWTH_ET-HOLD
    );ASSERT_ET_ETOURT (ET_ET_ET_ETOWTH_TRENT-TRENT-ET_ET_ET_ETOPLET)
    ASSERT_param (is_ETH_unicast_pause_frame_detect (ETH_InitStruct-> ETH_UnicastPauseFrameDetect));
    ASSERT_param (is_ETH_Receive_FlowControl (ETH_InitSReceivt->ETH_UnicastPaus_FFlowDetect));
    ASSERT_param_ETH_TransmitT_ETH_Control
    (isit_ETH_ETH_ETH_Transmit);
    
    /* DMA ------------------------------------------------------- /assert_param
    (is_ETH_drop_TCPIP_CHECKSUM_FRAME (ETH_InitStruct->ETH_DropTCPIPChecksumFrame));
    assert_param (is_ETH_receive_store_Forward (ETH_InitStruct->ETH_DropStoreChecksumed 帧));assert_Transmit_Transmit_TransmitH_Transmit_Transmit_Transmit_RUS_Rive-ETO_ETH_RIVE
    
    
    (is_ETO_RIVE);ETH_TRUST_RUS_ETO_RIVE (it_ERSIFRAME);ETH_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_ETH_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_TRUTE_ETH_TRUGERT
    assert_param (is_ETH_forward_error_FRAMES (ETH_InitStruct->ETH_ForwardThreshFrames));
    assert_param (is_ETH_forward_undersed_good_frames (ETH_InitSErrorReceivt->ETH_ForForUnderdefizedFrames));assert_params_param_for_trameh_
    
    (is_unchartse_eETH_)
    ;alert_init_trame_rame_rame_rame_rame_rame_rame_rame_rame_rond->ETH_(et_rame_rame_rame_rame_it_rame_rame_rame_rthet_eETH_);althet_ralthet_eETH_(rals_)
    ASSERT_param (is_ETH_FIXED_BURST (ETH_InitStruct->ETH_FixedBurst));
    ASSERT_param (is_ETH_RXDMA_BURST_LENGTH (ETH_InitStruct->ETH_RxDMABBSTLength));
    ASSERT_param (is_ETH_TREM_TREM_LENGTH_ETH_TREM_TREM_TREM_LENGTH
    )
    ;ASSERT_ETH_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREMT_TREM_LENGTH (ETH_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_TREM_LENGTH)
    /*---------------------- MAC 配置------------------------------------------------------- *
    /*-------------- 以太网 MACMIIAR 配置--- //
    //*获取以太网 MACMIIAR 值*/
    tmpreg=ETH->MACMIIAR;
    //清除 CSR 时钟范围 CR[2:0]位*/
    tmpreg&= MACMIIAR_CR_MASK;
    //获取 hclk 频率值*/
    RCC_GetClocksFreq (&RCC_HCC_Clock);
    rclk_Clk = Rclk_Clk 时钟频率; /000000 0x044AA200*/*
    
    根据 hclk 值设置 CR 位*/
    if (hclk >=20000000)&&(hclk <35000000)
    {
    // CSR 时钟范围介于20-35MHz 之间*/
    tmPREG |=(uint32_t) ETH_MACIIAR_CR_16;{*=&tmCLK
    
    =60MHz
    
    
    (uintegr)之间)|/tmCLK (u_mCLK
    
    否则 if ((hclk >= 60000000)&&(hclk <= 72000000))
    {
    /*((hclk >=60000000)&&(hclk <= 72000000))*/
    /* CSR 时钟范围介于60-72MHz 之间*/
    tmpreg |=(uint32_t) ETH_mII+
    
    
    配置MDC的时钟频率,与DP83848进行通讯
    
    
    
    
    
    (= 0x32)/t 以太网/eTR_mac = 0xt/e+(t/eTR_t/eTR_t/eTR=32)
    //}
    
    status=ETH_ReadPHYRegister (PHYAddress、PHY_BCR);
    
    /*--- PHY 初始化和配置--- //
    //*将 PHY 置于复位模式*/
    if (!(ETH_WritePHYRegister (PHYAddress、PHY_BCR、PHY_Reset))
    ){
    //在写入超时时时返回错误*/
    返回 ETH_ERROR;
    }
    
    //启用自动协商*/
    if (!(ETH_autePHYRegister (PHYAddress、PHYCR)、PHY_BCR)
    {
    //如果写入超时,返回错误*/
    返回 ETH_ERROR;
    }
    
    status=ETH_ReadPHYRegister (PHYAddress、PHY_BCR);
    
    //确保 PHY 复位的延迟*/
    _eth_delay_(PHY_ResetDelay);
    
    //判断是否配置为自动*/
    if (ETH_Init协商->ETH_autonegotation!= ETH_autonsatation_Disable)
    {
    //等待链接... //
    执行
    {
    超时++;
    } while (!(ETH_ReadPHYRegister (PHYAddress、PHY_BSR)& PHY_Linked_Status)&&(超时< PHY_READ_TO);
    //如果超时返回错误*/
    
    if (TIMEOUT =PHY_READ_TO)
    {
    返回 ETH_ERROR;
    }/*
    Reset Timeout
    =计数器0;/
    
    /*启用自动协商*/
    if (!(ETH_WritePHYRegister (PHYAddress、PHY_BCR、PHY_自动 协商))
    ){
    //在写入超时返回错误*/
    返回 ETH_ERROR;
    }
    
    /*等待自动协商完成*/
    DO
    {
    timeout++;
    } while (!(ETH_ReadPHYRegister (PHYAddress、PHY_BSR)& PHY_AutoNego_Complete)&&(timeout <(uint32_t) PHY_READ_TO));
    
    /*超时时返回错误*/
    if (timeout =PHY_READ_TO)
    {
    return ETH_error;
    }
    //重置超时计数器*/
    timeout = 0;
    
    /*读取自动协商的结果*/
    RegValue = ETH_ReadPHYRegister (PHYAddress、PHY_SR);
    
    //将 MAC 配置为通过自动协商过程固定的双工模式*/
    if (RegValue & PHY_DUPLE_Status)!=(UINT32_t) reset)
    {
    //将以太网双工模式设置为 ETH_INTELESHO_ENDULLUETOOTN
    
    =以下*
    否则
    {
    //在自动协商之后将以太网双工模式设置为 HalfDuplex */
    ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
    }
    
    /*使用自动协商过程确定的速度配置 MAC */
    if (RegValue & PHY_Speed_Status)
    {//
    在自动协商之后将以太网速度设置为10M */
    ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
    }
    否则
    {//
    将以太网速度设置为100M,遵循
    自动协商*/>ETH_InitSpeed = ETH_ETH_ETH_10M;}
    
    
    /*0x17 RMII 和旁路寄存器*/
    STATUS=ETH_ReadPHYRegister (PHYAddress,0x17);
    /*启用自动协商*/
    
    if (!(ETH_WritePHYRegister (PHYAddress,0x17,STATUS|0x20)))
    {//
    在写入超时返回错误*/
    返回 ETH_ERROR;
    ENYPHYAddress
    (ETYAddress,0x17,STATUS|0xPHYPHYAddress))
    
    
    STATUS=ETH_ReadPHYRegister (PHYAddress、0X18);
    /* LED 直接控制寄存器、1 =将 SPDLED 位的值驱动到 LED_SPEED 输出上、将 LNKLED 位的值驱动到 LED_LINK 输出*/
    if (!(ETH_WritePHYRegister (PHYAddress、0X18、STATUS|0x30))));将 LMK0XPHYH
    
    
    
    
    位的值驱动到 LED_LINK 输出*/ IF (!!!(ETH_WritePHYPHYPHYAddress、0X18、RETURN)返回)错误*= 0XPHYEPHYEPHYH)
    
    STATUS=ETH_ReadPHYRegister (PHYAddress、0x19);
    /* LED配置成MODE1 *
    / if (!(ETH_WritePHYRegister (PHYAddress、0x19、STATUS|0x20))
    ){
    //在写入超时时返回错误*/
    返回 ETH_ERROR;
    }
    
    STATUS=ETH_ReadPHYRegister (PHYAddress、0x19、STATUS|PHYH
    
    
    
    )(0x16)、INPHYCR_INPHYAddress (0xTH_INPHYH)(0x16)、INTRFH (0xPHYH)(0x16)、INTRYH (0xPHYH)(0xPHYH (0x16)、INTRF_PHYH (0x16)、INPHYH
    (uint16_t)(ETH_InitStruct->ETH_Speed >> 1))
    ){
    //在写入超时情况下返回错误*/
    返回 ETH_ERROR;
    }
    
    //确保 PHY 配置的延迟*/
    _eth_delay_(PHY_ConfigDelay);
    }
    
    
    /*---------------- 以太网 MACCR 配置--- //
    *获取以太网 MACCR 值*/
    tmPREG = ETH->MACCR;
    //清除 WD、PCE、PS、TE 和 RE 位*/
    tmPREG &= MACCR_CLEAR_MASK;
    //根据 ETH_Watchdog 值设置 WD 位*//*
    设置 JD: 根据 ETH_Jabber 值的位*
    ///*根据 ETH_InterFrameGap 值设置 IFG 位*/
    /*根据 ETH_CarrierSense 值设置 DCRS 位*/
    /*根据 ETH_Speed 值设置 FES 位*
    //*根据 ETH_Receiven 值设置 DO 位*
    / Lm*设置 LM 根据 ETH_LoopbackMode 值的位*/
    //*根据 ETH_Mode 值设置 DM 位*/
    //*根据 ETH_ChecksumOffload 值设置 IPC 位*/
    //*根据 ETH_RetryTransmission 值设置 DR 位*//
    //*根据 ETH_AutomaticPadCRCStrip 值设置 ACS 位*//
    *根据 ETH_BackOffLimitit 值设置 BL 位*//
    *根据 ETH_DeferralCheck 值设置 DC 位*/
    tmpreg|=(uint32_t)(ETH_InitStruct->ETH_Watchdog |
    ETH_InitStruct->ETH_Jabber |
    ETH_InitStruct->ETH_InterFrameGap |
    ETH_InitStruct->ETH_CarrierSense |
    ETH_InitStruct->ETH_Speed |
    ETH_InitStruct->ETH_ReceiveOwn |
    ETH_InitStruct->ETH_LoopbackMode |
    ETH_InitStruct->ETH_Mode |
    ETH_InitStruct->ETH_ChecksumOffload |
    ETH_InitStruct->ETH_RetryTransmission |
    ETH_InitStruct->ETH_AutomaticPadCRCStrip |
    ETH_InitStruct->ETH_BackOffLimit|
    ETH_InitStruct->ETH_DeferralCheck);
    /*写入以太网 MACCR */
    ETH->MACCR =(uint32_t) tmPREG;
    
    /*---------------- 以太网 MACFFR 配置--- //
    //*根据 ETH_ReceiveAll 值设置 RA 位*//
    *根据 ETH_SourceAddrFilter 值设置 SAF 和 SAIF 位*//
    *根据 ETH_PassControlFrames 值设置 PCF 位*//
    *根据 ETH_BroadcastFramesReceiving 值设置 DBF 位*//
    *根据 DAIF 位设置 DAIF 位 ETH_DestinationAddrFilter 值*//*
    根据 ETH_PromiscuoMode 值设置 PR 位*//
    *根据 ETH_MulticastFramesFilter 值设置 PM、HMC 和 HPF 位*//
    *根据 ETH_ETH_TRUFFR 值设置 Hc 和 HPF 位*/*
    ETO_ETH_MACETRUFFT-|ENTRUTRUTRUTO_TRUTRUTRUTRUTRUTRUTO_TRUTRUTRUTRUTRUTRUTRUTRUFFT 位
    
    ETH_InitStruct->ETH_SourceAddrFilter |
    ETH_InitStruct->ETH_PassControlFrames|
    ETH_InitStruct->ETH_BroadcastFramesRecept|
    ETH_InitStruct->ETH_DestinationAddrFilter |
    ETH_InitStruct->ETH_PromiscuoMode |
    ETH_InitStruct->ETH_MulticastFramesFilter |
    ETH_InitStruct->ETH_UnicastFramesFilter);
    /*--- 以太网 MACHTHR 和 MACHTLR 配置--- /*
    写入以太网 MACHTHR */ETH->MACHTHR
    =(UINT32_t)ETH_InitStruct->ETH_HashTableHigh;
    /*写入以太网 MACHTLR */ETH->MACHTLR
    =(UINT32_t)ETH_InitStruct->ETH_HashTableLow-->------
    以太网 MACFCR 配置--- //
    //*获取以太网 MACFCR 值*/
    tmPREG = ETH->MACFCR;
    //清除 xx 位*/
    tmPREG &= MACFCR_CLEAR_MASK;
    
    /*根据 ETH_PauseTime 值设置 PT 位*//
    *根据 ETH_ZeroQuantaPause 值设置 DZPQ 位*//
    *根据 ETH_ReceivePauseLowThreshold 值设置 PLT 位*//
    *根据 ETH_UnicastusePaFrameDetect 值设置 PQ 位*
    //*根据 ETH_RFeControl 位设置 PQ 位
    /*根据 ETH_TransmitFlowControl 值来设置 TFE 位*/
    tmPREG |=(uint32_t)((ETH_InitStruct->ETH_PauseTime << 16)|
    ETH_InitStruct->ETH_ZeroQuantaPause |
    ETH_InitStruct->ETH_PauseLowThreshold |
    ETH_InitStruct->ETH_UnicastPauseFrameDetect |
    ETH_InitStruct->ETH_ReceiveFlowControl |
    ETH_InitStruct->ETH_TransmitFlowControl);
    /*写入以太网 MACFCR */
    ETH->MACFCR =(uint32_t) tmPREG;
    /*--- 以太网 MACVLANTR 配置--- //
    //*根据 ETH_VLANTagComparison 值设置 ETV 位*//
    *根据 ETH_VLANTagIdentifier 值设置 VL 位*/
    ETH->MACVLANTR =(uint32_t)(ETH_InitStruct->ETH_VLANComparison |
    ETH_InitStruct->ETH_VLANTagIdentifier);
    
    /*---------------------- DMA 配置------------------------------------------------------- */
    /*----- 以太网 DMAMOMR 配置--- /*
    获取以太网 DMAMOMR 值*/
    tmPREG = ETH->DMAMOMR;
    //清除 xx 位*/
    tmPREG &= DMAMOMR_CLEAR_MASK;
    
    //*根据 ETH_DropTCPIPChecksumErrorFrame 值设置 DT 位*//
    *根据 ETH_ThreseReceiveForward 值设置 RSF 位*//
    *根据 ETH_FlushReceivedFrame 值设置 DFF 位*//
    *根据 ETH_TransmitStoreReceivward 值设置 TSF 位*/
    *根据 TTC TransmitStoreStoryward 值设置 THDControl 位
    /*根据 ETH_ForwardShuthFrames 值设置 FEF 位*/*
    根据 ETH_ForErrorUndersizeedGoodFrames 值设置 FUF 位*//
    *根据 ETH_SecondeReceiveHoldControl 值设置 RTC 位*/*
    //*根据 ETH_ErrorFrameOperate 值设置 OSF 位*/*
    (tidrect_Intraged IPH)|tidtidtidt_int_int&f 位
    ETH_InitStruct->ETH_ReceiveStoreForward |
    ETH_InitStruct->ETH_FlushReceivedFrame |
    ETH_InitStruct->ETH_TransmitStoreForward |
    ETH_InitStruct->ETH_TransmitThresholdControl |
    ETH_InitStruct->ETH_ForwardErrorFrames|
    ETH_InitStruct->ETH_ForwardUndersizeedGoodFrames |
    ETH_InitStruct->ETH_ReceiveThresholdControl |
    ETH_InitStruct->ETH_SecondFrameOperate);
    /*写入以太网 DMAMOMR */
    ETH->DMAMOMR =(uint32_t) tmPREG;
    
    /*---------------- 以太网 DMABMR 配置--- //
    //*根据 ETH_AddressAlignedBeats 值设置 AAL 位*//
    *根据 ETH_FixedBurst 值设置 FB 位*//
    *//*根据 ETH_RxDMABurstLength 值设置 RPBL 和4
    
    个 PBL 位*//*根据 ETH_RTxDMABurstLength 值设置 PBL 和4个 PBL 位 根据 ETH_DesciptorSkipLength 值*/*
    根据 ETH_DMAArbitration 值*/设置 PR 和 DA 位
    ETH->DMABMR =(uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
    ETH_InitStruct->ETH_FixedBurst |
    ETH_InitStruct->ETH_RxDMABurstLength |/*!! 如果为 Tx 或 Rx 选择了4xPBL、则将其应用于另一个*/
    ETH_InitStruct->ETH_TxDMABBurrstLength |
    (ETH_InitStruct->ETH_DescriptionSkipLength << 2)|
    ETH_InitStruct->ETH_DMAArbitration |
    ETH_DMABMR_USP);/*为 Rx 和 Tx 启用单独的 PBL *
    
    
    
    
    /*返回以太网配置成功*/
    返回 ETH_SUCCESS;
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Rob:

       感谢您的回复、以下是我的图表和源代码、谢谢。

    uint32_t ETH_Init (ETH_InitTypeDef* ETH_InitStructt、uint16_t PHYAddress)


    uint32_t RegValue = 0;
    _io uint32_t i = 0;
    RCC_ClocksTypeDef RCC_Clocks;
    uint32_t hclk = 60000000;
    _io uint32_t timeout = 0;

    /*检查参数*/
    /* MAC ------------------ *
    assert_param (is_ETH_autonegotation (ETH_InitStruct->ETH_autonegotation));
    assert_param (is_ETH_watchdog (ETH_InitStruct->ETH_watchdog));
    assert_param (is_ETH_Jabber (ETH_InitStruct->ETH_Jabber));
    ASSERT_param (is_ETH_INTER_FRAME_GAP (ETH_InitStruct->ETH_InterFrameGap));
    assert_param (is_ETH_carrier_sense (ETH_InitStruct->ETH_CarrierSense));
    assert_param (is_ETH_speed (ETH_InitStruct->ETH_Speed));
    assert_param (is_ETH_Receive_own (ETH_InitStruct->ETH_ReceiveOwn));
    assert_param (is_ETH_loopback_mode (ETH_InitStruct->ETH_LoopbackMode));
    assert_param (is_ETH_duplex_mode (ETH_InitStruct->ETH_Mode));
    assert_param (is_ETH_CHECKSUM_OFFLOAD (ETH_InitStruct->ETH_ChecksumOffload));
    assert_param (is_ETH_retry_transmission (ETH_InitStruct->ETH_RetryTransmission));
    assert_param (is_ETH_automatic_PADCRC_Strip (ETH_InitStruct->ETH_AutomaticPadCRCStrip));
    assert_param (is_ETH_backoff_limit (ETH_InitStruct->ETH_BackOffLimitit));
    ASSERT_param (is_ETH_DETH_DERATAND_CHECK (ETH_InitStruct->ETH_DEFERRAALCheck));
    assert_param (is_ETH_receive_all (ETH_InitStruct->ETH_ReceiveAll));
    assert_param (is_ETH_SOURCE_ADDR_FILTER (ETH_InitStruct->ETH_SourceAddrFilter));
    ASSERT_param (IS_ETH_CONTROL_FRAes (ETH_InitStruct->ETH_PassControlFrames));
    assert_param (is_ETH_broadcast_frame_reception (ETH_InitStruct->ETH_BroadcastFramesReception));
    assert_param (is_ETH_destination_ADDR_filter (ETH_InitStruct->ETH_DestinationAddrFilter));
    assert_param (is_ETH_混杂 模式(ETH_InitStruct->ETH_混杂 模式));
    assert_param (is_ETH_multicing_frame_filter (ETH_InitStruct->ETH_MulticastFramesFilter));
    assert_param (is_ETH_unicast_frame_filter (ETH_InitStruct->ETH_UnicastFramesFilter));
    ASSERT_param (is_ETH_PAUSE_TIME (ETH_InitStruct->ETH_PauseTime));
    ASSERT_param (IS_ETH_ZEROQUANTA_PAUSE (ETH_InitStruct->ETH_ZeroQuantaPause));
    assert_param (is_ETH_PAUSE_LOW_THRESHOLD (ETH_InitStruct->ETH_PauseLowThreshold));
    assert_param (is_ETH_unicast_pause_frame_detect (ETH_InitStruct->ETH_UnicastPauseFrameDetect));
    assert_param (is_ETH_Receive_FlowControl (ETH_InitStruct->ETH_ReceiveFlowControl));
    assert_param (is_ETH_Transmit_FlowControl (ETH_InitStruct->ETH_TransmitFlowControl));
    assert_param (is_ETH_VLAN_tag_comparison (ETH_InitStruct->ETH_VLANTagComparison));
    ASSERT_param (is_ETH_VLAN_TAG_identifier (ETH_InitStruct->ETH_VLANTagIdentifier));
    /* DMA ------------------------------------------------------- *
    assert_param (is_ETH_Drop_TCPIP_CHECKSUM_FRAME (ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame));
    assert_param (is_ETH_Receive_store_Forward (ETH_InitStruct->ETH_ReceiveStoreForward));
    assert_param (is_ETH_flush_receive_frame (ETH_InitStruct->ETH_FlushReceivedFrame));
    assert_param (is_ETH_transmit_sstore_Forward (ETH_InitStruct->ETH_TransmitStorefront 转发));
    ASSERT_param (is_ETH_TRANSMIT_THRESHOLD_CONTROL (ETH_InitStruct->ETH_TransmitThresholdControl));
    assert_param (is_ETH_forward_error_frames (ETH_InitStruct->ETH_ForwardErrorFrames));
    assert_param (is_ETH_forward_undersized_good_FRA帧(ETH_InitStruct->ETH_ForwardUndersizeedGoodFrames));
    assert_param (is_ETH_receive_threshold_control (ETH_InitStruct->ETH_ReceiveThresholdControl));
    assert_param (is_ETH_second_frame_Operate (ETH_InitStruct->ETH_SecondFrameOperate));
    assert_param (is_ETH_address_aligned_b搏(ETH_InitStruct->ETH_AddressAlignedBeats));
    assert_param (is_ETH_fixed_burst (ETH_InitStruct->ETH_FixedBurst));
    ASSERT_param (is_ETH_RXDMA_BURST_LENGTH (ETH_InitStruct->ETH_RxDMABurstLength));
    ASSERT_param (is_ETH_TXDMA_BURST_LENGTH (ETH_InitStruct->ETH_TxDMABBSTLength));
    ASSERT_param (is_ETH_DMA_DESC_SKIP_LENGTH (ETH_InitStruct->ETH_DescriptionSkipLength));
    ASSERT_param (is_ETH_DMA_arbitration_ROUNDROUNDROBIN_RxTx (ETH_InitStruct->ETH_DMAArbitration));
    /*---------------------- MAC 配置------------------------------------------------------- *
    /*-------------- 以太网 MACMIIAR 配置--- *
    /*获取以太网 MACMIIAR 值*/
    tmpreg=ETH->MACMIIAR;
    /*清除 CSR 时钟范围 CR[2:0]位*/
    tmpreg &= MACMIIAR_CR_MASK;
    /*获取 hclk 频率值*/
    RCC_GetClocksFreq (&RCC_Clocks);
    hclk = RCC_Clocks.HCLK_Frequency;/* 0x044AA200*/

    /*根据 hclk 值设置 CR 位*/
    if ((hclk >= 20000000)&&(hclk < 35000000))

    /* CSR 时钟范围介于20-35MHz 之间*/
    tmpreg|=(uint32_t) ETH_MACMIIAR_CR_Div16;

    否则、如果((hclk >= 35000000)&&(hclk < 60000000))

    /* CSR 时钟范围介于35-60 MHz 之间*/
    tmpreg|=(uint32_t) ETH_MACMIIAR_CR_Div26;

    否则、如果((hclk >= 60000000)&&(hclk <= 72000000))

    /*((hclk >= 60000000)&&(hclk <= 72000000))*/
    /* CSR 时钟范围介于60-72MHz 之间*/
    tmpreg|=(uint32_t) ETH_MACMIIAR_CR_Div42;


    /*配置MDC的时钟频率,与DP83848进行通讯*/
    /*写入以太网 MAC MIIAR:配置以太网 CSR 时钟范围*/
    ETH->MACMIIAR =(uint32_t) tmPREG;

    // for (;temp<=32;temp++)
    //{
    // STATUS=ETH_ReadPHYRegister (temp、0x17);
    //}

    STATUS=ETH_ReadPHYRegister (PHYAddress、PHY_BCR);

    /*------------ PHY 初始化和配置--- *
    /*将 PHY 置于复位模式*/
    if (!(ETH_WritePHYRegister (PHYAddress、PHY_BCR、PHY_Reset))))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;


    /*启用自动协商*/
    if (!(ETH_WritePHYRegister (PHYAddress、PHY_BCR、PHY_自动 协商)))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;


    STATUS=ETH_ReadPHYRegister (PHYAddress、PHY_BCR);

    /*延迟以确保 PHY 复位*/
    _eth_delay_(PHY_ResetDelay);

    /*判断是否配置为自动*/
    if (ETH_InitStruct->ETH_自动 协商!= ETH_自动 协商_Disable)

    //我们等待链接的 satus ... *
    操作

    超时++;
    } while (!(ETH_ReadPHYRegister (PHYAddress、PHY_BSR)& PHY_Linked_Status)&&(超时< PHY_READ_TO);
    /*超时时返回错误*/

    if (timeout =PHY_READ_to)

    返回 ETH_ERROR;

    /*重置超时计数器*/
    超时= 0;

    /*启用自动协商*/
    if (!(ETH_WritePHYRegister (PHYAddress、PHY_BCR、PHY_自动 协商)))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;


    /*等待自动协商完成*/
    操作

    超时++;
    } while (!(ETH_ReadPHYRegister (PHYAddress、PHY_BSR)& PHY_AutoNego_Complete)&&(超时<(uint32_t) PHY_READ_TO));

    /*超时时返回错误*/
    if (timeout =PHY_READ_to)

    返回 ETH_ERROR;

    /*重置超时计数器*/
    超时= 0;

    /*读取自动协商的结果*/
    RegValue = ETH_ReadPHYRegister (PHYAddress、PHY_SR);

    /*使用自动协商过程固定的双工模式配置 MAC */
    if ((RegValue & PHY_Duplex_Status)!=(uint32_t)复位)

    /*在自动协商之后将以太网双工模式设置为全双工*/
    ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;

    其他

    /*在自动协商之后将以太网双工模式设置为 HalfDuplex */
    ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;


    /*使用自动协商过程确定的速度配置 MAC */
    IF (RegValue 和 PHY_Speed_Status)

    //在自动协商后将以太网速度设置为10M
    ETH_InitStruct->ETH_Speed = ETH_Speed_10M;

    其他

    //将以太网速度设置为自协商后的100m */
    ETH_InitStruct->ETH_Speed = ETH_Speed_100M;


    /*0x17 RMII 和旁路寄存器*/
    STATUS=ETH_ReadPHYRegister (PHYAddress、0x17);
    /*启用自动协商*/

    if (!(ETH_WritePHYRegister (PHYAddress、0x17、STATUS|0x20))))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;

    STATUS=ETH_ReadPHYRegister (PHYAddress、0x17);


    STATUS=ETH_ReadPHYRegister (PHYAddress、0X18);
    /* LED 直接控制寄存器,1 =将 SPDLED 位的值驱动到 LED_SPEED 输出,将 LNKLED 位的值驱动到 LED_LINK 输出*/
    if (!(ETH_WritePHYRegister (PHYAddress、0X18、STATUS|0x30))))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;

    STATUS=ETH_ReadPHYRegister (PHYAddress、0X18);

    STATUS=ETH_ReadPHYRegister (PHYAddress、0x19);
    /* LED配置成MODE1 */
    if (!(ETH_WritePHYRegister (PHYAddress、0x19、STATUS|0x20))))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;


    STATUS=ETH_ReadPHYRegister (PHYAddress、0x19);

    其他

    if (!ETH_WritePHYRegister (PHYAddress、PHY_BCR、(uint16_t)(ETH_InitStruct->ETH_Mode >> 3)|
    (uint16_t)(ETH_InitStruct->ETH_Speed >> 1))))

    //如果写入超时,返回错误*/
    返回 ETH_ERROR;


    /*延迟以确保 PHY 配置*/
    _eth_delay_(PHY_ConfigDelay);



    /*---------------- 以太网 MACCR 配置--- *
    /*获取以太网 MACCR 值*/
    tmpreg=ETH->MACCR;
    /*清除 WD、PCE、PS、TE 和 RE 位*/
    tmpreg&= MACCR_CLEAR_MASK;
    /*根据 ETH_Watchdog 值设置 WD 位*/
    /*根据 ETH_Jabber 值设置 JD:位*/
    /*根据 ETH_InterFrameGap 值设置 IFG 位*/
    /*根据 ETH_CarrierSense 值设置 DCRS 位*/
    /*根据 ETH_Speed 值设置 FES 位*/
    /*根据 ETH_ReceiveOwn 值设置 DO 位*/
    /*根据 ETH_LoopbackMode 值设置 LM 位*/
    /*根据 ETH_Mode 值设置 DM 位*/
    /*根据 ETH_ChecksumOffload 值设置 IPC 位*/
    /*根据 ETH_RetryTransmission 值设置 DR 位*/
    /*根据 ETH_AutomaticPadCRCStrip 值设置 ACS 位*/
    /*根据 ETH_BackOffLimit 值设置 BL 位*/
    /*根据 ETH_DeferralCheck 值设置 DC 位*/
    tmpreg|=(uint32_t)(ETH_InitStruct->ETH_Watchdog |
    ETH_InitStruct->ETH_Jabber |
    ETH_InitStruct->ETH_InterFrameGap |
    ETH_InitStruct->ETH_CarrierSense |
    ETH_InitStruct->ETH_Speed |
    ETH_InitStruct->ETH_ReceiveOwn |
    ETH_InitStruct->ETH_LoopbackMode |
    ETH_InitStruct->ETH_Mode |
    ETH_InitStruct->ETH_ChecksumOffload |
    ETH_InitStruct->ETH_RetryTransmission |
    ETH_InitStruct->ETH_AutomaticPadCRCStrip |
    ETH_InitStruct->ETH_BackOffLimit|
    ETH_InitStruct->ETH_DeferralCheck);
    /*写入以太网 MACCR */
    ETH->MACCR =(uint32_t) tmpreg;

    /*---------------- 以太网 MACFFR 配置--- *
    /*根据 ETH_ReceiveAll 值设置 RA 位*/
    /*根据 ETH_SourceAddrFilter 值设置 SAF 和 SAIF 位*/
    /*根据 ETH_PassControlFrames 值设置 PCF 位*/
    /*根据 ETH_BroadcastFramesReception 值设置 DBF 位*/
    /*根据 ETH_DestinationAddrFilter 值设置 DAIF 位*/
    /*根据 ETH_PromiscuoMode 值设置 PR 位*/
    /*根据 ETH_MulticastFramesFilter 值设置 PM、HMC 和 HPF 位*/
    /*根据 ETH_UnicastFramesFilter 值设置 Hc 和 HPF 位*/
    /*写入以太网 MACFFR */
    ETH->MACFFR =(uint32_t)(ETH_InitStruct->ETH_ReceiveAll |
    ETH_InitStruct->ETH_SourceAddrFilter |
    ETH_InitStruct->ETH_PassControlFrames|
    ETH_InitStruct->ETH_BroadcastFramesRecept|
    ETH_InitStruct->ETH_DestinationAddrFilter |
    ETH_InitStruct->ETH_PromiscuoMode |
    ETH_InitStruct->ETH_MulticastFramesFilter |
    ETH_InitStruct->ETH_UnicastFramesFilter);
    /*---------- 以太网 MACHTHR 和 MACHTLR 配置--- *
    /*写入以太网 MACHTHR */
    ETH->MACHTHR=(uint32_t) ETH_InitStruct->ETH_HashTableHigh;
    /*写入以太网 MACHTLR */
    ETH->MACHTLR =(uint32_t) ETH_InitStruct->ETH_HashTableLow;
    /*---------------- 以太网 MACFCR 配置--- *
    /*获取以太网 MACFCR 值*/
    tmpreg=ETH->MACFCR;
    /*清除 xx 位*/
    tmpreg&= MACFCR_CLEAR_MASK;

    /*根据 ETH_PauseTime 值设置 PT 位*/
    /*根据 ETH_ZeroQuantaPause 值设置 DZPQ 位*/
    /*根据 ETH_PauseLowThreshold 值设置 PLT 位*/
    /*根据 ETH_UnicastPauseFrameDetect 值设置 UP 位*/
    /*根据 ETH_ReceiveFlowControl 值设置 RFE 位*/
    /*根据 ETH_TransmitFlowControl 值设置 TFE 位*/
    tmpreg|=(uint32_t)((ETH_InitStruct->ETH_PauseTime << 16)|
    ETH_InitStruct->ETH_ZeroQuantaPause |
    ETH_InitStruct->ETH_PauseLowThreshold |
    ETH_InitStruct->ETH_UnicastPauseFrameDetect |
    ETH_InitStruct->ETH_ReceiveFlowControl |
    ETH_InitStruct->ETH_TransmitFlowControl);
    /*写入以太网 MACFCR */
    ETH->MACFCR =(uint32_t) tmPREG;
    /*---------------- 以太网 MACVLANTR 配置--- *
    /*根据 ETH_VLANTagComparison 值设置 ETTV 位*/
    /*根据 ETH_VLANTagIdentifier 值设置 VL 位*/
    ETH->MACVLANTR =(uint32_t)(ETH_InitStruct->ETH_VLANTagComparison |
    ETH_InitStruct->ETH_VLANTagIdentifier);

    /*---------------------- DMA 配置------------------------------------------------------- *
    /*---------------- 以太网 DMAMOMR 配置--- *
    /*获取以太网 DMAMOMR 值*/
    tmpreg=ETH->DMAMOMR;
    /*清除 xx 位*/
    tmpreg&= DMAMOMR_CLEAR_MASK;

    /*根据 ETH_DropTCPIPChecksumErrorFrame 值设置 DT 位*/
    /*根据 ETH_ReceiveStoreForward 值设置 RSF 位*/
    /*根据 ETH_FlushReceivedFrame 值设置 DFF 位*/
    /*根据 ETH_TransmitStoreForward 值设置 TSF 位*/
    /*根据 ETH_TransmitThresholdControl 值设置 TTC 位*/
    /*根据 ETH_ForwardErrorFrames 值设置 FEF 位*/
    /*根据 ETH_ForwardUndersizeedGoodFrames 值设置 FUF 位*/
    /*根据 ETH_ReceiveThresholdControl 值设置 RTC 位*/
    /*根据 ETH_SecondFrameOperate 值设置 OSF 位*/
    tmPREG |=(uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame |
    ETH_InitStruct->ETH_ReceiveStoreForward |
    ETH_InitStruct->ETH_FlushReceivedFrame |
    ETH_InitStruct->ETH_TransmitStoreForward |
    ETH_InitStruct->ETH_TransmitThresholdControl |
    ETH_InitStruct->ETH_ForwardErrorFrames|
    ETH_InitStruct->ETH_ForwardUndersizeedGoodFrames |
    ETH_InitStruct->ETH_ReceiveThresholdControl |
    ETH_InitStruct->ETH_SecondFrameOperate);
    /*写入以太网 DMAMOMR */
    ETH->DMAMOMR=(uint32_t) tmPREG;

    /*---------------- 以太网 DMABMR 配置--- *
    /*根据 ETH_AddressAlignedBeats 值设置 AAL 位*/
    /*根据 ETH_FixedBurst 值设置 FB 位*/
    /*根据 ETH_RxDMABurstLength 值*/设置 RPBL 和4*PBL 位
    /*根据 ETH_TxDMABurstLength 值*/设置 PBL 和4*PBL 位
    /*根据 ETH_DesciptorSkipLength 值设置 DSL 位*/
    /*根据 ETH_DMAArbitration 值设置 PR 和 DA 位*/
    ETH->DMABMR =(uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats |
    ETH_InitStruct->ETH_FixedBurst |
    ETH_InitStruct->ETH_RxDMABurstLength |/*!! 如果为 Tx 或 Rx 选择了4xPBL、则将其应用于另一个*/
    ETH_InitStruct->ETH_TxDMABBurrstLength |
    (ETH_InitStruct->ETH_DescriptionSkipLength << 2)|
    ETH_InitStruct->ETH_DMAArbitration |
    ETH_DMABMR_USP);/*为 Rx 和 Tx 启用单独的 PBL *




    /*返回以太网配置成功*/
    返回 ETH_SUCCESS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、

    您在新主题中再次发布了您的问题。 我要关闭此主题。 我们将在新主题中继续讨论。

    此致、
x 出现错误。请重试或与管理员联系。