1.MII/RMII/SMI接口连接和配置
SMI又称站点管理接口,用于cpu与外置PHY芯片通讯,配置相关参数,包含MDC和MDIO两个管脚(CPU上有对应引脚,当然用普通GPIO口模拟SMI管理也是可行的,不过按照固定时序写入和读取数据)。
MII和RMII则是是两种不同的以太网数据传输接口,因为RMII在使用更少接口的情况下具有MII相同的功效,其中MII如下图连接即可:

特别注意:RMII模式下REF_CLK要连接CPU的MCO引脚,且MCO输出时钟应为50MHz。
这里说下我最近遇到的stm32在MII模式不能正常接收数据,后来发现是STM的MII_ER脚被配置成以太网引脚,而实际悬空(并未连接到PHY),导致stm32认为接收出错,将接收数据丢失。
解决办法: 如果硬件还未完成设计,则MII_ER最好正确连接到PHY指定端口,可以提前过滤mac子层检测到的错误包。
如果硬件设计已经完成,且出错,那么就取消MII_ER引脚的配置即可(带来的后果就是少一层错误过滤,问题不大)
2.PHY初始化
  一般来说,stm32外部驱动PHY芯片有两种连接方式,MII和RMII总线,这个与硬件设计有关,不过stm32芯片一般都支持这两种总线连接方式,因为RMII总线在传输效果不变的情况下占用接口更少,因此一般推荐RMII方式.
  以DP83848芯片为例:
  
  从上面可以看出RMII总线对应的输入时钟要设置为50MHZ, 当然这与你原理图的布线有,连接PHY芯片X1接口对应GPIO接口的外设区域时钟就要设定为该值,
考虑到挂在同区域外设的时钟要求.为了方便设计,对于stm32f207vet6(我用的芯片),将系统时钟从120MHz改为100MHz,该区域外设时钟设置为1/2即可。
对于stm32f107vc则需要通过PLL3将MCO端口时钟拉高到50Mhz输出到phy。目前来说大部分人对于stm32驱动的移植都是直接把官方例程拿过来用,
但我建议还是对照参考手册仔细研读每一项,自己配置ETH参数,因为stm32芯片集成的MAC配置对于数据的接收和发送影响很大。

ETH_DeInit();/* Software reset */ETH_SoftwareReset();/* Wait for software reset */while (ETH_GetSoftwareResetStatus() == SET);/* ETHERNET Configuration---------------------------------------------*//* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ETH_StructInit(&ETH_InitStructure);/* Fill ETH_InitStructure parametrs *//*------------------------ ETH_MACCR-----------------------------------*///参数是否自动配置,选择disable需要自动配置默认参数ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;ETH_InitStructure.ETH_Watchdog = ETH_Watchdog_Disable;                            //关闭看门狗定时器,允许接收超长帧ETH_InitStructure.ETH_Jabber = ETH_Jabber_Disable;                                //关闭jabber定时器,允许发送超长帧ETH_InitStructure.ETH_InterFrameGap = ETH_InterFrameGap_40Bit;                //发送帧间间隙ETH_InitStructure.ETH_Speed = ETH_Speed_100M;                                     //快速以太网速度ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;                    //不启用自循环模式ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;                                 //全双工模式/*自动填充/CRC剥离处理不执行,转发所有帧*/ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
#if CHECKSUM_BY_HARDWAREETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;                //IPV4头文件硬件校验
#endif/*------------------------ ETH_MACFFR----------------------------------*/ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;                                   //MAC过滤只接受通过源目的地址的数据ETH_InitStructure.ETH_SourceAddrFilter = ETH_SourceAddrFilter_Normal_Enable;                 //MAC过滤源地址错误帧?ETH_InitStructure.ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;                    //MAC不转发任何控制帧ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;        //接收广播帧ETH_InitStructure.ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal;              //目的地址过滤结果正常ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;                         //混杂模式,启用帧过滤ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;             //过滤器正常工作,不传送控制帧ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;                 //单播帧目的地址完美过滤/*------------------------   DMA  ETH_DMAOMR -----------------------------------*/  /* When we use the Checksum offload feature, we need to enable the Store and Forward mode: the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, if the checksum is OK the DMA can handle the frame otherwise the frame is dropped *//*丢弃校验错误帧不执行(因为未进行硬件校验)*/ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable;ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Disable;              //接收数据超过阈值转发ETH_InitStructure.ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable;                 //描述符被占用和接收FIFO不可用时清空FIFO(解决堵塞)ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Disable;            //发送数据完整帧转发ETH_InitStructure.ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes;    //发送阈值为64BytesETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;                //接收FIFO丢弃所有错误帧/*接收FIFO上传长度不够的好帧*/   ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Enable;     ETH_InitStructure.ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes;       //接收阈值为64Bytes    ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;                  //DMA直接发送第二个帧,不需要之前帧回复/*------------------------   DMA  ETH_DMABMR -----------------------------------*/      ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;                //传输地址对齐ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;                                  //固定的突发ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;                              ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;             //发送和接收比例 2:1/* Configure Ethernet */ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);/* Enable the Ethernet Rx-Tx Interrupt*/ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R | ETH_DMA_IT_T                    , ENABLE);

特别注意:以太网底层部分我主要遇到的bug有两个

 (1).启动时需要插上网线,否则启动后以太网工作不正常     问题原因:
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable; //开启PHY的自适应

如果开启了自适应(默认代码是Enable,这就是坑的地方),ETH_Init中会有下面一段

do
{timeout++;
} while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));/* Return ERROR in case of timeout */
if(timeout == PHY_READ_TO)
{return ETH_ERROR;
}

也就是说一段时间没有读到link状态,就跳出ETH的配置函数了,这也就导致了stm的eth模块直接没有初始化(phy即使配置失败或者不配置也会根据外部引脚有默认的配置), 然而stm的官方库却直接跳出,不得不说是很严重的bug。

解决办法: 将ETH_AutoNegotiation_Enable改为ETH_AutoNegotiation_Disable, 根据实际情况配置即可。

(2) 网络有丢包和卡顿

这个问题其实是上述问题解决后衍生的问题,因为产品更换过几次phy,用的同一套驱动,结果有的工作正常,有的虽然能工作,但又大数量的丢包。

后来测试发现,更换phy后,不同phy的设置寄存器有差异, 出问题的写入出错,而默认配置与stm32内部不一致,导致丢包。解决问题发现如果不细致维护ETH_Init这个库函数中读写寄存器部分,适配PHY在软件上解决很麻烦,不过在对比了几家phy的说明书后,通过硬件修改配置引脚高低,可以轻松完成stm32与PHY的适配。

解决办法: 完全注释掉ETH_Init中与phy相关的配置,通过外部引脚硬件完成与stm适配,目前测试有dp83848, ip101alf, ip101gr, RTL8201等phy芯片都完美运行。

3.lwip中lwipopt.h文件的修改

参见http://www.cnblogs.com/zc110747/p/4739588.html设置

STM32中ETH驱动配置注意事项dp83848, ip101alf, ip101gr, RTL8201,LAN8720相关推荐

  1. LWIP学习系列(二):STM32中ETH外设的配置与LWIP的结合使用

    目录 一.STM32中ETH外设的配置流程(HAL库) (1)ETH大致初始化与使用流程 (2)访问外部PHY寄存器相关函数 二.LWIP关于ethernet的底层驱动移植 (1)LWIP网卡需要由用 ...

  2. STM32中BOOT模式配置的作用

    学习了一段时间stm32单片机, 一直没有搞明白这个Boot 引脚的作用,经过找资料,才算搞明白boot设置, 所谓的启动, 就是我们在程序下载完成后, 重新启动芯片时, SYSCLK的第四个上升沿, ...

  3. STM32中GPIO_Mode--GPIO配置

    本篇由转载而来,有侵权请联系作者,谢谢. 原博客地址:https://blog.csdn.net/snow416/article/details/6540646 一.GPIO配置 (1)GPIO_Mo ...

  4. 【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置

    已经做了半年的BLDC驱动器了,目前是做到了电流转速双闭环,期间遇到了很多很多问题,一个是资料难找,再加上公司要求使用CUBEMX,本身HAL库的资料也难找,难上加难啊,可能是用CUBEMX做出来的大 ...

  5. 在STM32中:CAN总线驱动

    在STM32中:CAN总线原理与驱动 引脚定义 STM32 CAN总线原理图 CAN总线驱动程序分析 1.CAN总线 头文件程序 2.CAN总线 可执行文件 3.CAN总线 主函数程序 本篇使用的是意 ...

  6. STM32 中 SysTick时钟的配置

    SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值. systck计数频率为每秒72000000次,所以7200000次就是1/1 ...

  7. STM32中GPIO的8种工作模式

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.形象点解释:推挽,就是有推有拉,任何 ...

  8. STM32中GPIO的8种工作模式!

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.         推挽电路是两个参数 ...

  9. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

最新文章

  1. 用JQuery模仿淘宝的图片显示效果
  2. python 手动读取cifar10_Python读入CIFAR-10数据库
  3. java丑数算法_LintCode Java算法练习(4)-----丑数II
  4. Silverlight的4个版本
  5. 用神经网络模拟分子:碱金属的氯化物
  6. java中长方体的类是什么_编写java程序:定义一个描述长方体的类Box,要求如下...
  7. 笔记-信息系统安全管理-安全审计
  8. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  9. 优秀技术人才需具备能力
  10. [css] 举例说明你知道的css技巧有哪些?
  11. fread读取整个文件_qt如何实现大文件的加载和显示
  12. ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
  13. Mac 的 Adobe Creative Cloud 无法连接至服务器的解决办法?
  14. BZOJ 5336: [TJOI2018]party Dp套Dp
  15. HDFS Shell 命令简介及查询
  16. AMD CEO辞职令业内震惊:邓元鋆有点尴尬
  17. 计算机的显示器颜色怎么调,电脑显示器怎样调色差
  18. 使用GSAP的动画库为Bootstrap传送带制作动画
  19. DataStream API【1】
  20. 2.4.2 死锁的处理策略-预防死锁(破坏互斥条件、破坏不可剥夺条件、破坏请求和保持条件、破坏循环等待条件)

热门文章

  1. linux环境编程unp,linux网络编程之怎么配置好unp.h文件
  2. shell cheat sheet (备忘录)
  3. faobao_post
  4. 《前任3》:谢谢和你爱过,也不遗憾错过
  5. AE基础教程第一阶段——20层的简单操作
  6. CEO、COO、CFO、CTO是什么意思?
  7. 鸿蒙系统发红包,混沌鸿蒙录红包版
  8. fzu 2238 Daxia Wzc's problem
  9. 项目管理之从战略层出发完善组织架构管理
  10. 【操作系统】IO管理