背景

有一块吃灰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. Linux下autoreconfig命令安装.
  2. Java Collections.sort方法对list集合排序
  3. 应用程序性能分析利器 —— Visual Studio Profiler
  4. Python学习(四)
  5. Python编程基础:第十八节 字典Dictionaries
  6. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转
  7. PHP无刷新上传面向过程写法iframe
  8. 这两种完全不同的JPEG加载方式,你肯定见过!
  9. double类型计算
  10. Mongoose Schemas定义中timestamps选项的妙用
  11. 解决WDCP3环境gbk网站编码程序乱码问题
  12. Memcached 学习---(5)set 命令
  13. nodejs参数的接收(post和get)
  14. 【LeetCode 69】Sqrt(x)
  15. 木纹标识lisp_lisp 习题 用列表元素标识文件一行。
  16. 1011. World Cup Betting (20)——PAT (Advanced Level) Practise
  17. ExtJS笔记 Grids
  18. 开源音乐播放器_测试4个开源音乐播放器等
  19. Windows Defender保护历史记录清空方法
  20. java为什么打不开jar文件_win7系统双击打不开jar文件的解决方法

热门文章

  1. 针对【BIEB六人行活动】第三季的部分问题一
  2. SSH密码暴力破解及防御实战----攻
  3. 微信群「斗图」总输,用Python教你做最靓的仔!!!
  4. 服务器SFTP登录密码过期修改,【linux】账号密码过期导致无法登录
  5. 众美集团打造“十大行业定制”战略 高标准满足客户多元化需求
  6. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-06:不同格式固件的区别:bin/hex/s37/gbl
  7. Android中的颜色值
  8. nginx反向代理去除目录层级转发
  9. 详细述说spring mvc工作原理
  10. 实验吧 writeup