Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PHY драйвер для KSZ8863
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
yanvasiij
Доброго времени суток!

Оживляю плату, у который в качестве физики эзернета заложена KSZ8863. Если у кого есть уже написанный драйвер для этой физики под RMII, поделитесь если не жалко. Буду очень признателен!
scifi
Нет такой штуки, как "драйвер PHY". Во многих случаях PHY работает сам по себе, ничего там в программе делать не надо. А если что-то надо делать, то это "что-то", во первых, сильно зависит от того, как устроена ваша программа, а во-вторых, составит не более 50 строк.
aaarrr
Цитата(yanvasiij @ Mar 28 2016, 09:08) *
Оживляю плату, у который в качестве физики эзернета заложена KSZ8863.

KSZ8863 - это свитч, поэтому вместо "драйвера" максимум нужна затычка, которая на все вопросы будет отвечать "Link up 100Mbit FDX", ибо других вариантов не предполагается.
yanvasiij
Цитата(aaarrr @ Mar 28 2016, 16:32) *
KSZ8863 - это свитч, поэтому вместо "драйвера" максимум нужна затычка, которая на все вопросы будет отвечать "Link up 100Mbit FDX", ибо других вариантов не предполагается.


Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру. Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял.
aaarrr
Цитата(yanvasiij @ Mar 28 2016, 14:55) *
Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру.

Это один из портов свитча.

Цитата(yanvasiij @ Mar 28 2016, 14:55) *
Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял.

Оживлял, проблем особых не было. Уточните, что именно не работает:
- Между внешними портами связь есть?
- Прием через RMII есть? Если нет, смотрели осциллографом RXDV?
- Как организовано тактирование?
yanvasiij
Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю.

Код
    HAL_ETH_ReadPHYRegister(&heth, 0x02, &high);
    HAL_ETH_ReadPHYRegister(&heth, 0x03, &low);


Между внешними портами связь есть. Попробовал через этот свитч соедининить комьютер и роутер - все работает.

Тактирование от внешнего кварца 25 МГц.
aaarrr
Цитата(yanvasiij @ Mar 28 2016, 16:05) *
Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю.

Возможность прочитать идентификатор подтверждает работоспособность SMI (MDC/MDIO), а не RMII.

Цитата(yanvasiij @ Mar 28 2016, 16:05) *
Тактирование от внешнего кварца 25 МГц.

Лучше приведите схему, с тактированием там есть нюансы.
yanvasiij
Цитата(aaarrr @ Mar 28 2016, 18:09) *
Возможность прочитать идентификатор подтверждает работоспособность SMI (MDC/MDIO), а не RMII.


Лучше приведите схему, с тактированием там есть нюансы.


Выкинув из схемы лишнее получается следующее:

Нажмите для просмотра прикрепленного файла

Да, я Вас обманул - используется специальная микросхема для тактирования
aaarrr
На вид все нормально (у меня, правда, была другая конфигурация с 25МГц входом). Посмотрите, есть ли импульсы на SMRXDV3 при внешнем пинге.
Да, у Вас CRS_DV и TX_EN на RMII не перепутаны случайно?
yanvasiij
Цитата(aaarrr @ Mar 28 2016, 18:49) *
На вид все нормально (у меня, правда, была другая конфигурация с 25МГц входом). Посмотрите, есть ли импульсы на SMRXDV3 при внешнем пинге.
Да, у Вас CRS_DV и TX_EN на RMII не перепутаны случайно?


Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?). CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы?
aaarrr
Цитата(yanvasiij @ Mar 28 2016, 17:24) *
Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?).

Да, там обычно много чего ходит broadcast'ом.

Цитата(yanvasiij @ Mar 28 2016, 17:24) *
CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы?

Просто именованы на схеме странно: получились группы "RXDx и TX_EN" и "TXDx CRS_DV".
yanvasiij
Вообщем есть у меня проект под eval c KSZ8721 со стеком RL TCPnet. На eval все пингуется и работает. Начал переносить все тоже самое на KSZ8863, разница там только в микросхеме физики и схеме ее подключения (используются другие "ремапные" ноги). Переделал инициализацию EMAK по аналогии с тем, что было для KSZ8721, вот что получилось (тут с подсветкой):

CODE


void init_ethernet (void)
{
/* Включаю тактирование на порты в.в. */
...

/* Initialize the ETH ethernet controller. */
U32 regv,tout,id1,id2,conn;
/* Enable System configuration controller clock */
RCC->APB2ENR |= (1 << 14);

/* Reset Ethernet MAC */
RCC->AHB1RSTR |= 0x02000000;

SYSCFG->PMC |= (1 << 23);

RCC->AHB1RSTR &= ~0x02000000;

RCC->AHB1ENR |= 0x1E000047;

/* Configure Port A ethernet pins (PA.1, PA.2, PA.7) */
GPIOA->MODER &= ~0x0000C03C;
GPIOA->MODER |= 0x00008028; /* Pins to alternate function */
GPIOA->OTYPER &= ~0x00000086; /* Pins in push-pull mode */
GPIOA->OSPEEDR |= 0x0000C03C; /* Slew rate as 100MHz pin */
GPIOA->PUPDR &= ~0x0000C03C; /* No pull up, no pull down */

GPIOA->AFR[0] &= ~0xF0000FF0;
GPIOA->AFR[0] |= 0xB0000BB0; /* Pins to AF11 (Ethernet) */

/* Configure Port C ethernet pins (PC.1, PC.4, PC.5) */
GPIOC->MODER &= ~0x00000F0C;
GPIOC->MODER |= 0x00000A08; /* Pins to alternate function */
GPIOC->OTYPER &= ~0x00000032; /* Pins in push-pull mode */
GPIOC->OSPEEDR |= 0x00000F0C; /* Slew rate as 100MHz pin */
GPIOC->PUPDR &= ~0x00000F0C; /* No pull up, no pull down */

GPIOC->AFR[0] &= ~0x00FF00F0;
GPIOC->AFR[0] |= 0x00BB00B0; /* Pins to AF11 (Ethernet) */

/* Configure Port B ethernet pins (PB.12, PB.13) */
GPIOB->MODER &= ~0x0F000000;
GPIOB->MODER |= 0x0A000000; /* Pin to alternate function */
GPIOB->OTYPER &= ~0x00003000; /* Pin in push-pull mode */
GPIOB->OSPEEDR |= 0x0F000000; /* Slew rate as 100MHz pin */
GPIOB->PUPDR &= ~0x0F000000; /* No pull up, no pull down */

GPIOB->AFR[1] &= ~0x00FF0000;
GPIOB->AFR[1] |= 0x00BB0000; /* Pin to AF11 (Ethernet) */

/* Configure Port B ethernet pins (PB.11) */
GPIOB->MODER &= ~0x00C00000;
GPIOB->MODER |= 0x00800000; /* Pins to alternate function */
GPIOB->OTYPER &= ~0x00000800; /* Pins in push-pull mode */
GPIOB->OSPEEDR |= 0x00C00000; /* Slew rate as 100MHz pin */
GPIOB->PUPDR &= ~0x0FF00000; /* No pull up, no pull down */

GPIOB->AFR[1] &= ~0x0000F000;
GPIOB->AFR[1] |= 0x0000B000; /* Pins to AF11 (Ethernet) */

ETH->DMABMR |= DBMR_SR;
while (ETH->DMABMR & DBMR_SR);
conn = 0;

/* HCLK Clock range 100-120MHz. */
ETH->MACMIIAR = 0x00000004;

/* Put the LAN8700 in reset mode */
write_PHY (PHY_REG_BCR, 0x8000);

/* Wait for hardware reset to end. */
for (tout = 0; tout < 0x100000; tout++)
{
regv = read_PHY (PHY_REG_BCR);
if (!(regv & 0x8000)) {
/* Reset complete */
break;
}
}

/* Check if this is a KSZ8863 PHY. */
id1 = read_PHY (PHY_REG_PID1);
id2 = read_PHY (PHY_REG_PID2);
if (((id1 << 16) | (id2 & 0xFFF0)) == 0x221430)
{
/* Use autonegotiation about the link speed. */
write_PHY (PHY_REG_BCR, PHY_AUTO_NEG);
/* Wait to complete Auto_Negotiation. */
for (tout = 0; tout < 0x100000; tout++) {
regv = read_PHY (PHY_REG_BSR);
if (regv & 0x0020) {
/* Autonegotiation Complete. */
break;
}
}
}

/* Check the link status. */
for (tout = 0; tout < 0x10000; tout++)
{
regv = read_PHY (PHY_REG_BSR);
if (regv & 0x0004)
{
conn |= PHY_CON_SET_FULLD;
/* Link is on. */
break;
}
}

/* Initialize MAC configuration register */
ETH->MACCR = MCR_ROD;

/* Configure Full/Half Duplex mode. */
if (regv & 0x0004)
{
/* Full duplex is enabled. */
conn |= PHY_CON_SET_FULLD;
}
else
{
/* Half duplex mode. */
}

/* Configure 100MBit/10MBit mode. */
if (regv & 0x0002)
{
/* 10MBit mode. */
}
else
{
/* 100MBit mode. */
conn |= PHY_CON_SET_100M;
}

/* Configure Full/Half Duplex mode. */
if (conn & PHY_CON_SET_FULLD) {
/* Full duplex is enabled. */
ETH->MACCR |= MCR_DM;
}

/* Configure 100MBit/10MBit mode. */
if (conn & PHY_CON_SET_100M) {
/* 100MBit mode. */
ETH->MACCR |= MCR_FES;
}

/* MAC address filtering, accept multicast packets. */
ETH->MACFFR = MFFR_HPF | MFFR_PAM;
ETH->MACFCR = MFCR_ZQPD;

/* Set the Ethernet MAC Address registers */
ETH->MACA0HR = ((U32)own_hw_adr[5] << 8) | (U32)own_hw_adr[4];
ETH->MACA0LR = ((U32)own_hw_adr[3] << 24) | (U32)own_hw_adr[2] << 16 |
((U32)own_hw_adr[1] << 8) | (U32)own_hw_adr[0];

/* Initialize Tx and Rx DMA Descriptors */
rx_descr_init ();
tx_descr_init ();

/* Flush FIFO, start DMA Tx and Rx */
ETH->DMAOMR = DOMR_FTF | DOMR_ST | DOMR_SR;

/* Enable receiver and transmiter */
ETH->MACCR |= MCR_TE | MCR_RE;

/* Reset all interrupts */
ETH->DMASR = 0xFFFFFFFF;

/* Enable Rx and Tx interrupts. */
ETH->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE | ETH_DMAIER_RIE;

}



Не могу добиться пингов. Что я упускаю?
Corvus
С KSZ8721 не работал. Но по своему опыту, если не стартует новый PHY, то в 95% случаев нужно проверять strapping pins.
scifi
Цитата(yanvasiij @ Mar 29 2016, 07:29) *
Не могу добиться пингов. Что я упускаю?

Проверить правильность сигналов осциллографом. Они все на виду. Если сигналы правильные, то влезть в софт и копать там.
yanvasiij
Цитата(aaarrr @ Mar 28 2016, 20:02) *
Да, там обычно много чего ходит broadcast'ом.


Просто именованы на схеме странно: получились группы "RXDx и TX_EN" и "TXDx CRS_DV".


Вообщем еще раз перепроверил - действительно пины перепутаны! Перепаял и все заработало - пинги есть, как свитч все прекрасно работает. Спасибо Вам огромное!
nvn
подскажите почему у вас цепи TXxx и RXxx к идущие трансформатору подтянуты резисторами к 3.3А? в "KSZ8863RLL Reference Design Revision 1.0" они не подтянуты никуда, а резисторами через конденсаторы подключены на землю, причем попарно.
где все таки правильно?

использую LAN8720 там подключено как у вас, сейчас рисую схему с KSZ8863RLL и возник вопрос.

и еще вопрос: по шине MDC/MDIO доступны все регистры свитча?
scifi
Цитата(nvn @ Oct 18 2016, 12:05) *
где все таки правильно?

Правильно - в примерах от производителя. Я использую KSZ8081, там трансформатор цепляется к PHY напрямую. Полагаю, во всех современных микросхемах Микрела сделано так же.
LightElf
QUOTE (scifi @ Oct 18 2016, 12:53) *
Правильно - в примерах от производителя. Я использую KSZ8081, там трансформатор цепляется к PHY напрямую. Полагаю, во всех современных микросхемах Микрела сделано так же.

8863 - не современный. Там таки резисторы есть, вещаются через кондер 0.1 на землю. Насчет примера от производятла - полностью согласен. Там все есть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.