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.
Hi team,
My customer used DP83822I design the board and the controlled is ST MCU. They wan't let ST communicate with PC by PHY.
But now DP83822I can't connect the PC and we read the (0x0001 Register) and found Link Status still 0.
BTW, SMI interface is ok because we read and write Register nomarlly.
Do you have any suggestions? Below is the SCH.
Hi Eggsy,
I see no external 50 ohm pull-up resistors on TD+/- or RD+/- pins.
This device is a current mode line driver and requires those external pull-up resistors.
Hi Ross,
Thanks for your hlep!
Today customer add external 50 ohm pull-up resistors on TD+/- or RD+/- pins but it doesn't help.
Still can't connect the PC and we read the (0x0001 Register) and found Link Status still 0.
Do you have other suggestions?
Below attached file is their proccess of Initialize DP83822.
/** ****************************************************************************** * @file lan83822.c * @author MCD Application Team * @version V1.0.0 * @date 08-March-2017 * @brief This file provides a set of functions needed to manage the LAN742 * PHY devices. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "lan83822.h" #include "lan83822h.h" /** @addtogroup BSP * @{ */ /** @addtogroup Component * @{ */ /** @defgroup LAN83822 LAN83822 * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /** @defgroup LAN83822_Private_Defines LAN83822 Private Defines * @{ */ #define LAN83822_SW_RESET_TO ((uint32_t)500U) #define LAN83822_INIT_TO ((uint32_t)2000U) #define LAN83822_MAX_DEV_ADDR ((uint32_t)31U) /** * @} */ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup LAN83822_Private_Functions LAN83822 Private Functions * @{ */ /** * @brief Register IO functions to component object * @param pObj: device object of LAN83822_Object_t. * @param ioctx: holds device IO functions. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_ERROR if missing mandatory function */ int32_t LAN83822_RegisterBusIO(lan83822_Object_t *pObj, lan83822_IOCtx_t *ioctx) { if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick) { return LAN83822_STATUS_ERROR; } pObj->IO.Init = ioctx->Init; pObj->IO.DeInit = ioctx->DeInit; pObj->IO.ReadReg = ioctx->ReadReg; pObj->IO.WriteReg = ioctx->WriteReg; pObj->IO.GetTick = ioctx->GetTick; return LAN83822_STATUS_OK; } /** * @brief Initialize the lan83822 and configure the needed hardware resources * @param pObj: device object LAN83822_Object_t. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_ADDRESS_ERROR if cannot find device address * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register * LAN83822_STATUS_RESET_TIMEOUT if cannot perform a software reset */ int32_t LAN83822_Init(lan83822_Object_t *pObj) { uint32_t tickstart = 0, write_regvalue = 0, addr = 0,read_regvalue = 0; int32_t status = LAN83822_STATUS_OK; if(pObj->Is_Initialized == 0) { if(pObj->IO.Init != 0) { /* GPIO and Clocks initialization */ pObj->IO.Init(); } addr = 1; pObj->DevAddr = addr; /* for later check */ // pObj->DevAddr = LAN83822H_MAX_DEV_ADDR + 1; // // /* Get the device address from special mode register */ // for(addr = 1; addr <= LAN83822H_MAX_DEV_ADDR; addr ++) // { // if(pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001f) >= 0) // { // status = LAN83822_STATUS_OK; // pObj->DevAddr = addr; // break; // } // else // { // status = LAN83822_STATUS_WRITE_ERROR; // continue; // } // } //========================================================================== // if(pObj->IO.ReadReg(addr, LAN83822H_ADDAR, &read_regvalue) >= 0) // { // status = LAN83822_STATUS_OK; // // break; // }else // { // status = LAN83822_STATUS_WRITE_ERROR; // continue; // } // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001fU); // pObj->IO.WriteReg(addr, LAN83822H_ADDAR, 0x0000U); // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x401fU); // pObj->IO.ReadReg(addr, LAN83822H_ADDAR, &read_regvalue); // read_regvalue = 0; // pObj->IO.WriteReg(addr, LAN83822H_ADDAR, 0x7000U); // pObj->IO.ReadReg(addr, LAN83822H_ADDAR, &read_regvalue); // // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001fU); // pObj->IO.WriteReg(addr, LAN83822H_ADDAR, 0x0001U); // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x401fU); // pObj->IO.ReadReg(addr, LAN83822H_ADDAR, &read_regvalue); // // pObj->IO.ReadReg(addr, LAN83822H_ADDAR, &read_regvalue); // // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001f); // pObj->IO.ReadReg(addr, 0x0000U, &read_regvalue);//indirect // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001f); // pObj->IO.ReadReg(addr, 0x0002U, &read_regvalue); // pObj->IO.WriteReg(addr, LAN83822H_REGCR, 0x001f); // pObj->IO.ReadReg(addr, 0x0001U, &read_regvalue); // break; //============================================================ if(pObj->DevAddr > LAN83822H_MAX_DEV_ADDR) { status = LAN83822_STATUS_ADDRESS_ERROR; } /* if device address is matched */ if(status == LAN83822_STATUS_OK) { /* set a software reset */ pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); write_regvalue = LAN83822H_BMCR_SOFT_RESET | read_regvalue; if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, write_regvalue) >= 0) { /* get software reset status */ if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue) >= 0) { tickstart = pObj->IO.GetTick(); /* wait until software reset is done or timeout occured */ while(read_regvalue & LAN83822H_BMCR_SOFT_RESET) { if((pObj->IO.GetTick() - tickstart) <= LAN83822H_SW_RESET_TO) { if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue) < 0) { status = LAN83822_STATUS_READ_ERROR; break; } } else { status = LAN83822_STATUS_RESET_TIMEOUT; } } } else { status = LAN83822_STATUS_READ_ERROR; } } else { status = LAN83822_STATUS_WRITE_ERROR; } } } //MII Loopback in BMCR // pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); // pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); // pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); // pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, 0x6100U); // pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); // 0x0004 Auto-Negotiation Advertisement Register (ANAR) pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_ANAR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, 0x01E1U); pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); if(status == LAN83822_STATUS_OK) { tickstart = pObj->IO.GetTick(); /* Wait for 2s to perform initialization */ while((pObj->IO.GetTick() - tickstart) <= LAN83822H_INIT_TO) { } pObj->Is_Initialized = 1; } return status; } /** * @brief De-Initialize the lan83822 and it's hardware resources * @param pObj: device object LAN83822_Object_t. * @retval None */ int32_t LAN83822_DeInit(lan83822_Object_t *pObj) { if(pObj->Is_Initialized) { if(pObj->IO.DeInit != 0) { if(pObj->IO.DeInit() < 0) { return LAN83822_STATUS_ERROR; } } pObj->Is_Initialized = 0; } return LAN83822_STATUS_OK; } /** * @brief Disable the LAN83822 power down mode. * @param pObj: device object LAN83822_Object_t. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_DisablePowerDownMode(lan83822_Object_t *pObj) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMSR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_BMSR, &readval) >= 0) { readval &= ~LAN83822_BCR_POWER_DOWN; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_BMSR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Enable the LAN83822 power down mode. * @param pObj: device object LAN83822_Object_t. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_EnablePowerDownMode(lan83822_Object_t *pObj) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMSR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &readval) >= 0) { readval |= LAN83822_BCR_POWER_DOWN; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Start the auto negotiation process. * @param pObj: device object LAN83822_Object_t. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_StartAutoNego(lan83822_Object_t *pObj) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMSR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &readval) >= 0) { readval |= LAN83822_BCR_AUTONEGO_EN; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Get the link state of LAN83822 device. * @param pObj: Pointer to device object. * @param pLinkState: Pointer to link state * @retval LAN83822_STATUS_LINK_DOWN if link is down * LAN83822_STATUS_AUTONEGO_NOTDONE if Auto nego not completed * LAN83822_STATUS_100MBITS_FULLDUPLEX if 100Mb/s FD * LAN83822_STATUS_100MBITS_HALFDUPLEX if 100Mb/s HD * LAN83822_STATUS_10MBITS_FULLDUPLEX if 10Mb/s FD * LAN83822_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_GetLinkState(lan83822_Object_t *pObj) { // uint32_t write_regvalue = 0,; uint32_t read_regvalue = 0; /* Read Status register */ pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMSR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue) < 0) { return LAN83822_STATUS_READ_ERROR; } /* Read Status register again */ if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue) < 0) { return LAN83822_STATUS_READ_ERROR; } if((read_regvalue & LAN83822H_BMSR_LINK_STATUS) == 0) { //register 4 pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_ANAR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); //register 5 pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_ANLPAR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); //register 6 pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_ANER); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue); /* Return Link Down status */ return LAN83822_STATUS_LINK_DOWN; } /* Check Auto negotiaition */ pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &read_regvalue) < 0) { return LAN83822_STATUS_READ_ERROR; } if((read_regvalue & LAN83822H_BMCR_AUTONEGO_EN) != LAN83822H_BMCR_AUTONEGO_EN) { if(((read_regvalue & LAN83822H_BMCR_SPEED_SELECT) == LAN83822H_BMCR_SPEED_SELECT) && ((read_regvalue & LAN83822H_BMCR_DUPLEX_MODE) == LAN83822H_BMCR_DUPLEX_MODE)) { return LAN83822_STATUS_100MBITS_FULLDUPLEX; } else if ((read_regvalue & LAN83822H_BMCR_SPEED_SELECT) == LAN83822H_BMCR_SPEED_SELECT) { return LAN83822_STATUS_100MBITS_HALFDUPLEX; } else if ((read_regvalue & LAN83822H_BMCR_DUPLEX_MODE) == LAN83822H_BMCR_DUPLEX_MODE) { return LAN83822_STATUS_10MBITS_FULLDUPLEX; } else { return LAN83822_STATUS_10MBITS_HALFDUPLEX; } } else /* Auto Nego enabled */ { // if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822_PHYSCSR, &readval) < 0) // { // return LAN83822_STATUS_READ_ERROR; // } // // /* Check if auto nego not done */ // if((readval & LAN83822_PHYSCSR_AUTONEGO_DONE) == 0) // { // return LAN83822_STATUS_AUTONEGO_NOTDONE; // } // // if((readval & LAN83822_PHYSCSR_HCDSPEEDMASK) == LAN83822_PHYSCSR_100BTX_FD) // { return LAN83822_STATUS_100MBITS_FULLDUPLEX; // } // else if ((readval & LAN83822_PHYSCSR_HCDSPEEDMASK) == LAN83822_PHYSCSR_100BTX_HD) // { // return LAN83822_STATUS_100MBITS_HALFDUPLEX; // } // else if ((readval & LAN83822_PHYSCSR_HCDSPEEDMASK) == LAN83822_PHYSCSR_10BT_FD) // { // return LAN83822_STATUS_10MBITS_FULLDUPLEX; // } // else // { // return LAN83822_STATUS_10MBITS_HALFDUPLEX; // } } } /** * @brief Set the link state of LAN83822 device. * @param pObj: Pointer to device object. * @param pLinkState: link state can be one of the following * LAN83822_STATUS_100MBITS_FULLDUPLEX if 100Mb/s FD * LAN83822_STATUS_100MBITS_HALFDUPLEX if 100Mb/s HD * LAN83822_STATUS_10MBITS_FULLDUPLEX if 10Mb/s FD * LAN83822_STATUS_10MBITS_HALFDUPLEX if 10Mb/s HD * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_ERROR if parameter error * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_SetLinkState(lan83822_Object_t *pObj, uint32_t LinkState) { uint32_t bcrvalue = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &bcrvalue) >= 0) { /* Disable link config (Auto nego, speed and duplex) */ bcrvalue &= ~(LAN83822_BCR_AUTONEGO_EN | LAN83822_BCR_SPEED_SELECT | LAN83822_BCR_DUPLEX_MODE); if(LinkState == LAN83822_STATUS_100MBITS_FULLDUPLEX) { bcrvalue |= (LAN83822_BCR_SPEED_SELECT | LAN83822_BCR_DUPLEX_MODE); } else if (LinkState == LAN83822_STATUS_100MBITS_HALFDUPLEX) { bcrvalue |= LAN83822_BCR_SPEED_SELECT; } else if (LinkState == LAN83822_STATUS_10MBITS_FULLDUPLEX) { bcrvalue |= LAN83822_BCR_DUPLEX_MODE; } else { /* Wrong link status parameter */ status = LAN83822_STATUS_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } if(status == LAN83822_STATUS_OK) { /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, bcrvalue) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } return status; } /** * @brief Enable loopback mode. * @param pObj: Pointer to device object. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_EnableLoopbackMode(lan83822_Object_t *pObj) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &readval) >= 0) { readval |= LAN83822_BCR_LOOPBACK; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Disable loopback mode. * @param pObj: Pointer to device object. * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_DisableLoopbackMode(lan83822_Object_t *pObj) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_BMCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &readval) >= 0) { readval &= ~LAN83822_BCR_LOOPBACK; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Enable IT source. * @param pObj: Pointer to device object. * @param Interrupt: IT source to be enabled * should be a value or a combination of the following: * LAN83822_WOL_IT * LAN83822_ENERGYON_IT * LAN83822_AUTONEGO_COMPLETE_IT * LAN83822_REMOTE_FAULT_IT * LAN83822_LINK_DOWN_IT * LAN83822_AUTONEGO_LP_ACK_IT * LAN83822_PARALLEL_DETECTION_FAULT_IT * LAN83822_AUTONEGO_PAGE_RECEIVED_IT * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_EnableIT(lan83822_Object_t *pObj, uint32_t Interrupt) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_PHYSCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_ADDAR, &readval) >= 0) { readval |= Interrupt; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Disable IT source. * @param pObj: Pointer to device object. * @param Interrupt: IT source to be disabled * should be a value or a combination of the following: * LAN83822_WOL_IT * LAN83822_ENERGYON_IT * LAN83822_AUTONEGO_COMPLETE_IT * LAN83822_REMOTE_FAULT_IT * LAN83822_LINK_DOWN_IT * LAN83822_AUTONEGO_LP_ACK_IT * LAN83822_PARALLEL_DETECTION_FAULT_IT * LAN83822_AUTONEGO_PAGE_RECEIVED_IT * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register * LAN83822_STATUS_WRITE_ERROR if connot write to register */ int32_t LAN83822_DisableIT(lan83822_Object_t *pObj, uint32_t Interrupt) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x001f); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_ADDAR, LAN83822H_PHYSCR); pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_REGCR, 0x401fU); if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822H_PHYSCR, &readval) >= 0) { readval &= ~Interrupt; /* Apply configuration */ if(pObj->IO.WriteReg(pObj->DevAddr, LAN83822H_PHYSCR, readval) < 0) { status = LAN83822_STATUS_WRITE_ERROR; } } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Clear IT flag. * @param pObj: Pointer to device object. * @param Interrupt: IT flag to be cleared * should be a value or a combination of the following: * LAN83822_WOL_IT * LAN83822_ENERGYON_IT * LAN83822_AUTONEGO_COMPLETE_IT * LAN83822_REMOTE_FAULT_IT * LAN83822_LINK_DOWN_IT * LAN83822_AUTONEGO_LP_ACK_IT * LAN83822_PARALLEL_DETECTION_FAULT_IT * LAN83822_AUTONEGO_PAGE_RECEIVED_IT * @retval LAN83822_STATUS_OK if OK * LAN83822_STATUS_READ_ERROR if connot read register */ int32_t LAN83822_ClearIT(lan83822_Object_t *pObj, uint32_t Interrupt) { uint32_t readval = 0; int32_t status = LAN83822_STATUS_OK; if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822_ISFR, &readval) < 0) { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @brief Get IT Flag status. * @param pObj: Pointer to device object. * @param Interrupt: IT Flag to be checked, * should be a value or a combination of the following: * LAN83822_WOL_IT * LAN83822_ENERGYON_IT * LAN83822_AUTONEGO_COMPLETE_IT * LAN83822_REMOTE_FAULT_IT * LAN83822_LINK_DOWN_IT * LAN83822_AUTONEGO_LP_ACK_IT * LAN83822_PARALLEL_DETECTION_FAULT_IT * LAN83822_AUTONEGO_PAGE_RECEIVED_IT * @retval 1 IT flag is SET * 0 IT flag is RESET * LAN83822_STATUS_READ_ERROR if connot read register */ int32_t LAN83822_GetITStatus(lan83822_Object_t *pObj, uint32_t Interrupt) { uint32_t readval = 0; int32_t status = 0; if(pObj->IO.ReadReg(pObj->DevAddr, LAN83822_ISFR, &readval) >= 0) { status = ((readval & Interrupt) == Interrupt); } else { status = LAN83822_STATUS_READ_ERROR; } return status; } /** * @} */ /** * @} */ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Can you please read for me register 0x467 and 0x468 using extended register access?
Also, Please measure the voltage on LED_0 and LED_1 when you force the device into reset.
What is the potential?