计划一个月写一篇技术博客的,七月份又忘了,最近忙着调试新的硬件平台和移植新的功能,今天把七月份内容补上。
主要内容:S32K148+LAN8720+lwip移植+modbus调试
本次调试难点:
1)基于S32K148芯片调试lwip内容网上资料特别少,大部分底层知识需要自己查资料,看datasheet,查官方论坛;
2)S32K148+LAN8720这种组合更少,网上资料90%内容都是STM32+LAN8720,但是这部分内容需要参考学习,对于新平台有很大的帮助;
3)需要了解lwip硬件实施架构,phy电路,lwip协议栈知识以及软件移植;
4)modbus-tcpip协议基础知识
其中第3点和第4点,我觉得可以找到很详细的资料学习,第1点和第2点更多涉及硬件电路,需要较强的能力和经验,也是本次调试耗时最长的部分。
接下来我从硬件电路和软件移植两个大方面总结记录整个过程。
1 S32K148硬件电路
这部分主要定义好ENET的引脚资源,主要包括RMII接口或MII接口、SMI接口,这里需要注意一个引脚RMII_REF_CLK,这个引脚我找了好久在datasheet上一个角落发现,它把RMII_TX_CLK复用为RMII_REF_CLK
其实这部分电路也涉及到PHY电路,因为tcpip通信有一个重要信号就是时钟信号,这个时钟信号和RMII/MII接口,100M/10M网速有关,也和PHY芯片有关。本次时钟信号采用的PHY信号输出到S32K148,并把它作为RMII_REF_CLK。
2 LAN8720电路
2.1 RMII接口;
根据引脚引脚定义分别连接S32K148和LAN8720
2.2 电源部分主要包含3.3V和1.2V
3.3V电源都是常规电路,主电源LDO输出一个3.3V给LAN8720,
1.2V电源非常重要,涉及到你是采用外部1.2V,还是内部1.2V,绝大多数设计都是采取8720本身自带的1内部1.2V稳压。这里面就涉及到如果采用内部1.2V,8720的LED1引脚需要下拉接地,注意VDDCR可以直接悬空
2.3 时钟信号+晶振电路
RMII接口输出100M数据信号需要一个50M的时钟信号,8720本身可以通过25M晶振倍频到50M,然后在输出给S32K148,这部分可参考别的资料。
2.4 LED电路
LED1引脚下拉接地或上拉接电源,涉及1.2V电源使用选择,我们直接拉地
LED2引脚下拉接地或上拉接电源,涉及CLK_IN_mode和CLK_OUT_mode,我们直接拉地
2.5 SMI接口
MDC和MDIO按照引脚连接
2.6 RJ45接口
根据项目需求,选好RJ45插座
2.7 硬件复位
复位引脚连到S32K148的一个gpio
2.8 PHY地址
3 软件准备
3.1 开发环境
S32DS for ARM
3.2 基础配置
3.2.1引脚
3.2.2时钟
3.2 lwip移植
S32K148使用S32DS for ARM开发环境可以直接配置外设,其中包括配置ENET和TCPIP中间件,
3.2.1 ENET配置跟着官方教程即可
3.2.2 tcpip配置
本次调试使用裸机配置,删除FreeRTOS组件即可切换成裸机配置,后续Datalink、IP Network、Transport都可参考官方例程,IP层有一个ICMP协议需要打勾,后续调试ping的原理就是根据ICMP协议自动收发的
app中你可以选择UDP_ECHO(UDP回环),或者TCP_ECHO
3.3初始化
初次调试,可直接参考官方test.c文件,学习里面初始化过程,调用哪些函数(需要具备lwip基础知识才能看懂),后续再根据自己实际项目,重新做一个初始化函数
重点函数netif_add();enet_ethernetif_init();enetif_low_level_init();
SMI介质接口管理主要就是读取PHY寄存器和写入PHY寄存器,这部分很简单
3.4 调用函数
本次可以直接调用官方例程函数,先调试通,后续博客章节我在慢慢梳理这部分内容,包括初始化函数、tcpip服务器模式、tcpip客户端模式
3.5 lwip测试
根据你的IP地址,ping 192.168.100
4 modbus协议
其实熟悉modbus-rtu协议之后,调试modbus-tcpip会非常简单,之前博客我写过modbus-rtu的移植过程,但是此次modbus-tcpip我会换一种思路
我用modbus-poll做的测试,右下角就是IP地址和modbus-tcpip的端口