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

AX88796C плохой пинг

Здравствуйте, уважаемые форумчане!

Начал разбираться с микросхемкой Ethernet контроллером AX88796C. Использую программный стек lwIP, завести соединение удалось, данные по UDP и TCP пересылаются.

Проблема в следующем: очень много пакетов теряется при передаче. При пинге пакетами по 32 байта через каждые 5 секунд теряется 83% пакетов, причём проходит ровно каждый шестой пакет. Время пинга 3-4мс - в норме. Увеличивая паузу между пингами, процент потерь падает пропорционально. Плата соединена с сетевой картой компа напрямую, никаких свитчей между ними нет.

Похоже, что переполняется некий буфер приёма, который освобождается со временем. Какой и где - пока не пойму. Чтение даташита ситуацию не прояснило.

Кто сталкивался с подобным, подскажите пожалуйста в чём проблема.

 

Лог пинга:

Address;Date;Time;Status;Responce
192.168.1.181;01.10.2014;14:24:25;Good;Replay from 192.168.1.181: bytes=32 time=7ms TTL=255
192.168.1.181;01.10.2014;14:24:32;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:24:38;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:24:44;Bad;Request Timed Out 
192.168.1.181;01.10.2014;14:24:50;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:24:56;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:02;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:07;Bad;Replay from 192.168.1.181: bytes=32 time=4ms TTL=255
192.168.1.181;01.10.2014;14:25:13;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:19;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:26;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:33;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:40;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:45;Bad;Replay from 192.168.1.181: bytes=32 time=3ms TTL=255
192.168.1.181;01.10.2014;14:25:51;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:25:58;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:04;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:11;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:18;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:23;Bad;Replay from 192.168.1.181: bytes=32 time=3ms TTL=255
192.168.1.181;01.10.2014;14:26:29;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:36;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:43;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:49;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:26:56;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:27:01;Bad;Replay from 192.168.1.181: bytes=32 time=3ms TTL=255
192.168.1.181;01.10.2014;14:27:08;Bad;Request Timed Out
192.168.1.181;01.10.2014;14:27:14;Bad;Request Timed Out

 

Настройки чипа взяты из примера AN00032 от Energy Micro, тоже приведу их:

/*Software Reset*/
  axspi_write_reg(PSR_RESET, P0_PSR);
  axspi_write_reg(PSR_RESET_CLR, P0_PSR);

  /* Make sure AX88796C is ready */
  timer_reset();
  while (1)
  {
    tmp16 = axspi_read_reg(P0_PSR);
    if ((tmp16 & PSR_DEV_READY) && (tmp16 != 0xFFFF))
    {
      break;
    }

    if (timer_tick() > 2000)
    {
      LWIP_DEBUGF(NETIF_DEBUG, ("Device not ready..\n\r"));
      /* return 0; */
    }
  }
  tmp16 = axspi_read_reg(P0_BOR);

  while (1)
  {
    tmp16 = axspi_read_reg(P0_BOR);
    if (tmp16 == 0x1234) break;
  }

  /*Register compresion = 0 */
  tmp16 = axspi_read_reg(P4_SPICR);
  axspi_write_reg((tmp16 & ~(SPICR_RCEN | SPICR_QCEN)), P4_SPICR);

  /*Set mac for AX88796C chip*/
  ax88796c_set_mac_addr(netif);

  /*Set crc*/
  ax_set_csums();

  /* Stuffing packet */
  tmp16 = axspi_read_reg(P1_RXBSPCR);
  /* Disable stuffing packet */
  /* Enable stuffing packet */
  axspi_write_reg(tmp16 | RXBSPCR_STUF_ENABLE, P1_RXBSPCR);

  /* Enable RX packet process */
  axspi_write_reg(RPPER_RXEN, P1_RPPER);


  /*set INT pin */
  tmp16 = axspi_read_reg(P0_FER);
  tmp16 = (tmp16 | FER_RXEN | FER_TXEN | FER_BSWAP | FER_IRQ_PULL | FER_INTLO);
  axspi_write_reg(tmp16, P0_FER);

  /*set PHY */
  ax_phy_init();


/**************************************************************************//**
* Function Name: ax_phy_init
* Purpose: phy initialize procedure.
* Params:    none
* Returns:    none
* Note:
*****************************************************************************/
void ax_phy_init(void)
{
  uint16_t tmp16;

  /* Setup LED mode */
  axspi_write_reg((LCR_LED0_EN | LCR_LED0_DUPLEX | LCR_LED1_EN |
                   LCR_LED1_100MODE), P2_LCR0);

  tmp16 = axspi_read_reg(P2_LCR1);
  axspi_write_reg((tmp16 & LCR_LED2_MASK) | LCR_LED2_EN | LCR_LED2_LINK, P2_LCR1);

  tmp16 = (POOLCR_PHYID(0x10) | POOLCR_POLL_EN | POOLCR_POLL_FLOWCTRL | POOLCR_POLL_BMCR);
  axspi_write_reg(tmp16, P2_POOLCR);

  ax88796c_mdio_write(0x10, 0x04, SPEED_DUPLEX_AUTO);
  ax88796c_mdio_write(0x10, 0x00, RESTART_AUTONEG);
}


/**************************************************************************//**
* Function Name: etherdev_init
* Purpose: ax88796 initialize procedure.
* Params:
* Returns:    none
* Note:
*****************************************************************************/
static void ax88796c_mdio_write(uint16_t phy_id, uint16_t loc, uint16_t val)
{
  uint16_t timeout;
  uint16_t tmp16;

  axspi_write_reg(val, P2_MDIODR);
  axspi_write_reg((MDIOCR_RADDR(loc) | MDIOCR_FADDR(phy_id) | MDIOCR_WRITE), P2_MDIOCR);

  for (timeout = 0; timeout < 10000; timeout++)
  {
    tmp16 = axspi_read_reg(P2_MDIOCR);
    if ((tmp16 & MDIOCR_VALID) != 0)
    {
      break;
    }
  }
}

 

Впервые пишу сюда, так что не обессудьте если что не так))

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


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

..При пинге пакетами по 32 байта через каждые 5 секунд теряется 83% пакетов, причём проходит ровно каждый шестой пакет. ..

 

очень смахивает на краевые условия. кончается буфер, переинициализация, или ышо типа того...

 

совет дня типа:

заведите кусок памяти и пишите из контрольных точек ID пакета. Вам нужно всего 2 точки. Методом приближений быстро вычислите проблему.

не плохие начальные срезы:

выход-вход драйвера нижнего уровня,

IP, ICMP(echo)

 

послали пачку (штук 10). брэйк дебаг - смотрите где и какие проходили пакеты. проблемное место опять делите лапопалам и т.д... вплоть до

инструкции языка...

 

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


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

а что говорит wireshark? нет ли сплошного потока каких-то левых пакетов? например, сотен бесполезных ARP за секунду?

MAC-адрес выставляли руками? если да, то бит broadcast-а ненароком не поставили?

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


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

а что говорит wireshark?

Wireshark помог)). Когда включаю Wireshark на прослушивание ping появляется! Выключаю - пропадает. Попробовал на другой сетевой - то же самое.

Фигня какая-то...

MAC-адрес выставляли руками? если да, то бит broadcast-а ненароком не поставили?

Проверил ещё раз, всё нормально, бит сброшен.

 

заведите кусок памяти и пишите из контрольных точек ID пакета. Вам нужно всего 2 точки. Методом приближений быстро вычислите проблему.

не плохие начальные срезы:

выход-вход драйвера нижнего уровня,

IP, ICMP(echo)

послали пачку (штук 10). брэйк дебаг - смотрите где и какие проходили пакеты. проблемное место опять делите лапопалам и т.д... вплоть до

инструкции языка...

Сейчас попробую.

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


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

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

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

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

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

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

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

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

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

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