Вот основная часть функции чтения
CODE
tmpreg = ETH->MACMIIAR;
/* Keep only the CSR Clock Range CR[2:0] bits value */
tmpreg &= ~MACMIIAR_CR_MASK;//сохраняем биты отвечающие за скорость соединения
/* Prepare the MII address register value */
tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ //заносим адрес PHY и выделяем маской
tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ //заносим адрес нужного регистра и выделяем маской
tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ //сбрасываем бит, что означает режим чтения
tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ // устанавливаем бит, сигнализирующий проц к началу чтения
/* Write the result value into the MII Address register */
ETH->MACMIIAR = tmpreg;
/* Check for the Busy flag */
do
{
timeout++;
tmpreg = ETH->MACMIIAR;
} while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
/* Return ERROR in case of timeout */
if(timeout == PHY_READ_TO)
{
return (uint16_t)ETH_ERROR;
}
/* Return data register value */
return (uint16_t)(ETH->MACMIIDR);
/* Keep only the CSR Clock Range CR[2:0] bits value */
tmpreg &= ~MACMIIAR_CR_MASK;//сохраняем биты отвечающие за скорость соединения
/* Prepare the MII address register value */
tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ //заносим адрес PHY и выделяем маской
tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ //заносим адрес нужного регистра и выделяем маской
tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ //сбрасываем бит, что означает режим чтения
tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ // устанавливаем бит, сигнализирующий проц к началу чтения
/* Write the result value into the MII Address register */
ETH->MACMIIAR = tmpreg;
/* Check for the Busy flag */
do
{
timeout++;
tmpreg = ETH->MACMIIAR;
} while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO));
/* Return ERROR in case of timeout */
if(timeout == PHY_READ_TO)
{
return (uint16_t)ETH_ERROR;
}
/* Return data register value */
return (uint16_t)(ETH->MACMIIDR);