ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
884402 Топик полностью
evgeniy1294 (23.11.2018 19:25 - 19:30, просмотров: 200) ответил Apтём на Проблемы с запуском Ethernet на STM32H7. Проблемы две:
Запусти автонастройку что-ли (для 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; }