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.
工具/软件:TI C/C++编译器
在我的项目中、我将 stm32f107rc 与 DP83848J 一起用于建立以太网通信、这就导致了一个问题。我将 DP83848J 配置为 RMII 模式、我可以从 DP83848J 寄存器0x10读取链路状态是正常的、但 J45链路指示灯不亮、计算机也找不到连接、我检查速度 DP83848J 和 stm32f107rc 端都匹配、因此我不会遇到什么问题
---------
感谢您的回复、附件是 原理图和源代码、我使用的寄存器 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;
}