【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)
前言
? ? ? ? 前文介绍了 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 /李瑞洁
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!