Всем привет. Появился интерес, подкрепленный нуждой, подробно разобраться с KSZ8873RLL. Посмотрел в даташите где находятся какие регистры и попробовал прочитать через библиотечную функцию STM ETH_ReadPHYRegister. Результат был в виде 0xFFFF по любым адресам. Почитал описание этого интерфейса в даташите к контроллеру (STM32F107VC).Тут выяснилось различие в названиях интерфейсов: то, что у STM называется SMI, у микрела - MIIM, а то что у микрела SMI - что-то похожее, но с небольшими особенностями (это актуально конкретно к этому свичу). Само подключение свича правильное, т.к. через него получилось передавать Ehternet фреймы. Настройка проводилась через ETH_Init и тогда была подобрана магическая комбинация настроек, при которых он заработал (основное: ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; как я полагаю это счастливое стечение обстоятельств, что библиотечная прошивка для другого свича смогла тут подошла). Может кто занимался подобным вопросом и имеет божественное знание :-) по этой ситуации.
Вот основная часть функции чтения
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);