前言
- 在使用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;
#else
packet_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
关键部分
关于这个事件接收部分的代码(设计到的源码重点部分说明)
禁用部分(调整)
测试结果