int main(void) { // Set clock to 168MHz CLOCK_SetClockTo168MHz(); // Delay initialization DELAY_Init(); // Enable clock for GPIOD RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Initialize PD13 and PD15 as output for orange and blue LED GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStruct); // External interrupt initialization EXTI0_Init(); while (1) { // Toggle blue LED (PD15) every 5s GPIO_ToggleBits(GPIOD, GPIO_Pin_15); DELAY_Ms(5000); } }
/* * ----------------------------------------------------------------------------- * Function Name: MAC_SystemSleep * Purpose: * Params: * Returns: * Note: * ---------------------------------------------------------------------------- */ void MAC_SystemSleep(void) { U8_T XDATA temp; /* disable mac receive */ mac_ReadReg(MAC_MEDIUM_STATUS_MODE_REG, &temp, 1); temp &= 0xfb; mac_WriteReg(MAC_MEDIUM_STATUS_MODE_REG, &temp, 1); DELAY_Ms(500); PCON = SWB_; PCON |= STOP_; DELAY_Ms(500); /* enable mac receive */ mac_ReadReg(MAC_MEDIUM_STATUS_MODE_REG, &temp, 1); temp |= 4; mac_WriteReg(MAC_MEDIUM_STATUS_MODE_REG, &temp, 1); } /* End of MAC_SystemSleep() */
/* * ---------------------------------------------------------------------------- * Function Name: MAC_LinkSpeedChk * Purpose: * Params: none * Returns: 100: Ethernet is link to 100M * 10 : Ethernet is link to 10M * 0 : not link * Note: * ---------------------------------------------------------------------------- */ U8_T MAC_LinkSpeedChk(void) { mac_ReadReg(MAC_WAKEUP_LINK_INT_STATUS_REG, &mac_InterruptStatus, 1); if (mac_InterruptStatus & STATUS_PRIMARY_IS_LINK_UP) { if (PBDP->MacInfo.LinkSpeed == 0) { if (PBDP->MacInfo.NetworkType != MAC_FORCE_ENBEDDED_PHY_10_HALF) { mac_GetMediaType(); } else { PBDP->MacInfo.FullDuplex = 0; PBDP->MacInfo.LinkSpeed = 10; PBDP->MacInfo.MediumLinkType = MEDIUM_ENABLE_RECEIVE; mac_WriteReg(MAC_MEDIUM_STATUS_MODE_REG, &PBDP->MacInfo.MediumLinkType, 1); } /* start operation */ mac_StartOperate(); DELAY_Ms(0x30); } } else { if (PBDP->MacInfo.LinkSpeed) { PBDP->MacInfo.LinkSpeed = 0; /* disable receive */ PBDP->MacInfo.MediumLinkType &= ~MEDIUM_ENABLE_RECEIVE; mac_WriteReg(MAC_MEDIUM_STATUS_MODE_REG, &PBDP->MacInfo.MediumLinkType, 1); STOE_WaitHwReleaseRcvBuf(); /* stop operation and reset Ethernet MAC packet buffer */ mac_StopOperate(); if (PBDP->MacInfo.NetworkType != MAC_FORCE_ENBEDDED_PHY_10_HALF) { PHY_WatchDog(); } } } return PBDP->MacInfo.LinkSpeed; } /* End of MAC_LinkSpeedChk */
/* * ---------------------------------------------------------------------------- * Function Name: MAC_Init * Purpose: initial all registers and variables of MAC. * Params: network_type -0: auto- negotiation * -1: fixed 100 full speed. * -2: fixed 100 half speed. * -3: fixed 10 full speed. * -4: fixed 10 half speed. * Returns: * Note: * ---------------------------------------------------------------------------- */ void MAC_Init(U8_T network_type) { U8_T XDATA temp[3]; /* read MAC address*/ mac_ReadReg(MAC_ADDR_REG, PNetStation->CurrStaAddr, MAC_ADDRESS_LEN); /* use embedded phy */ temp[0] = (PHY_SELECT_EMBEDDED | PHY_INTERNAL_PHY_OPERA_STATE | BIT1); mac_WriteReg(MAC_PHY_CTL_REG, temp, 1); /* phy power up */ PHY_PowerUp(); /* reset embedded phy */ temp[0] = (PHY_SELECT_EMBEDDED | BIT1); mac_WriteReg(MAC_PHY_CTL_REG, temp, 1); DELAY_Ms(2); /* set embedded phy to operating mode */ temp[0] = (PHY_SELECT_EMBEDDED | PHY_INTERNAL_PHY_OPERA_STATE | BIT1); mac_WriteReg(MAC_PHY_CTL_REG, temp, 1); /* stop & reset MAC operation */ mac_StopOperate(); if (network_type != FORCE_EMBEDDED_PHY_10_HALF) { /* phy initialize. */ PHY_Init(network_type); } PBDP->MacInfo.MediumLinkType = MEDIUM_ENABLE_TX_FLOWCTRL; PBDP->MacInfo.FullDuplex = 1; switch (network_type) { default: case AUTO_NEGOTIATION: PBDP->MacInfo.NetworkType = MAC_AUTO_NEGOTIATION; PBDP->MacInfo.MediumLinkType|=(MEDIUM_FULL_DUPLEX_MODE | MEDIUM_MII_100M_MODE | MEDIUM_ENABLE_RX_FLOWCTRL); break; case FIXED_100_FULL: PBDP->MacInfo.NetworkType = (MAC_LINK_100M_SPEED | MAC_LINK_FULL_DUPLEX); PBDP->MacInfo.MediumLinkType|=(MEDIUM_FULL_DUPLEX_MODE | MEDIUM_MII_100M_MODE | MEDIUM_ENABLE_RX_FLOWCTRL); break; case FIXED_100_HALF: PBDP->MacInfo.NetworkType = MAC_LINK_100M_SPEED; PBDP->MacInfo.MediumLinkType |= MEDIUM_MII_100M_MODE; break; case FIXED_10_FULL: PBDP->MacInfo.NetworkType = (MAC_LINK_10M_SPEED | MAC_LINK_FULL_DUPLEX); PBDP->MacInfo.MediumLinkType |= (MEDIUM_FULL_DUPLEX_MODE | MEDIUM_ENABLE_RX_FLOWCTRL); break; case FIXED_10_HALF: PBDP->MacInfo.NetworkType = MAC_LINK_10M_SPEED; break; case FORCE_EMBEDDED_PHY_10_HALF: PBDP->MacInfo.NetworkType = MAC_FORCE_ENBEDDED_PHY_10_HALF; PBDP->MacInfo.MediumLinkType = 0; break; } /* set medium status */ mac_WriteReg(MAC_MEDIUM_STATUS_MODE_REG, &PBDP->MacInfo.MediumLinkType, 1); /* set IPG */ temp[0] = 0x2b; temp[1] = 0x16; temp[2] = 0x95; mac_WriteReg(MAC_IPG_CTL_REG, temp, 3); /* set RX filter. */ temp[0] = BIT6; mac_WriteReg(MAC_RX_CTL_REG, temp, 1); MAC_SetRxFilter(MAC_RCV_BROADCAST); PBDP->MacInfo.LinkSpeed = 0; // Ethernet not linkup. /* decide interrupt mask */ #if (MAC_GET_INTSTATUS_MODE == MAC_INTERRUPT_MODE) PBDP->MacInfo.InterruptMask = PRIMARY_LINK_CHANGE_ENABLE; #endif } /* End of MAC_Init() */