Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Корректный запуск свитча Micrel
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Log_in
Всем привет. Появился интерес, подкрепленный нуждой, подробно разобраться с 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);

ksv198
Цитата(Log_in @ Jan 30 2014, 17:01) *
Может кто занимался подобным вопросом и имеет божественное знание :-) по этой ситуации.


Добрый день! Никакого божественного знания. У свитча 3 порта - 1 RMII и 2 PHY.
К MDIO регистрам доступ точно такой же, как к любому другому физиксу (однопортовому).
Доступны 8 регистров - 6 стандартных и 2 дополнительных (см. страницу 34 даташита),
уточнить надо только адрес (PHYADDR), он у RMII части 0х03 (у физиксов, соответственно 0х01 и 0х02).
Для полного доступа ко всем регистрам (а их там чуть больше чем дофига) проще использовать
SPI или I2C интерфейс. Ну или дописать свою функцию для общения через SMI интерфейс
(на 35 странице в таблицах приведены отличия форматов побитно).
Log_in
Прошу прощения, что сразу сам сразу не написал причину проблемы, переключившись сразу на другую. Нога PWRND была в воздухе. Плата не моя, поэтому что-то исправлять не решился, но проверил на KSZ8895RQ. Данные записывались и считывались из регистров доступа MIIM. Но тут возникла другая проблема. На выходе SMRXC нет 50 МГц, при поступлении на Х1 25 МГц (мод клок включен LED2-2 - PU (default), выбран режим PHY Mode MII or RMII - Pin# (91, 86, 87) соответственно выставлены в 1 0 1 - резисторами в 1 кОм подтянуты к земли или питанию). Клоков как не было, так и нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.