前言
- 在使用netxduo组件时,如果在上电过程中,未插入网线,eth驱动使能过程中未正常初始化
- 本次使用以下几种方式进行设置
问题原因
使用定时器+事件回调方式
网络组件中进行调整
/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2024-4-15 shchl first version*/
#include <nx_ip.h>#include "lan8742.h"
#include "main.h"
#include "nx_stm32_eth_driver.h"
#include "nx_stm32_phy_driver.h"#if 1#define APP_NX_PACKET_SIZE 1536 /*数据包大小*/
#define APP_NX_PACKET_POOL_SIZE ((sizeof(NX_PACKET) + APP_NX_PACKET_SIZE) * 16)#define APP_NX_IP_STACK_SIZE 2048
#define APP_NX_IP_PRIORITY 10#define APP_NX_ARP_CACHE_SIZE 1024#define APP_NX_IP_ADDR IP_ADDRESS(192,168,8,9)
#define APP_NX_IP_SUB_MASK IP_ADDRESS(255,255,255,0)/*
*******************************************************************************************************
* 外部引入变量
*******************************************************************************************************
*//*
*******************************************************************************************************
* 变量
*******************************************************************************************************
*/void *loc_ip_area;
void *packet_pool_area;
void *arp_cache_area;NX_PACKET_POOL g_packet_pool; /*全局packet pool 池*/
NX_IP g_loc_ip; /*全局 本地ip实例*/
static TX_TIMER nx_link_status_timer;
/*
*********************************************************************************************************
* 静态全局变量
*********************************************************************************************************
*//*
*********************************************************************************************************
* 函数声明
*********************************************************************************************************
*/
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up);static VOID check_phy_link(ULONG id);/*
*********************************************************************************************************
* 外部函数
*********************************************************************************************************
*/
int nx_application_define(void) {UINT stat = 0;
#if 1/*内存分配*/static CHAR nx_packet_pool[APP_NX_PACKET_POOL_SIZE];static CHAR nx_arp_cache[APP_NX_ARP_CACHE_SIZE];static CHAR nx_ip_stack[APP_NX_IP_STACK_SIZE];packet_pool_area = nx_packet_pool;loc_ip_area = nx_ip_stack;arp_cache_area = nx_arp_cache;
#elsepacket_pool_area = app_malloc(APP_NX_PACKET_POOL_SIZE);loc_ip_area = app_malloc(APP_NX_IP_STACK_SIZE);arp_cache_area = app_malloc(APP_NX_ARP_CACHE_SIZE);
#endif/*创建packet pool*/stat += nx_packet_pool_create(&g_packet_pool, "NX PACKET POOL",APP_NX_PACKET_SIZE,packet_pool_area, APP_NX_PACKET_POOL_SIZE);stat += nx_ip_create(&g_loc_ip,"NX IP",APP_NX_IP_ADDR,APP_NX_IP_SUB_MASK,&g_packet_pool,nx_stm32_eth_driver,loc_ip_area,APP_NX_IP_STACK_SIZE,APP_NX_IP_PRIORITY);nx_ip_link_status_change_notify_set(&g_loc_ip, phy_link_status_change_notify);/*ip 相关配置*/{/* 启用 ARP 并为 IP 实例 提供 ARP 缓存内存。 */stat += nx_arp_enable(&g_loc_ip, arp_cache_area, APP_NX_ARP_CACHE_SIZE);/* 启用 ICMP */stat += nxd_icmp_enable(&g_loc_ip);/* 为IP 实例启用 TCP 处理. */stat += nx_tcp_enable(&g_loc_ip);/*禁止分包 */stat += nx_ip_fragment_disable(&g_loc_ip);}if (stat) {LOG_E("app_nx_ip_instance_create error:%d", stat);}tx_timer_create(&nx_link_status_timer, "phy check",check_phy_link, 0, 1000, 5000, TX_AUTO_ACTIVATE);return NX_SUCCESS;
}TX_APP_DEFINE_EXPORT(nx_application_define); /*首先创建模块应用*//*
*********************************************************************************************************
* 内部函数
*********************************************************************************************************
*/static VOID check_phy_link(ULONG id) {// ;int32_t status = nx_eth_phy_get_link_state();UINT nx_link_status = g_loc_ip.nx_ip_interface[0].nx_interface_link_up;// 判断if (((nx_link_status == TX_TRUE) && status <= LAN8742_STATUS_LINK_DOWN) ||(nx_link_status == TX_FALSE && status > LAN8742_STATUS_LINK_DOWN)) {g_loc_ip.nx_ip_interface[0].nx_interface_link_status_change = TX_TRUE;_tx_event_flags_set(&g_loc_ip.nx_ip_events,NX_IP_LINK_STATUS_EVENT,TX_OR);}
}/**** @brief 物理链接状态改变通知回调函数* @param ip_ptr* @param i* @param link_up*/
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up) {NX_IP_DRIVER driver_request;if (link_up == NX_TRUE) {LOG_D("nx link enable ", link_up);driver_request.nx_ip_driver_ptr = ip_ptr;driver_request.nx_ip_driver_command = NX_LINK_ENABLE;ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);} else {// ip_ptr->nx_ip_interface[i].nx_interface_link_up=NX_FALSE;LOG_D("nx link diasble ", link_up);driver_request.nx_ip_driver_ptr = ip_ptr;driver_request.nx_ip_driver_command = NX_LINK_DISABLE;ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);}
}#endif
关键部分
关于这个事件接收部分的代码(设计到的源码重点部分说明)
禁用部分(调整)
测试结果