|
PHY драйвер для KSZ8863 |
|
|
|
Mar 28 2016, 11:55
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(aaarrr @ Mar 28 2016, 16:32)  KSZ8863 - это свитч, поэтому вместо "драйвера" максимум нужна затычка, которая на все вопросы будет отвечать "Link up 100Mbit FDX", ибо других вариантов не предполагается. Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру. Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял.
|
|
|
|
|
Mar 28 2016, 12:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(yanvasiij @ Mar 28 2016, 14:55)  Нет у KSZ8863 помимо свитча есть еще MII/RMII для подключения к ЕМАК контроллеру. Это один из портов свитча. Цитата(yanvasiij @ Mar 28 2016, 14:55)  Вот у меня не получается заставить работать как раз эту часть, не могу добиться хотябы пингов. Вот и подумал спросить может уже кто оживлял. Оживлял, проблем особых не было. Уточните, что именно не работает: - Между внешними портами связь есть? - Прием через RMII есть? Если нет, смотрели осциллографом RXDV? - Как организовано тактирование?
|
|
|
|
|
Mar 28 2016, 13:05
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю. Код HAL_ETH_ReadPHYRegister(&heth, 0x02, &high); HAL_ETH_ReadPHYRegister(&heth, 0x03, &low); Между внешними портами связь есть. Попробовал через этот свитч соедининить комьютер и роутер - все работает. Тактирование от внешнего кварца 25 МГц.
|
|
|
|
|
Mar 28 2016, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(yanvasiij @ Mar 28 2016, 16:05)  Чтобы проверить связь с микросхемой я запросил Physical Identifier. По даташиту он должен быть 0x0022 страшем и 0x1430 в младшем -> при считывании так и оказалось. Связь по RMII есть я так понимаю. Возможность прочитать идентификатор подтверждает работоспособность SMI (MDC/MDIO), а не RMII. Цитата(yanvasiij @ Mar 28 2016, 16:05)  Тактирование от внешнего кварца 25 МГц. Лучше приведите схему, с тактированием там есть нюансы.
|
|
|
|
|
Mar 28 2016, 13:32
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(aaarrr @ Mar 28 2016, 18:09)  Возможность прочитать идентификатор подтверждает работоспособность SMI (MDC/MDIO), а не RMII.
Лучше приведите схему, с тактированием там есть нюансы. Выкинув из схемы лишнее получается следующее:
Да, я Вас обманул - используется специальная микросхема для тактирования
|
|
|
|
|
Mar 28 2016, 14:24
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(aaarrr @ Mar 28 2016, 18:49)  На вид все нормально (у меня, правда, была другая конфигурация с 25МГц входом). Посмотрите, есть ли импульсы на SMRXDV3 при внешнем пинге. Да, у Вас CRS_DV и TX_EN на RMII не перепутаны случайно? Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?). CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы?
|
|
|
|
|
Mar 28 2016, 15:02
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(yanvasiij @ Mar 28 2016, 17:24)  Движение на SMRXDV3 есть, даже без пингов (возможно потому, что железка подключена к локальной сети, где много чего ходит?). Да, там обычно много чего ходит broadcast'ом. Цитата(yanvasiij @ Mar 28 2016, 17:24)  CRS_DV и TX_EN не перепутаны - проверил только что. А почему вы предположили, что они перепутаны, есть какие-то ньюансы? Просто именованы на схеме странно: получились группы "RXDx и TX_EN" и "TXDx CRS_DV".
|
|
|
|
|
Mar 29 2016, 04:29
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Вообщем есть у меня проект под 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;
}
Не могу добиться пингов. Что я упускаю?
|
|
|
|
|
Mar 29 2016, 06:51
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(aaarrr @ Mar 28 2016, 20:02)  Да, там обычно много чего ходит broadcast'ом.
Просто именованы на схеме странно: получились группы "RXDx и TX_EN" и "TXDx CRS_DV". Вообщем еще раз перепроверил - действительно пины перепутаны! Перепаял и все заработало - пинги есть, как свитч все прекрасно работает. Спасибо Вам огромное!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|