Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RTL8201
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
InsolentS
Здравствуйте!:)
Имеется девайс на AT91SAM7X256+RTL8201BL+разьём RD1-1D5B1A1A.
Пытаюсь инициализировать на основе атмеловского кода для DM9161, но ничего не получаетсяsad.gif
Как я понял, данная связка(SAM7X+RTL8201) очень популярная на этом форуме, может у кого-нибудь завалялся кусочек кода?wink.gif

P.S. ещё вопросец, как микросхемы типа визнет без проблем работают с любым PHY, может есть какой-нибудь универсальный код?
InsolentS
люди добрые, помогите плиззззз....проект встал, а мне его сдавать месяц назад :'(
Gemm
Цитата(InsolentS @ Jul 9 2007, 00:26) *
люди добрые, помогите плиззззз....проект встал, а мне его сдавать месяц назад :'(


Вот так я делаю. Сначала ресет, ждем его завершения. Потом разрешаю auto negatiation, ждем завершения. На физикле загорается светодиодик. Потом из регистров физикла читаем скорость и дуплекс. Может что и не совсем рационально - но все работает.




Код
#ifdef RTL8201
  
  #define MII_BMSR_REG          0x01
  #define MII_ANLPAR_REG        0x05
  
  unsigned short stat1, stat;
  
  stat = AT91F_MII_ReadPhy(pEmac, 0x00);
  AT91F_MII_WritePhy(pEmac, 0x00, stat | 0x8000);       //  reset
  do
    stat = AT91F_MII_ReadPhy(pEmac, 0x00);
  while(stat & 0x8000);
  dbgu_out("PHY reset completed.\n\r");
  AT91F_MII_WritePhy(pEmac, 0x00, stat | 0x1000);       //  auto negotiation enabled
  do
    stat = AT91F_MII_ReadPhy(pEmac, 0x01);              //  auto neg. completed
  while(!(stat & 0x20));  
  dbgu_out("PHY auto negotiation completed.\n\r");
  
  stat = AT91F_MII_ReadPhy(pEmac, MII_BMSR_REG);
  stat1 = AT91F_MII_ReadPhy(pEmac, MII_ANLPAR_REG);
  
  if ((stat & (1 << 14)) && (stat1 & (1 << 8)) ) {
    pEmac->EMAC_CFG |= (AT91C_EMAC_SPD| AT91C_EMAC_FD);
    dbgu_out("set MII for 100BaseTX and Full Duplex\n\r");
  } else if ((stat & (1 << 12)) && (stat1 & (1 << 6)) ) {
    pEmac->EMAC_CFG = (pEmac->EMAC_CFG & AT91C_EMAC_SPD) | AT91C_EMAC_FD;
    dbgu_out("set MII for 10BaseT and Full Duplex\n\r");
  } else if ((stat & (1 << 13)) && (stat1 & (1 << 7)) ) {
    pEmac->EMAC_CFG = (pEmac->EMAC_CFG | AT91C_EMAC_SPD ) & ~AT91C_EMAC_FD;
    dbgu_out("set MII for 100BaseTX and Half Duplex\n\r");
  } else if ((stat & (1 << 11)) && (stat1 & (1 << 5)) ) {
    pEmac->EMAC_CFG = pEmac->EMAC_CFG & ~AT91C_EMAC_SPD & ~AT91C_EMAC_FD;
    dbgu_out("set MII for 10BaseT and Half Duplex\n\r");          
  }
  
  
#else
_dem
на основе Атмеловского кода все вроде бы нормально работает. нужно поменять 2 вещи - это
id физики - у DM 0x181b8a0, у RTL - 0x00225540
и задержку резета - вместо (1 << 8) поставь в подобном этому коде

Код
    /* After PHY power up, hardware reset. */
    AT91C_BASE_RSTC->RSTC_RMR = emacRESET_KEY | emacRESET_LENGTH;
    AT91C_BASE_RSTC->RSTC_RCR = emacRESET_KEY | AT91C_RSTC_EXTRST;


( 9 << 8)

и все


остальное все идентично


да, и не забудь проверить аппаратный адрес, который задается ножками физикла
InsolentS
Всем огромное, огромное спасибо!!! smile.gif с меня пиво beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.