Цитата(scifi @ Dec 22 2014, 17:45)

Это я уже проходил :D
По скольку драйвер ST написан под PHY DP83848C, а у нас KSZ8051RNL, один регистр в нем не подходил - он считывал 0x10 для проверки рзультата autonegotiation, в то время как в KSZ8051RNL 0x10 отсутствует. Считывался ноль. По этому он заседал на Half/10. Правильный регистр 0x1E, да и биты в нем не те. Но это легко подстроилось, если кому надо.
В файле STM32f2x7_eth.c, вместо:
CODE
/* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */
if((RegValue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
{
/* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
}
else
{
/* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */
ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
}
/* Configure the MAC with the speed fixed by the auto-negotiation process */
if(RegValue & PHY_SPEED_STATUS)
{
/* Set Ethernet speed to 10M following the auto-negotiation */
ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
}
else
{
/* Set Ethernet speed to 100M following the auto-negotiation */
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
}
Можно вставить:
CODE
#define HALF_DUPLEX_10_BASE_T 1
#define HALF_DUPLEX_100_BASE_T 2
#define FULL_DUPLEX_10_BASE_T 5
#define FULL_DUPLEX_100_BASE_T 6
if((RegValue & FULL_DUPLEX_100_BASE_T) == FULL_DUPLEX_100_BASE_T)
{
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
}
else if((RegValue & FULL_DUPLEX_10_BASE_T) == FULL_DUPLEX_10_BASE_T)
{
ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
}
else if((RegValue & HALF_DUPLEX_100_BASE_T) == HALF_DUPLEX_100_BASE_T)
{
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
}
else if((RegValue & HALF_DUPLEX_10_BASE_T) == HALF_DUPLEX_10_BASE_T)
{
ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
}
Ну, и сам регистр - в stm32f2x7_eth_conf.h изменить на 0x1E:
Код
#define PHY_SR ((uint16_t)0x1e)
Сообщение отредактировал IgorKossak - Dec 23 2014, 08:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!