背景

有一块吃灰7年的神州IV号开发板,主控芯片STM32F107VCT6,PHY芯片DM9161A,配套的资料都是当年ST的标准库。这个开发板应该是因为当年上市太匆忙,资料和代码的细节部分做的不太好。

最近想玩玩MQTT,想用这个开发板的网口,顺便通过此过程熟悉下STM32 ETH的用法。配置其实网上教程很多,看着也不难,结果试下来老是ping不通,一开始感觉无从下手。后来追代码,看手册,检查原理图等等,耗费大半周业余时间终于在清明假期的第二天上午ping通了,终于感到点安慰。记录下过程就要出去晒晒太阳了。

欢迎备注原作者转发

1.根据原理图在STM32CubeMx中做配置

我的开发板是用的RMII通讯方式

自动协商开启(协商全双工半双工,10M还是100M),因为没有使用系统,用裸机跑lwip, 所以模式选择polling

Phy地址应该是由硬件引脚决定的,我的是0.

因为配置里没有DM9161A,所以随便选了个LAN8742.其实只用基本功能,这些PHY的基本寄控制和状态存器都是有标准规定死的,都一样。不一样的是后面的一些厂家指定的寄存器,我开始没ping通就是因为这个厂家指定的寄存器。

STM32F107的MCO给RMII模式的PHY提供50MHZ的时钟,记得配好。并且MCO引脚要记得设置为高频输出,默认为low。

LWIP配置我用的固定IP,没用OS,其他默认。

2. 生成代码并编译

我用的MDK,所以选择MDK版本。

在因为选的是polling模式,Main函数循环中添加MX_LWIP_Process()函数,在此处处理收发包

编译完成下载,网口绿灯亮,黄灯伴随ping闪烁,但是不通,无法访问主机。

3.调试

使用debug调试代码+wareshark发现开发板收到了电脑发的ping命令,并且内容正确,也做了回复,但电脑侧还是无法访问主机。既然灯亮并且能收到ping包且做了回复,说明起码PHY运行起来了,但是可能配置有问题。

于是看了DM9161A的芯片手册,F107的ETH相关的手册(太多了,头都大了),囫囵吞枣,有了个大概印象。然后开始一步一步的追ETH的初始化代码。开发板自带了ETH的驱动程序,不过是7年前的标准库,而且代码写的也很随意,但起码板子是能跑的,于是我就对照该代码看CUBE生成的代码。

终于。。。我发现了问题

初始化过程中先设置PHY为自动协商模式,确定该模式已经生效后会读取PHY的状态寄存器,根据协商结果去初始化MAC的参数。而这个寄存器因为一开始我不知道其意义,是配错了的。

一开始因为Cube里那个PHY speed duplex mask的名字困扰了我,我也不知道这个寄存器有啥用,就在DM9161A的芯片手册里搜了这个名字,得到如下图结果,然后就把这个寄存器的偏移21还有对应位给填到cube配置参数中了。结果当然是有问题的。因为初始化代码要读取PHY的协商结果来设置MAC,而这个寄存器配错了,读取的结果肯定也不对,导致MAC配置的全双工半双工以及10M和100M就错了,那当然不能正常通信了。

在明白了驱动代码的含义后,再次翻看DM9161A的数据手册,终于找到了正确的寄存器。下图是改对后的

这里其实有个问题,cube默认双工半双工用1bit表示,10M100M用另一bit表示,总共两位。生成的代码里也是按照判断这两位来初始化。而DM9161A实际上用了4个bit

这就导致了cube生成的代码这个地方的判断是不能继续使用的,需要修改。此处的修改是和你选择如何判断模式有关的,不是唯一的,我的修改如下,

修改前

修改后

4.测试结果

修改了以上部分后,重新编译下载程序,再次ping,终于通了,激动啊!!!!

同时也庆幸,万一问题不在这,我还得继续研究MAC其他参数关于DMA的那部分的驱动代码,而那部分太复杂了,都不知道能不能坚持下去。

5. 写在最后

一开始用的是最新的STM32CubeIDE(基于cubeMXV5.5),集成了eclipse环境,可视化很好,追踪代码也很方便,然而调试很困难,老有问题断开。而且在我配置了固定IP后生成的代码中是没有IP的,此处估计是bug.

然后退回了很久前使用过的一个老版本cubeMx5.01+MDK,终于成功了。

用Stm32CubeMX在STM32F107上移植LWIP(PHY:DM9161A)相关推荐

  1. STM32F407利用RT-thread上移植LWIP

    目录 1:环境 2:配置ETH 3:配置ENV 4:连接测试 5. 建立tcp的客户端,与PC测试 参考:网络协议栈驱动移植 1:环境 芯片:STM32F407 开发板:正点原子探索版 PHY:LAN ...

  2. 基于STM32F107裸机移植LWIP(STM32CUBE配置)

    MCU:STM32F107 PHY:KSZ8081 LWIP_VERSION:2.0.3 1.配置RCC,串口,定时器 1.1 开启RCC,使用内部8M晶振,配置系统时钟 1.2 打开调试串口1,打开 ...

  3. ENC28J60+STM32F103在STM32CubeIDE上移植lwIP2.1.2

    ENC28J60+STM32F103在STM32CubeIDE上移植lwIP2.1.2   为了学习lwIP,网购了一块正点原子的Mini STM32开发板和一个ENC28J60以太网模块,发现正点原 ...

  4. 【程序】STM32H743ZI单片机驱动DP83848以太网PHY芯片,移植lwip 2.1.3协议栈,并加入网线热插拔检测的功能

    STM32H7的ETH HAL库封装得比较好,真正做到了完全用HAL API函数操作,不需要再用寄存器操作. 而STM32F1的ETH HAL库就没有完全封装,有些操作必须要用寄存器完成,而且还需要单 ...

  5. 【MCU】STM32F107VC单片机驱动DP83848以太网PHY芯片,移植LWIP 2.1.2协议栈,并加入网线热插拔检测的功能(HAL库)

    开发板: 杜邦线传输高速数字信号容易出错,所以在用面包板搭建开发环境时,最好使用25MHz时钟的MII接口.如果要用50MHz的RMII接口,那么杜邦线必须要非常非常短,否则时钟信号一旦失真,就无法收 ...

  6. ARM硬件平台上基于UCOS移植Lwip网络协议栈

    目录 1.硬件平台 1.1硬件平台简介 为保证网络协议栈的顺利移植,选用了LPC2220作为主控芯片,RTL8019AS作为网卡芯片,使用HR901170A进行电平转换.滤波. LPC2220是Phi ...

  7. 一文搞定stm32移植LWIP及代码逻辑

    文章目录 一,使用以太网的库 二,ST以太网驱动库的移植 1,stm32f4x7_eth.c 2,lan8720.c 三,移植LWIP协议栈 1,lwip_comm.c 2,ethernetif.c ...

  8. 使用标准库对STM32F407ZGT6移植LWIP(逻机-全网最全)

    使用STM32CubeM对F407ZGT6移植LWIP(全网最全) 使用标准库对STM32F407ZGT6移植LWIP(逻机-全网最全) 基于STM32单片机的LwIP协议(一)网络协议简介 基于ST ...

  9. 【应用笔记】AN1088_APM32F4xx系列ETH移植LWIP

    1    引言 本应用笔记提供如何在APM32F4xx系列的EVAL Board上配置和应用ETH外设的指南,包括lwip协议栈的移植.代码实现和应用方法. APM32F4xx微控制器提供了可配置.灵 ...

最新文章

  1. c 判断文件是否存在_C语言编程之怎样判断某一文件是否存在
  2. 但这是不可能的,或者无法发现JIT破坏了您的代码。
  3. java- WatchService监控
  4. java guava限流,Guava的RateLimiter实现接口限流
  5. 企业级网络建站工作室源码
  6. fir1截止频率计算_数字信号处理 实验五:FIR数字滤波器设计与软件实现
  7. 女明星因自拍瞳孔倒影暴露住址惨遭跟踪,一张照片是怎么出卖你?
  8. Quest2有线串联steamVR
  9. df.to_csv输出结果隔行多一个空行的解决办法
  10. go语言编程前景怎么样?国内Go语言布道师许式伟这样说
  11. 银河麒麟V10(Kylin Linux Advanced Server V10 (Tercel))安装Python3.8、MySQL5.7、Redis
  12. 小米笔记本电脑我的计算机图标不见了怎么办,毕业论文致谢结尾800字范文_本科毕业论文致谢结尾通用...
  13. 两平面平行但不重合的条件是_____黑龙江省大庆外国语学校高中数学_第二章《2.2_直线、平面平行的判定及其性质》单元测试5_新人教A版必修3...
  14. PT2262/2272遥控编解码集成电路
  15. 研究生看文献时如何写读书笔记?
  16. R语言实现 朴素贝叶斯分类
  17. EasyUI(修改删除)
  18. 厅、部、局、司区分大小
  19. 【笔记】三张图读懂机器学习:基本概念、五大流派与九种常见算法
  20. SIEMENS SIMATIC STEP 7 v5.7 Professional 2021

热门文章

  1. (ICCV-2017)可变形卷积网络
  2. 乐忧商城项目总结-2
  3. 服务器上行宽带和下行宽带如何区分?
  4. matlab光波耦合光栅,均匀布拉格光栅的原理及MATLAB反射谱仿真
  5. 数字图像处理的神秘女性——莱娜(Lena) 文末有彩蛋
  6. 概率题 宝剑升级需要多少宝石
  7. SAP MM ME27 创建公司内STO单
  8. 医疗大数据知识库的主要功能和作用
  9. EF Core 中实现 动态数据过滤器
  10. ui动效 unity_Unity - UIWidgets 6. 显示列表