我的板子上的PHY芯片型号是KSZ8041NL,寄存器和原子哥用的LAN8720基本一样。
按照论坛里的帖子,对LAN8720的驱动代码做了以下修改:#define LAN8720_ADDR 1 //LAN8720地址为0
int LAN8720_Init(void)
{...
LAN8720_ETHHandle.Init.MediaInterface=HAL_ETH_MII_MODE; //MII接口
...}
//ETH底层驱动,引脚配置,时钟使能
//此函数会被HAL_ETH_Init()调用
//heth:ETH句柄
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
{
//使能以太网时钟
RCC->AHB1ENR|=7<<15; //使能ETH MAC/MAC_Tx/MAC_Rx时钟
//ETH IO接口初始化
RCC->AHB4ENR|=1<<0; //使能PORTA时钟
RCC->AHB4ENR|=1<<1; //使能PORTB时钟
RCC->AHB4ENR|=1<<2; //使能PORTC时钟
RCC->AHB4ENR|=1<<4; //使能PORTE时钟
RCC->AHB4ENR|=1<<6; //使能PORTG时钟
RCC->APB4ENR|=1<<1; //使能SYSCFG时钟
SYSCFG->PMCR|=0<<21; //使用MII PHY接口.
GPIO_Set(GPIOA,0xF<<0|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD); //PA1,2,7复用输出
GPIO_Set(GPIOB,PIN0|PIN10|0x3<<12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD); //PA1,2,7复用输出
GPIO_Set(GPIOB,PIN1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PU); //PA1,2,7复用输出
GPIO_Set(GPIOC,0x1F<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD); //PC1,4,5复用输出
GPIO_Set(GPIOE,PIN2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD); //PB11复用输出
GPIO_Set(GPIOG,PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,GPIO_PUPD_PD); //PG13,14复用输出
GPIO_AF_Set(GPIOA,0,11); //PA1,AF11
GPIO_AF_Set(GPIOA,1,11); //PA1,AF11
GPIO_AF_Set(GPIOA,2,11); //PA2,AF11
GPIO_AF_Set(GPIOA,3,11); //PA3,AF11
GPIO_AF_Set(GPIOA,7,11); //PA7,AF11
GPIO_AF_Set(GPIOB,0,11); //PB11,AF11
GPIO_AF_Set(GPIOB,1,11); //PB11,AF11
GPIO_AF_Set(GPIOB,10,11); //PB11,AF11
GPIO_AF_Set(GPIOB,12,11); //PB11,AF11
GPIO_AF_Set(GPIOB,13,11); //PB11,AF11
GPIO_AF_Set(GPIOC,1,11); //PC1,AF11
GPIO_AF_Set(GPIOC,2,11); //PC1,AF11
GPIO_AF_Set(GPIOC,3,11); //PC1,AF11
GPIO_AF_Set(GPIOC,4,11); //PC4,AF11
GPIO_AF_Set(GPIOC,5,11); //PC5,AF11
GPIO_AF_Set(GPIOE,2,11); //PC5,AF11
GPIO_AF_Set(GPIOG,11,11); //PG13,AF11
MY_NVIC_Init(0,0,ETH_IRQn,2); //配置ETH中的分组
}
但是在 HAL_ETH_Init(&LAN8720_ETHHandle); //初始化ETH 过程中,
SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);
/* Get tick */
tickstart = 0;
/* Wait for software reset */
while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR)){...}
软复位超时。
检查了 ETH_MII_RX_CLK 和 ETH_MII_TX_CLK 的引脚信号如下,25MHz:
还有个问题是向PHY的 BC 寄存器写入非 0x8000 的值之后再去读 BC,就会一直读出来0,此时 BS 寄存器读出来正常。写入 0x8000 软复位之后读 BC 是 0x1000,但是插上网线之后BS一直是 0x3800,每隔 2s 变一次 0x3824,然后秒变 0x3000。
我是哪里的设置还存在问题吗。
|