OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5212|回复: 1

H743ZIT6 的 MACDMA软复位超时

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2023-4-1
在线时间
7 小时
发表于 2023-4-14 11:25:08 | 显示全部楼层 |阅读模式
10金钱
我的板子上的PHY芯片型号是KSZ8041NL,寄存器和原子哥用的LAN8720基本一样。
Snipaste_2023-04-14_11-09-58.png Snipaste_2023-04-14_11-09-49.png Snipaste_2023-04-14_11-09-28.png
按照论坛里的帖子,对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:
微信图片_20230414111901.jpg
还有个问题是向PHY的 BC 寄存器写入非 0x8000 的值之后再去读 BC,就会一直读出来0,此时 BS 寄存器读出来正常。写入 0x8000 软复位之后读 BC 是 0x1000,但是插上网线之后BS一直是 0x3800,每隔 2s 变一次 0x3824,然后秒变 0x3000。
我是哪里的设置还存在问题吗。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2023-4-1
在线时间
7 小时
 楼主| 发表于 2023-4-14 20:53:28 | 显示全部楼层
2023.4.14 20.50更新,在DMA软复位之前,先向 SYSCFG 的 PMCR 寄存器里写入RMII模式, SYSCFG->PMCR|=4<<21,在软复位之后再清0。软复位就能成功。
但是我的PHY芯片依旧不能和网线link up
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表