【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)

news2024/12/26 9:53:30

前言

        前文介绍了 NXP S32K3 以太网 RMII 接口调试的开发环境搭建,下面开始详解软件调试步骤。没看过第一节的小伙伴请移步《【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(1)》,话不多说我们直接进入正题。


lwip Stack 介绍

       TCP/IP Stack 是 TCP/IP 协议套件的轻量级实现,而实现 lwIP TCP/IP 的重点是减少代码量的同时仍然拥有一个完整的 TCP,lwIP 适用于具有 10Kbytes+ RAM 和 40Kbytes ROM 空间的嵌入式系统。TCP/IP Stack 的代码是开源的,可以参考以下链接:

lwIP - A Lightweight TCP/IP stack

  • 支持的协议:
  • IP(Internet Protocol)
  • ICMP(Internet Control Message Protocol)
  • IGMP(Internet Group Management Protocol)
  • UDP(User Datagram Protocol)
  • TCP(Transmission Control Protocol)
  • DHCP(Dynamic Host Configuration Protocol)
  • ARP(Address Resolution Protocol)
  • 支持的三类 APIs:
    • Raw API: Front/Back-ground structure, best performance, minimal code size.
    • Netconn API: Multi-threaded operations with OS, Increased usability, lower performance, higher memory footprint.
    • BSD Socket API: developed on top of the NetconnAPI, offers more portability.
  • 支持 SSL/TLS (WolfSSL):
    • 轻量级,可移植,基于 C 语言的 SSL/TLS 库
    • 依赖 lwip 堆栈和 FreeRTOS 运行,通过 RTD/HSE 进行加密操作,硬件加速
    • WolfSSL 和 wolfCrypt 可以根据 GPLv2 或标准商业许可使用:wolfSSL – Embedded SSL/TLS Library


图 1  TCP/IP 软件架构


程序修改

1.  重定向 printf,添加串口打印功能(此步骤可以忽略)

       GCC 中没有 Micro,只能使用 newlib 标准库,printf 定义在 <stdio.h> 头文件中:“int printf(const char *_restrct, …”,根据 __restrict 字符串给出的格式打印输出到 stdout(标准输出)中,它调用更底层的函数“int _write(int iFileHandle, char *pcBuffer, int iLength)”来打印。

       新建 <retarget.c>文件,重新定义“_write”函数,并链接到 S32K3 的库函数“Lpuart_Uart_Ip_SyncSend”(见下图),实现 printf 串口打印,现在我们可以将初始化以太网模块的数据直观的打印出来。


图 2  printf 重定向
 


图 3  新建 printf 源文件



2.  以太网 PHY 初始化(JL3101)

       例程中已经有 DP83848/TLK110/TJA1100 等型号以太网模块的初始化配置,初始化操作在 “main() -> device_init() -> Eth_T_InitPhys()”函数中。而本章我们使用国产的景略 JL3101百兆以太网模块实现 S32K3 MAC 与 PHY 之间的 RMII 通信。通过 SMI 总线配置寄存器初始化 JL3101,重新改写 Eth_T_InitPhys() 函数,并通过串口打印实时信息。
 


图 4 读写 JL3101的数据

需要注意的是,JL3101 是通过 Clause45 帧结构方式访问 PHY 的,在 S32K3 SDK 中有可直接调用的函数:

  • 读寄存器:Gmac_Ip_MDIOReadMMD();
  • 写寄存器:Gmac_Ip_MDIOWriteMMD();


初始化 PHY 具体步骤如下:

  • PHY 复位管脚拉低 4ms 以上解除复位,复位管脚拉高 15ms 后开始查找 ID
  • 查找 JL3101 PHY ID:
    • ID0 = 0x937C
    • ID1 = 0x4010
  • 关闭 TC10 车载以太网休眠和唤醒功能
  • 配置 MDI 接口速率为:100Mbs
    • 此时信号转接器档位应调成 100M
  • 配置 MDI 主从模式为:Master Mode
    • 此时信号转接器档位应调成 Slave Mode
  • 配置 MAC 工作模式,我们选择 RMII to copper
  • 软复位:写入命令后,循环读取寄存器直到复位完成
  • 复位后等待 MAC 与 PHY 建立链接:
    • 当读到寄存器“PMA/PMD Status_1[2] = 1”代表链接成功


按照以上步骤编写代码:

static void Eth_T_InitPhys(void)

{

    uint16 phy_reg_val0, phy_reg_val1;

    uint16 phy_addr;

 

    Siul2_Dio_Ip_ClearPins(PTE_H_HALF, (1<<5));

    TestDelay(480000);

    Siul2_Dio_Ip_SetPins(PTE_H_HALF, (1<<5));

    TestDelay(4800000);

 

    Gmac_Ip_EnableMDIO(CFG_PHY_CTRL_IDX, FALSE, 80000000U);

 

    printf("This is a JL3101 Ethernet module demo for S32K3.\n");

 

    /* Search for the PHY address */

    for (phy_addr = 0U; phy_addr < 8U; ++phy_addr)

    {

       Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 2U, &phy_reg_val0, 1U);

       Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 3U, &phy_reg_val1, 1U);

 

        /* check for PHY ID */

        if ((phy_reg_val0 == JL3101_PHY_ID0) && (phy_reg_val1 == JL3101_PHY_ID1))

        {

            break; /* found the PHY ID*/

        }

    }

    printf("Search for the PHY address:\n");

    printf("  Phy_Addr = 0x%X   JL3101_PHY_ID0 = 0x%04X   JL3101_PHY_ID1 = 0x%04X.\n", phy_addr, phy_reg_val0 ,phy_reg_val1);

 

    /* TC10 Disable */

    Gmac_Ip_MDIOWriteMMD(CFG_PHY_CTRL_IDX, phy_addr, 3U, 0x8707U, 0x0000U, 1U);

    while (Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 3U, 0x8707U, &phy_reg_val0, 1U) & 0x8000U)

    { /* Busy Wait */

    }

    printf("TC10 Disable:\n");

    printf("  devad = 0x3   reg = 0x8707  reg_value = 0x%04X\n", phy_reg_val0);

 

    /* Speed_Select Lsb = 1 100Mbs */

    Gmac_Ip_MDIOWriteMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0U, 0x2000U, 1U);

    while (Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0U, &phy_reg_val0, 1U) & 0x8000U)

    { /* Busy Wait */

    }

    printf("Speed_Select 100Mbs:\n");

    printf("  devad = 0x1   reg = 0x0000  reg_value = 0x%04X\n", phy_reg_val0);

 

    /* Master Mode 0xC000, Slave Mode 0x8000 */

    Gmac_Ip_MDIOWriteMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0x0834U, 0xC000U, 1U);

    while (Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0x0834U, &phy_reg_val0, 1U) & 0x8000U)

    { /* Busy Wait */

    }

    printf("Master Mode 0xC000, Slave Mode 0x8000:\n");

    printf("  devad = 0x1   reg = 0x0834  reg_value = 0x%04X\n", phy_reg_val0);

 

    /* RMII to copper */

    Gmac_Ip_MDIOWriteMMD(CFG_PHY_CTRL_IDX, phy_addr, 3U, 0x8000U, 0x0246U, 1U);

    while (Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 3U, 0x8000U, &phy_reg_val0, 1U) & 0x8000U)

    { /* Busy Wait */

    }

    printf("RMII to copper:\n");

    printf("  devad = 0x3   reg = 0x8000  reg_value = 0x%04X\n", phy_reg_val0);

 

    /* soft Reset */

    Gmac_Ip_MDIOWriteMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0x0000U, 0xA000, 1U);

    printf("Soft Reset:\n");

    do

    {

       Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0x0000U, &phy_reg_val0, 1U);

       printf("  devad = 0x1   reg = 0x0000  reg_value = 0x%04X\n", phy_reg_val0);

    }while ((0U != (phy_reg_val0 & (1U << 15U))));

 

       /* Wait to establish link */

    printf("Wait to establish link:\n");

    do

    {

       Gmac_Ip_MDIOReadMMD(CFG_PHY_CTRL_IDX, phy_addr, 1U, 0x1, &phy_reg_val0, 1U);

    }while ((0U == (phy_reg_val0 & (1U << 2U))));

    printf("  devad = 0x1   reg = 0x0001  reg_value = 0x%04X\n", phy_reg_val0);

    printf("PMA/PMD receive link up.\n");

}


常见问题

1.  调试和运行程序时跳到“DevAssert();”

       这是因为 S32K3 板没有安装 HSE 固件,而 lwip 演示启用了 ssl_echo 应用程序,会调用一些需要 HSE 固件支持的 API。


解决办法:

  • 在 S32K3 MCU 板上安装 HSE 固件,官网有 HSE 安装教程,这里不再展开描述
  • 在不需要测试 SSL service 的情况下,临时注释掉例程中 < test.c> 第 522 行的这个函数“secure_socket_init();”,如下图所示



2.  HardFault_Handler()

       程序正常运行约 20 分钟后突然停止运行,并跳到 HardFault_Handler() 硬件故障处,这是因为代码中限制了测试时间(默认为 1200秒),超时后会停止执行程序。增加 tests_timeout 变量值可以解决问题(在 <test.c> 的第 250 行)



小结

       文中使用的开发板“Cavalry”现已上架大大购,链接如下:DVK2305- CAVALRY S32K344产品详情_大大购 (wpgdadago.com)

       现在 S32K3 车载以太网模块调试的软件部分已经修改并编译通过,最后一节进行以太网 RMII 通信功能验证,敬请关注本章更新。获取更多资讯,或进一步交流关于 S32K3 的技术问题,欢迎联系世平集团上海应用技术处 ATU <atu.sh@wpi-group.com>。


 

参考文档


[1] Automotive TCP/IP Stack User Manual. Rev. 33.0

[2] lwip_s32k344 demo guide.



欢迎在大大通相关博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:Jadyn Li /李瑞洁

登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle 19c容器数据库数据加载和传输-----SQL*Loader(一)

目录 数据加载 &#xff08;一&#xff09;控制文件加载 1.创建用户执行sqlldr 2.创建文本文件和控制文件 3.查看表数据 4.查看log文件 &#xff08;二&#xff09;快捷方式加载 1.system用户执行 2.查看表数据 3.查看log文件 外部表 数据加载和传输的工具&#xff1…

Vue3---安装路由

介绍 在Vue3项目中安装路由 示例 第一步&#xff1a;执行npm命令安装路由 npm install vue-router4第二步&#xff1a;在项目的src文件夹下创建router子文件夹 第三步&#xff1a;创建index.js和routes.js文件&#xff0c;以下为文件的代码 //通过vue-router插件实现模板…

docker打包介绍

最近在做一个开源项目&#xff0c;遇到开发者问各种问题&#xff0c;发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用&#xff0c;发现docker真是个好东东&#xff0c;基本解决了各种版本差异的问题&#xff0c;真正做到了一键部署使用。 先熟悉一下docker里…

VS2022 | 显示Unreal Engine日志

VS2022 | 显示Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志

ORACLE体系结构逻辑结构-表空间、段、区和数据块

实例 实例是指在内存中分配的一块共享内存区域&#xff08;SGA&#xff09;和一组后台进程&#xff08;或线程&#xff09;&#xff0c;它们用于访问和控制数据库。3实例是Oracle数据库的运行时环境&#xff0c;它是数据库的动态部分&#xff0c;它可以启动和关闭&#xff0c;…

本地部署 big-AGI

本地部署 big-AGI 1. big-AGI 介绍2. Github 地址3. 本地部署 big-AGI4. 访问 big-AGI5. 配置 API key6. 测试一下 1. big-AGI 介绍 欢迎使用 big-AGI &#x1f44b;&#xff0c;这是一款面向需要功能、形式、简单性和速度的专业人士的 GPT 应用程序。 big-AGI 由 10 个供应商…

静态网页设计——崩坏3(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; 使用技术&#xff1a;HTMLCSSJS&#xff08;静态网页设计&#xff09; 主要内容&#xff1a;对游戏崩坏3进行简单介绍。 https://www.bilib…

ATTCK视角下的信息收集:组策略信息收集

目录 什么是组策略&#xff1f; 本地组策略收集 域组策略收集 组策略存储收集 组策略对象收集 什么是组策略&#xff1f; Windows中的组策略&#xff08;Group Policy&#xff09;是一种管理和配置Windows操作系统的功能&#xff0c;它允许系统管理员对计算机和用户的行为…

Photoshop Express一款出色的照片编辑器

​【应用名称】&#xff1a;Photoshop Express ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Photoshop ​【应用版本】&#xff1a;12.1.2 ​【应用大小】&#xff1a;223MB ​【软件说明】&#xff1a;软件升级更新。一款出色的照片编辑器&#xff0c…

Xshell连接Ubuntu失败

错误&#xff1a; Xshell连接Ubuntu失败。 Connecting to 192.168.xx.xxx:22…Could not connect to 192.168.xx.xxx’ (port 22): Connection failed. 解决方案&#xff1a;边解决&#xff0c;边测试Xshell是否可以连接 1、SSH 服务未启动&#xff1a; 确保 Ubuntu 上的 S…

回车与换行的区别。CR、LF、CRLF的区别。\r \n \r\n

1.先上结论 中文英文英文缩写ASCⅡ转义ASCⅡ值系统回车Carriage ReturnCR\r13MacIntosh&#xff08;早期的Mac&#xff09;换行LinefeedLF\n10Unix/Linux/Mac OS X&#xff08;现在的Mac&#xff09;回车并换行CRLF\r\nWindows 2.详解 很长一段时间里&#xff0c;对于CRLF、C…

swing快速入门(四十二)JTree的基本创建

注释很详细&#xff0c;直接上代码 新增内容 &#x1f526;JTree的创建 &#x1f526;设置节点之间的连线 &#x1f526;设置节点之间的水平分割线 &#x1f526;设置根节点的展开折叠图标 &#x1f526;设置是否隐藏根节点 package swing31_40;import javax.swing.*; import j…

【Electron】 Vite项目 初始配置 scss

pnpm add -D sasssrc下面创建 styles/main.scss 文件 mian.ts 内引入 ./styles.scss 文件 import ./styles/main.scss 测试scss是否生效&#xff1a; styles/mian.scss :root{--mian:red; } App.vue <template><div>你好</div> </template><s…

锂电池低温充电效率低、容量低的原因

前言&#xff1a;锂离子电池在充电时&#xff0c;Li从正极脱嵌并嵌入负极&#xff1b;但是当一些异常情况&#xff1a;如负极嵌锂空间不足、Li嵌入负极阻力太大、Li过快的从正极脱嵌但无法等量的嵌入负极等异常发生时&#xff0c;无法嵌入负极的Li只能在负极表面得电子&#xf…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

【动态代理详解】

文章目录 1. 关于代理1.1 代理的概述1.1.1 什么是动态代理1.1.2 动态代理能做什么 1.2 什么是代理1.2.1 生活中的代理1.2.2 为什么要找中介&#xff1f; 1.3 开发中的代理模式&#xff08;代理&#xff09;1.3.1 使用代理模式的作用 1.4 实现代理的方式 2. 静态代理2.1 什么是静…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果&#xff1a;sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接&#xff0c;其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

OpenHarmony - 基于ArkUI框架实现日历应用

前言 对于刚刚接触OpenHarmony应用开发的开发者&#xff0c;最快的入门方式就是开发一个简单的应用&#xff0c;下面记录了一个日历应用的开发过程&#xff0c;通过日历应用的开发&#xff0c;来熟悉基本图形的绘制&#xff0c;ArkUI的组件的使用&#xff0c;UI组件生命周期&a…

ES6(一部分)未完...

文章目录 ES61.ES6 let声明变量2.ES6 const声明常量3.变量解构赋值3-1解构对象3-2解构数组3-3字符串解构 4.模板字符串5.字符串扩展5-1 include函数5-2 repeat函数&#xff08;重复&#xff09; 6.数值扩展6-1二进制和八进制表示法6-2isFinite 与 isNaN方法6-3islnteger方法6-4…

泽攸科技ZEM20台式扫描电镜低真空下的应用案例

低真空扫描电子显微镜是显微技术领域的重要分支&#xff0c;与传统的高真空扫描电子显微镜相比&#xff0c;低真空电镜对含水、多孔、不耐电子束烧伤和不适合喷金处理的样品进行直接观测并具有更好的效果&#xff0c;对于生物样品而言低真空电镜比高真空电镜更具有优势&#xf…