Перейти к содержанию
    

Доброго времени суток!

 

Оживляю плату, у который в качестве физики эзернета заложена KSZ8863. Если у кого есть уже написанный драйвер для этой физики под RMII, поделитесь если не жалко. Буду очень признателен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет такой штуки, как "драйвер PHY". Во многих случаях PHY работает сам по себе, ничего там в программе делать не надо. А если что-то надо делать, то это "что-то", во первых, сильно зависит от того, как устроена ваша программа, а во-вторых, составит не более 50 строк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оживляю плату, у который в качестве физики эзернета заложена KSZ8863.

KSZ8863 - это свитч, поэтому вместо "драйвера" максимум нужна затычка, которая на все вопросы будет отвечать "Link up 100Mbit FDX", ибо других вариантов не предполагается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

KSZ8863 - это свитч, поэтому вместо "драйвера" максимум нужна затычка, которая на все вопросы будет отвечать "Link up 100Mbit FDX", ибо других вариантов не предполагается.

 

Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру. Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру.

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

 

Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял.

Оживлял, проблем особых не было. Уточните, что именно не работает:

- Между внешними портами связь есть?

- Прием через RMII есть? Если нет, смотрели осциллографом RXDV?

- Как организовано тактирование?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю.

 

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

 

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

 

Тактирование от внешнего кварца 25 МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю.

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

 

Тактирование от внешнего кварца 25 МГц.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

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

 

post-69041-1459171911_thumb.png

 

Да, я Вас обманул - используется специальная микросхема для тактирования

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На вид все нормально (у меня, правда, была другая конфигурация с 25МГц входом). Посмотрите, есть ли импульсы на SMRXDV3 при внешнем пинге.

Да, у Вас CRS_DV и TX_EN на RMII не перепутаны случайно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На вид все нормально (у меня, правда, была другая конфигурация с 25МГц входом). Посмотрите, есть ли импульсы на SMRXDV3 при внешнем пинге.

Да, у Вас CRS_DV и TX_EN на RMII не перепутаны случайно?

 

Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?). CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?).

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

 

CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 


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;

}

 

Не могу добиться пингов. Что я упускаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С KSZ8721 не работал. Но по своему опыту, если не стартует новый PHY, то в 95% случаев нужно проверять strapping pins.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу добиться пингов. Что я упускаю?

Проверить правильность сигналов осциллографом. Они все на виду. Если сигналы правильные, то влезть в софт и копать там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

Вообщем еще раз перепроверил - действительно пины перепутаны! Перепаял и все заработало - пинги есть, как свитч все прекрасно работает. Спасибо Вам огромное!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...