TCP/IP协议学习(三) STM32中ETH驱动配置注意事项

时间:2022-09-21 17:41:42
1.MII/RMII/SMI接口连接和配置
SMI
又称站点管理接口,用于cpu与外置PHY芯片通讯,配置相关参数,包含MDC和MDIO两个管脚(CPU上有对应引脚,当然用普通GPIO口模拟SMI管理也是可行的,不过按照固定时序写入和读取数据)。‘
  MII和RMII则是是两种不同的以太网数据传输接口,因为RMII在使用更少接口的情况下具有MII相同的功效,其中MII如下图连接即可:
 TCP/IP协议学习(三) STM32中ETH驱动配置注意事项
特别注意: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芯片为例:
  TCP/IP协议学习(三) STM32中ETH驱动配置注意事项
从上面可以看出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_HARDWARE
 ETH_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; //发送阈值为64Bytes
ETH_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设置

TCP/IP协议学习(三) STM32中ETH驱动配置注意事项的更多相关文章

  1. TCP&sol;IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  2. TCP&sol;IP协议学习&lpar;五&rpar; 基于C&num; Socket的C&sol;S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  3. TCP&sol;IP协议学习笔记

    计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...

  4. TCP&sol;IP协议学习&lpar;四&rpar; 基于C&num; Socket的Web服务器---静态资源处理

    目录 1. C# Socket通讯 2. HTTP 解析引擎 3. 资源读取和返回 4. 服务器测试和代码下载 Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回 ...

  5. TCP&sol;IP协议学习&lpar;四&rpar; 协议概述

    生活中有舒适区,借口成为懒惰的护身符,学习也有舒适区,逃避便是阻止进步的最大障碍. 经过半年多嵌入式方面的工作和学习,我提高了很多,但同时我也对自己所面临的问题逐渐清晰: 1. 偏于实践,理论基础不牢 ...

  6. TCP&sol;IP协议学习和理解

    TCP:Transmission Control Protocol-传输控制协议 IP:Internet Protocol-网络协议 TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP ...

  7. OSI模型和TCP&sol;IP协议族&lpar;三&rpar;

    TCP/IP协议族 TCP/IP协议族的开发要比OSI模型更早,因此TCP/IP协议族的分层结构无法准确地与OSI模型一一对应.原始的TCP/IP协议族定义为建立再硬件基础上的四个软件层,不通过目前T ...

  8. TCP&sol;IP协议的三次握手及实现原理

    TCP/IP是很多的不同的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol.可靠的主机到主机层协议.这里要先强调一下 ...

  9. TCP&sol;IP协议、三次握手、四次挥手

    1.什么是TCP/IP协议 TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议 1) 网络接口层: 主要是指物理层次的一些接口,比如电缆等. ...

随机推荐

  1. BestCoder&num;51

    #include <cstdio> #include <iostream> #include <cmath> #include <cstring> us ...

  2. Shell(C&plus;&plus;实现,CodeBlocks&plus;GCC编译)

    程序效果: 只实现了login .cd .ls .cat 四个命令.而且只能在 Windows 下运行. 代码: //main.cpp 1 #include <iostream> #inc ...

  3. LeetCode122&colon;Best Time to Buy and Sell Stock II

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  4. yii2&period;0安装创建应用shiyong 归档文件安装

    环境是wamp在本机开发 http://www.yiiframework.com/download/ Install from an Archive File Download one of the ...

  5. Perl数据库DBI接口简介【转载】

    本文转载自:http://blog.csdn.net/like_zhz/article/details/5441946 ######################################## ...

  6. 在现有代码中通过async&sol;await实现并行

    在现有代码中通过async/await实现并行 一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色 ...

  7. ASP&period;NET发送电子邮件源码示例

    using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Mail; try { ...

  8. 制作 alipay-sdk-java包到本地仓库

    一.首先 搭建好maven 基础环境,本地可以运行maven 命令 从支付宝官网上下载sdk https://doc.open.alipay.com/doc2/detail?treeId=54&amp ...

  9. (转载)Ubuntu 安装GNU Scientific library(GSL)

    背景: Blei的hlda的C语言实现需要使用C语言的科学计算包GSL,因此决定安装.由于在windows下安装极其繁琐,先在Linux上安装之. 系统环境: Linux version 2.6.35 ...

  10. OOP⑺

    1.多态和instanceof 都是去买东西,但是根据我们给别人金额的不同,得到不同的结果!!!! 生活中的多态! 操作是否一致? 一致! 都是买东西! 什么不一样?? 01.消费金额不一样 02.因 ...