Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7X-EK и DM9161 - не работает инициализация PHY
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
vladik
Столкнулся с проблемой в sam7_emac.c (проект IAR), юзаю интерфейс MII,
в инициализации при чтении из PHY (vReadPHY) все время читается 0xFFFF здесь

Код
...

#if USE_RMII_INTERFACE != 1
{
    unsigned portLONG ulControl;

    /* PHY has internal pull down : disable MII isolate. */
    vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );
    vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );
    ulControl &= ~BMCR_ISOLATE;
    vWritePHY( AT91C_PHY_ADDR, MII_BMCR, ulControl );        
}
№endif

...


и здесь

Код
static portBASE_TYPE prvProbePHY( void )
{
unsigned portLONG ulPHYId1=0, ulPHYId2=0, ulStatus;
portBASE_TYPE xReturn = pdPASS;
unsigned portCHAR ucAddr1 = MII_PHYSID1, ucAddr2 = MII_PHYSID2;
    
    /* Code supplied by Atmel (reformatted) -----------------*/

    /* Enable management port */
    AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;    
    AT91C_BASE_EMAC->EMAC_NCFGR |= ( 2 ) << 10;

    /* Read the PHY ID. */
    vReadPHY( AT91C_PHY_ADDR, ucAddr1, &ulPHYId1 );
    vReadPHY( AT91C_PHY_ADDR, ucAddr2, &ulPHYId2 );    
    

    /*MII_DM9161_ID:
            PHY_ID1 = 0x0181
            PHY_ID2 = 0xb8a0
    */
    if( ( ( ulPHYId1 << 16 ) | ( ulPHYId2 & 0xfff0 ) ) != MII_DM9161_ID )
    {
        /* Did not expect this ID. */
        xReturn = pdFAIL;
    }
    else
    {
        ulStatus = xGetLinkSpeed();

        if( ulStatus != pdPASS )
        {
            xReturn = pdFAIL;
        }
    }
    /* Disable management port */
    AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;    

    return xReturn;
}


чтение из PHY:

Код
static void vReadPHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG *pulValue )
{
    /* Code supplied by Atmel (reformatted) ----------------------*/
    AT91C_BASE_EMAC->EMAC_MAN =     (AT91C_EMAC_SOF & (0x01<<30))
                                    | (2 << 16) | (2 << 28)
                                    | ((ucPHYAddress & 0x1f) << 23)
                                    | ((ucAddress & 0x1f) << 18);

    /* Wait until IDLE bit in Network Status register is cleared. */
    while( !( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE ) )
    {
        __asm( "NOP" );
    }
    *pulValue = ( AT91C_BASE_EMAC->EMAC_MAN & 0x0000ffff );    
}


В гугле нашел кое-чего про подобную проблему http://www.utasker.com/forum/index.php?topic=161.0 , но как-то яснее не стало
aaarrr
ucPHYAddress соответствует действительности?
vladik
aaarrr, действительно, проблема оказалась в неправильном ucPHYAddress. Я тупо начал перебирать их с 0 до 31, на адресе 16 EMAC завелся yeah.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.