Запусти автонастройку что-ли (для F4):
void eth::phy::autonegotiation_start()
{
uint32_t reg = 0;
uint32_t tmp = 0;
uint32_t time = systick::getTick();
// Запуск автонастройки
write_register(PHY_ADR, PHY_REG_BCR, PHY_BCR_AN);
// Ждём завершения процедуры
while((!(read_register(PHY_ADR, PHY_REG_BSR)&PHY_BSR_ANC))&&(tmp < 500))
{
tmp = systick::getTick() - time;
}
reg = read_register(PHY_ADR, PHY_REG_ESR);
if (reg & PHY_ESR_FD){
ETH->MACCR |= ETH_MACCR_DM; // Duplex mode
}
else
{
ETH->MACCR &= ~ETH_MACCR_DM; // Half-duplex mode
}
if (reg & PHY_ESR_10M)
{
ETH->MACCR &= ~ETH_MACCR_FES; // Low Ethernet Speed, 10 Mbit/s
}
else
{
ETH->MACCR |= ETH_MACCR_FES; // Fast Ethernet Speed, 100 Mbit/s
}
return;
}
/* Функция void eth::phy::write_register(uint8_t adr, uint8_t reg, uint16_t data)
* Описание: Функция позволяет осуществлять запись в регистры PHY
* Параметры: adr - адрес микросхемы PHY
* reg - адрес регистра для записи
* data - значение для записи
*/
void eth::phy::write_register(uint8_t adr, uint8_t reg, uint16_t data)
{
ETH->MACMIIAR &= ETH_MACMIIAR_CR; // Первичная очистка регистра
ETH->MACMIIAR |= (adr<<11)Ð_MACMIIAR_PA; // Задаем адрес микросхемы PHY
ETH->MACMIIAR |= (reg<<6)Ð_MACMIIAR_MR; // Задаем адрес регистра PHY
ETH->MACMIIDR = data; // Задаём данные для передачи
ETH->MACMIIAR |= ETH_MACMIIAR_MW; // Действие - запись
ETH->MACMIIAR |= ETH_MACMIIAR_MB; // Выполняем процедуру записи
while(ETH->MACMIIARÐ_MACMIIAR_MB); // Ждём окончания процедуры записи
// Технически в данном месте может произойти зависание программы (протестировать timeout)
return;
}
/* Функция uint16_t eth::phy::read_register(uint8_t adr, uint8_t reg)
* Описание: Функция позволяет осуществлять чтение регистров микросхемы PHY
* Параметры: adr - адрем микросхемы PHY
* reg - регистр для чтения
* Возвращает значение требуемого регистра (uint16_t)
*/
uint16_t eth::phy::read_register(uint8_t adr, uint8_t reg)
{
ETH->MACMIIDR = 0; // Задаём данные для передачи
ETH->MACMIIAR &= ETH_MACMIIAR_CR; // Первичная очистка регистра
ETH->MACMIIAR |= (adr<<11)Ð_MACMIIAR_PA; // Задаем адрес микросхемы PHY
ETH->MACMIIAR |= (reg<<6)Ð_MACMIIAR_MR; // Задаем адрес регистра PHY
ETH->MACMIIAR &= ~ETH_MACMIIAR_MW; // Действие - чтение
ETH->MACMIIAR |= ETH_MACMIIAR_MB; // Выполняем процедуру чтения
// Ждём окончания процедуры чтения
while(ETH->MACMIIARÐ_MACMIIAR_MB);
return (uint16_t)ETH->MACMIIDR;
}