OpenEdv-开源电子网

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

STM32f107 + LAN8720A 一直调试不通过,不知道什么原因

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
发表于 2016-1-18 16:09:13 | 显示全部楼层 |阅读模式
1金钱
硬件跟原子哥的F407开发板是一样的,把代码移植过来之后,一直不能进入ETH_IRQHandler中断,导致一直ping不通,真不知道什么原因了,还请各位大神给指点一下!!!



void ETHERNET_NVICConfiguration1(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

  /* 2 bit for pre-emption priority, 2 bits for subpriority */
//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

       
        NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X00;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


u8 LAN8720_Init(void)
{
        u8 rval=0;
//        GPIO_InitTypeDef GPIO_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
                           RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);//ê1ÄüGPIOê±Öó RMII½ó¿ú       
                                       
        GPIO_Configuration();
        GPIO_PinRemapConfig(GPIO_Remap_ETH,ENABLE);       
        GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);               
////////////////////////////////////////////////////////////////////
//        /*            config MCO output 25MHz clock                         */
//  /* Set PLL3 clock output to 50MHz (25MHz /5 *10 =50MHz) */
//  RCC_PLL3Config(RCC_PLL3Mul_10);
//  /* Enable PLL3 */
//  RCC_PLL3Cmd(ENABLE);
//  /* Wait till PLL3 is ready */
//  while (RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET)
//  {}

//  /* Get PLL3 clock on PA8 pin (MCO) */
//  RCC_MCOConfig(RCC_MCO_PLL3CLK_Div2);
////////////////////////////////////////////////////               
               
        LAN8720_RST=0;                                       
        delay_ms(50);       
        LAN8720_RST=1;                                        
        ETHERNET_NVICConfiguration1();       
        rval = ETH_MACDMA_Config();               
        return !rval;                                       
}

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* ETHERNET pins configuration */

  /* Configure PA2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PC2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure PB5, PB8, PB11, PB12 and PB13 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PA0, PA1 and PA3 as input */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_7 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* Configure PD8, PD9, PD10, PD11 and PD12 as input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//| GPIO_Pin_10 ;//| GPIO_Pin_11 | GPIO_Pin_12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOC, &GPIO_InitStructure); /**/   

  /* ETH_RESET config --------------------------------------------------------*/
  /* Configure Pc.06  as analog output -------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* MCO pin configuration------------------------------------------------- */
  /* Configure MCO (PA8) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}



u8 ETH_MACDMA_Config(void)
{
        u8 rval;
        ETH_InitTypeDef ETH_InitStructure;
       
        //ê1ÄüòÔì«íøMACòÔ¼°MAC½óêÕoí·¢Ëíê±Öó
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

        ETH_DeInit();                                                                  //AHB×üÏßÖØÆôòÔì«íø
        ETH_SoftwareReset();                                                  //èí¼tÖØÆôíøÂç
        while (ETH_GetSoftwareResetStatus() == SET);//μè′yèí¼tÖØÆôíøÂçíê3é
        ETH_StructInit(&ETH_InitStructure);                  //3õê¼»ˉíøÂçÎaĬèÏÖμ  

        ///íøÂçMAC2ÎêyéèÖÃ
        ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;                           //¿aÆôíøÂç×Ôêêó|1|Äü
        ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;                                        //1رշ′à¡
        ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;                 //1رÕÖØ′«1|Äü
        ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;         //1رÕ×Ô¶ˉè¥3yPDA/CRC1|Äü
        ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;//ETH_ReceiveAll_Disable;                                                //1رսóêÕËùóDμÄÖ¡
        ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;//ÔêDí½óêÕËùóD1ã2¥Ö¡
        ///////////////////////////////////////////////////
//        ETH_InitStructure.ETH_Speed = ETH_Speed_100M;
        ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
       
        ///////////////////////////////////////////////////
        ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;                        //1رջìoÏÄ£ê½μÄμØÖ·1yÂË  
        ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;//¶Ôóú×é2¥μØÖ·ê1óÃíêÃàμØÖ·1yÂË   
        ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;        //¶Ôμ¥2¥μØÖ·ê1óÃíêÃàμØÖ·1yÂË
#ifdef CHECKSUM_BY_HARDWARE
        ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;                         //¿aÆôipv4oíTCP/UDP/ICMPμÄÖ¡D£ÑéoíD¶ÔØ   
#endif
        //μ±ÎòÃÇê1óÃÖ¡D£ÑéoíD¶ÔØ1|ÄüμÄê±oò£¬ò»¶¨òaê1Äü′æ′¢×a·¢Ä£ê½,′æ′¢×a·¢Ä£ê½ÖDòa±£Ö¤Õû¸öÖ¡′æ′¢ÔúFIFOÖD,
        //ÕaÑùMACÄü2åèë/궱e3öÖ¡D£ÑéÖμ,μ±ÕæD£ÑéÕyè·μÄê±oòDMA¾í¿éòÔ′|àíÖ¡,·ñÔò¾í¶aÆúμô¸ÃÖ¡
        ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable; //¿aÆô¶aÆúTCP/IP′íÎóÖ¡
        ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;     //¿aÆô½óêÕêy¾YμÄ′æ′¢×a·¢Ä£ê½   
        ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;   //¿aÆô·¢Ëíêy¾YμÄ′æ′¢×a·¢Ä£ê½  

        ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;             //½ûÖ1×a·¢′íÎóÖ¡  
        ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;        //2»×a·¢1yD¡μÄoÃÖ¡
        ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;                  //′ò¿a′|àíμú¶tÖ¡1|Äü
        ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;          //¿aÆôDMA′«êäμÄμØÖ·¶ÔÆë1|Äü
        ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;                                    //¿aÆô1ì¶¨í»·¢1|Äü   
        ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;                     //DMA·¢ËíμÄ×î′óí»·¢3¤¶èÎa32¸ö½úÅÄ   
        ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;                        //DMA½óêÕμÄ×î′óí»·¢3¤¶èÎa32¸ö½úÅÄ
        ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
       
       
        rval= ETH_Init(&ETH_InitStructure,LAN8720_PHY_ADDRESS);                //ÅäÖÃETH
        if(rval==ETH_SUCCESS)//ÅäÖÃ3é1|
        {
                ETH_DMAITConfig(ETH_DMA_IT_NIS|ETH_DMA_IT_R,ENABLE);          //ê1ÄüòÔì«íø½óêÕÖD¶Ï       
        }
        return rval;
}



原理图

原理图

最佳答案

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

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2016-1-18 16:09:14 | 显示全部楼层
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-8-27
在线时间
0 小时
发表于 2016-2-1 13:56:03 | 显示全部楼层
怎么搞定的?什么的问题?
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2016-2-14 10:13:52 | 显示全部楼层
elunlang2000 发表于 2016-2-1 13:56
怎么搞定的?什么的问题?

跟8720连接的IO口不需要设置重定义功能,直接使用复用功能就可以了!
回复

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-2-23 21:05:00 | 显示全部楼层
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

我的问题是初始化都能过,也是ping不通,用usamrt读寄存器回来的都是ffff
ETH_ReadPHYRegister(0X0,0X0)=0XFFFF;
ETH_ReadPHYRegister(0X0,0X1F)=0XFFFF;

怎么回事啊?
逆水行舟不进则退
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-9-4
在线时间
25 小时
发表于 2016-3-31 20:53:51 | 显示全部楼层
nightmare555 发表于 2016-2-14 10:13
跟8720连接的IO口不需要设置重定义功能,直接使用复用功能就可以了!

lz,不设置定义功能是什么意思呀,我的和你的一样,什么都好着就是进不了中断。
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2016-4-11 14:18:55 | 显示全部楼层
yoyotansa 发表于 2016-3-31 20:53
lz,不设置定义功能是什么意思呀,我的和你的一样,什么都好着就是进不了中断。

我用的是107rc,所以不用GPIO_PinRemapConfig(GPIO_Remap_ETH,ENABLE);  
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-3-9
在线时间
2 小时
发表于 2016-4-22 20:07:44 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

原子的程序中PHY芯片地址设置为0,而网上买的LAN8720模块的地址设置为1的,只要把程序中的地址改为1就行,同样的USAMRT中也要改为ETH_ReadPHYRegister(0X01,0x0),才可读回寄存器(LAN8720)的值。
回复

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-4-25 23:54:16 | 显示全部楼层
FCB10MESSI10 发表于 2016-4-22 20:07
原子的程序中PHY芯片地址设置为0,而网上买的LAN8720模块的地址设置为1的,只要把程序中的地址改为1就行 ...

谢了,我试试看。

逆水行舟不进则退
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2016-7-14 10:15:29 | 显示全部楼层
这是我调通的代码,仅供参考,里面有一些自己的代码,你们可以自己删掉然后测试。

stm32f107rc_lan8720.rar

10.96 MB, 下载次数: 10877

如题,这是调通通过的代码,仅供参考,谢谢!

回复

使用道具 举报

1

主题

10

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-3-3
在线时间
0 小时
发表于 2017-3-3 15:08:52 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

你的问题解决了吗   我现在也遇到这个问题  怀疑是硬件的问题  但是无从下手
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-3-3
在线时间
0 小时
发表于 2017-3-3 15:09:12 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

你的问题解决了吗   我现在也遇到这个问题  怀疑是硬件的问题  但是无从下手
回复

使用道具 举报

mycherrys9 该用户已被删除
发表于 2017-3-21 10:12:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-9-8
在线时间
10 小时
发表于 2017-5-18 16:41:14 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

请问 你的这个读寄存器都是0xffff的问题解决了吗
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2017-6-8 14:19:26 | 显示全部楼层
mycherrys9 发表于 2017-3-21 10:12
楼主,我也用了lan8720,这个芯片该怎么初始化啊。具体需要用到哪些工具?哎,两周了一点头绪都没有,我们 ...

初始化过程其实都一样的,你根据代码移植过去就行了。
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2017-6-8 14:21:45 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

硬件复位,我连接到IO口的,同时也跟单片机复位引脚相连,2选1,都是可以的。你的PHY芯片地址设置的对不对?
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2017-6-8 14:23:19 | 显示全部楼层
gelin_ss 发表于 2016-2-23 21:05
楼主,你用了硬复位了吗?
我买的LAN8729模块,没引出这条线啊?

PHY地址是有个接口连接高低电平设置的。
回复

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3059
金钱
3059
注册时间
2015-12-20
在线时间
299 小时
发表于 2018-1-26 14:06:24 | 显示全部楼层
FCB10MESSI10 发表于 2016-4-22 20:07
**** 作者被禁止或删除 内容自动屏蔽 ****

我想知道PHY芯片的地址,是通过什么来确定的?
回复

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3059
金钱
3059
注册时间
2015-12-20
在线时间
299 小时
发表于 2018-1-26 14:07:02 | 显示全部楼层
nightmare555 发表于 2017-6-8 14:23
PHY地址是有个接口连接高低电平设置的。

我想知道PHY芯片的地址,是通过什么来确定的?
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-1-15
在线时间
21 小时
 楼主| 发表于 2018-4-4 17:40:15 | 显示全部楼层
董董 发表于 2018-1-26 14:07
我想知道PHY芯片的地址,是通过什么来确定的?

这个你要看看PHY芯片的datasheet中引脚的定义。
回复

使用道具 举报

1

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2018-3-18
在线时间
38 小时
发表于 2019-8-7 13:07:15 | 显示全部楼层
帮顶,谢谢分享
回复

使用道具 举报

5

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2021-9-10
在线时间
57 小时
发表于 2022-4-13 16:03:40 | 显示全部楼层
很有用 谢了老哥!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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