Цитата(AndreiUS @ Jan 30 2012, 07:32)

Сделан ли у Вас корректный сброс PHY при включении?
ну по идее да. Стандартная процедура инициализации. Написана не мной. Лежит вот здесь
Код
c:\Keil\ARM\Boards\Atmel\AT91SAM7X-EK\RL\TCPnet\Library\EMAC_SAM7X.c
и поставляется вместе с кейлом и его библиотеками.
Кусок кода инициализации:
Код
void init_ethernet (void) {
/* Initialize the EMAC ethernet controller. */
U32 regv,tout,id1,id2;
/* Enable Peripheral Clock for EMAC Peripherals */
pPMC->PMC_PCER = (1 << AT91C_ID_PIOB) | (1 << AT91C_ID_EMAC);
/* Disable pull up on RXDV => PHY normal mode (not in test mode), */
/* and set MII mode. PHY has internal pull down. */
pPIOB->PIO_PPUDR= AT91C_PIO_PB16 | AT91C_PIO_PB15;
/* Clear PB18 <=> PHY powerdown */
pPIOB->PIO_IDR =
pPIOB->PIO_PER =
pPIOB->PIO_OER = AT91C_PIO_PB18;
pPIOB->PIO_CODR = AT91C_PIO_PB18;
/* After PHY power up, hardware reset the PHY */
pRSTC->RSTC_RCR = 0xA5000000 | AT91C_RSTC_EXTRST;
/* Wait for hardware reset to end. */
while (!(pRSTC->RSTC_RSR & AT91C_RSTC_NRSTL));
/* EMAC IO init for EMAC-PHY communication in MII. */
pPIOB->PIO_IDR =
pPIOB->PIO_PPUDR=
pPIOB->PIO_PDR =
pPIOB->PIO_ASR = AT91C_PB0_ETXCK_EREFCK | AT91C_PB1_ETXEN |
AT91C_PB2_ETX0 | AT91C_PB3_ETX1 |
AT91C_PB4_ECRS | AT91C_PB5_ERX0 |
AT91C_PB6_ERX1 | AT91C_PB7_ERXER |
AT91C_PB8_EMDC | AT91C_PB9_EMDIO |
AT91C_PB10_ETX2 | AT91C_PB11_ETX3 |
AT91C_PB12_ETXER | AT91C_PB13_ERX2 |
AT91C_PB14_ERX3 | AT91C_PB15_ERXDV_ECRSDV |
AT91C_PB16_ECOL | AT91C_PB17_ERXCK;
/* Enable communication between EMAC-PHY. */
enable_MDI ();
/* Put the DM9161 in reset mode */
write_PHY (PHY_REG_BMCR, BMCR_RESET);
/* Wait for hardware reset to end. */
for (tout = 0; tout < 0x100000; tout++) {
regv = read_PHY (PHY_REG_BMCR);
if (!(regv & BMCR_RESET)) {
/* Reset complete */
break;
}
}
/* Check if this is a DM9161 PHY. */
id1 = read_PHY (PHY_REG_PHYID1);
id2 = read_PHY (PHY_REG_PHYID2);
if (((id1 << 16) | (id2 & 0xfff0)) == MII_DM9161_ID) {
..........
}
.......
}
Вроде все корректно. На эв.кит. AT91SAM7X-EK все же работает нормально.