OpenEdv-开源电子网

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

STM32F429+LAN8720A初始化通过寄存器读出来全是FFF

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-6-22
在线时间
5 小时
发表于 2019-5-11 17:22:13 | 显示全部楼层 |阅读模式
5金钱
如题,我在做一个用F429做以太网通信的项目,硬件板子是照着原子的板子复刻的。eth_reset脚,用普通io口来控制,先拉低灾拉高进行硬件复位。晶振可以测出来25M信号,14脚可以测出来50M的信号,硬件感觉没什么大问题。
现在的问题是,我用mdk调试程序,在HAL_ETH_INIT函数中,调用HAL_ReadPHYRegister函数时,bsr寄存器的值全部变成0Xfff,网上找到一些解决方案是说phy地址改成1,但是改完之后完仍然读出来还是0X0000FFFF,这个问题卡了我一个礼拜了,网上完全相同的解决方案也不多,发上来想请教大家一下。
具体的代码:
HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg, uint32_t *RegValue)
{
  uint32_t tmpreg1 = 0;     
  uint32_t tickstart = 0;

  /* Check parameters */
  assert_param(IS_ETH_PHY_ADDRESS(heth->Init.PhyAddress));

  /* Check the ETH peripheral state */
  if(heth->State == HAL_ETH_STATE_BUSY_RD)
  {
    return HAL_BUSY;
  }
  /* Set ETH HAL State to BUSY_RD */
  heth->State = HAL_ETH_STATE_BUSY_RD;

  /* Get the ETHERNET MACMIIAR value */
  tmpreg1 = heth->Instance->MACMIIAR;

  /* Keep only the CSR Clock Range CR[2:0] bits value */
  tmpreg1 &= ~ETH_MACMIIAR_CR_MASK;

  /* Prepare the MII address register value */
  tmpreg1 |=(((uint32_t)heth->Init.PhyAddress << 11) & ETH_MACMIIAR_PA); /* Set the PHY device address   */
  tmpreg1 |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR);                   /* Set the PHY register address */
  tmpreg1 &= ~ETH_MACMIIAR_MW;                                           /* Set the read mode            */
  tmpreg1 |= ETH_MACMIIAR_MB;                                            /* Set the MII Busy bit         */

  /* Write the result value into the MII Address register */
  heth->Instance->MACMIIAR = tmpreg1;--------------------------------------------------------------------------------------------------------------------------------这一行出错问题-------------

  /* Get tick */
  tickstart = HAL_GetTick();

  /* Check for the Busy flag */
  while((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB)
  {
    /* Check for the Timeout */
    if((HAL_GetTick() - tickstart ) > PHY_READ_TO)
    {
      heth->State= HAL_ETH_STATE_READY;

      /* Process Unlocked */
      __HAL_UNLOCK(heth);

      return HAL_TIMEOUT;
    }

    tmpreg1 = heth->Instance->MACMIIAR;
  }

  /* Get MACMIIDR value */
  *RegValue = (uint16_t)(heth->Instance->MACMIIDR);

  /* Set ETH HAL State to READY */
  heth->State = HAL_ETH_STATE_READY;

  /* Return function status */
  return HAL_OK;
}


我单步运行的时候,
开发板上运行时,tempreg1=0x00000051,运行完那句赋值以后,bsr寄存器的值变成0x00007809
自制板上运行时,tempreg1=0x00000051,运行完那句赋值以后,bsr寄存器的值变成0x0000FFFF
真的这个问题困了好多天了,望有高人解决一下,万分感谢!!!

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

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-5-11 17:52:51 | 显示全部楼层
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-1-6
在线时间
4 小时
发表于 2021-1-8 16:59:12 来自手机 | 显示全部楼层
楼主,我要遇到你这个问题,你解决了吗?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-5-31
在线时间
1 小时
发表于 2021-3-26 13:53:16 | 显示全部楼层
有手册资料吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-6-19
在线时间
2 小时
发表于 2022-7-24 21:34:14 | 显示全部楼层
我也遇到这个情况。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2024-6-3
在线时间
3 小时
发表于 2024-6-5 17:39:23 | 显示全部楼层
金国庆 发表于 2022-7-24 21:34
我也遇到这个情况。

解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 02:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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