硬汉嵌入式论坛

 找回密码
 立即注册
查看: 990|回复: 7
收起左侧

[NetX] netxduo ping不通

[复制链接]

7

主题

33

回帖

54

积分

初级会员

积分
54
发表于 2024-11-20 16:10:24 | 显示全部楼层 |阅读模式
最近在做netxduo的udp,发现开启调试模式单步走完MX_NetXDuo_Init函数,udp和ping都ok,但如果直接下载udp和ping都不ok,大神门给诊断下



[C] 纯文本查看 复制代码
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    app_netxduo.c
  * @author  MCD Application Team
  * @brief   NetXDuo applicative file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2020-2021 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "app_netxduo.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "nxd_bsd.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define UDP_SERVER_PORT 1234

#define PRINT_DATA(addr, port, data)        do {                                            \
                                                  printf("[%lu.%lu.%lu.%lu:%u] -> '%s' \r\n", \
                                                  (addr >> 24) & 0xff,                      \
                                                  (addr >> 16) & 0xff,                      \
                                                  (addr >> 8) & 0xff,                       \
                                                  (addr & 0xff), port, data);               \
                                               } while(0)

#define UDP_THREAD_PRIORITY 3U

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
TX_THREAD      NxAppThread;
NX_PACKET_POOL NxAppPool;
NX_IP          NetXDuoEthIpInstance;
/* USER CODE BEGIN PV */
TX_THREAD thread_udp_server;
NX_UDP_SOCKET UDPSocket;

UCHAR data_buffer[4096];
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
static VOID nx_app_thread_entry (ULONG thread_input);
/* USER CODE BEGIN PFP */
static VOID thread_server_entry(ULONG thread_input);
/* USER CODE END PFP */

/**
  * @brief  Application NetXDuo Initialization.
  * @param memory_ptr: memory pointer
  * @retval int
  */
UINT MX_NetXDuo_Init(VOID *memory_ptr)
{
  UINT ret = NX_SUCCESS;
  TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
  CHAR *pointer;

  /* USER CODE BEGIN MX_NetXDuo_MEM_POOL */
  if (tx_byte_allocate(byte_pool, (VOID **)&pointer, NX_APP_THREAD_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS) {
	  return TX_POOL_ERROR;
  }

  ret = tx_thread_create(&thread_udp_server,
	  "UDP Server thread",
	  thread_server_entry,
	  0,
	  pointer,
	  NX_APP_THREAD_STACK_SIZE,
	  UDP_THREAD_PRIORITY,
	  UDP_THREAD_PRIORITY,
	  TX_NO_TIME_SLICE,
	  TX_AUTO_START);

  if (ret != TX_SUCCESS) {
	  return TX_THREAD_ERROR;
  }
  /* USER CODE END MX_NetXDuo_MEM_POOL */

  /* USER CODE BEGIN 0 */

  /* USER CODE END 0 */

  /* Initialize the NetXDuo system. */
  nx_system_initialize();

    /* Allocate the memory for packet_pool.  */
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, NX_APP_PACKET_POOL_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }

  /* Create the Packet pool to be used for packet allocation,
   * If extra NX_PACKET are to be used the NX_APP_PACKET_POOL_SIZE should be increased
   */
  ret = nx_packet_pool_create(&NxAppPool, "NetXDuo App Pool", DEFAULT_PAYLOAD_SIZE, pointer, NX_APP_PACKET_POOL_SIZE);

  if (ret != NX_SUCCESS)
  {
    return NX_POOL_ERROR;
  }

    /* Allocate the memory for Ip_Instance */
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, Nx_IP_INSTANCE_THREAD_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }


   /* Create the main NX_IP instance */
  ret = nx_ip_create(&NetXDuoEthIpInstance, "NetX Ip instance", NX_APP_DEFAULT_IP_ADDRESS, NX_APP_DEFAULT_NET_MASK, &NxAppPool, nx_stm32_eth_driver,
                     pointer, Nx_IP_INSTANCE_THREAD_SIZE, NX_APP_INSTANCE_PRIORITY);

  if (ret != NX_SUCCESS)
  {
    return NX_NOT_SUCCESSFUL;
  }

    /* Allocate the memory for ARP */
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, DEFAULT_ARP_CACHE_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }

  /* Enable the ARP protocol and provide the ARP cache size for the IP instance */

  /* USER CODE BEGIN ARP_Protocol_Initialization */
  ret = nx_ip_fragment_enable(&NetXDuoEthIpInstance);
  if (ret != NX_SUCCESS) {
	  return NX_NOT_SUCCESSFUL;
  }
  /* USER CODE END ARP_Protocol_Initialization */

  ret = nx_arp_enable(&NetXDuoEthIpInstance, (VOID *)pointer, DEFAULT_ARP_CACHE_SIZE);

  if (ret != NX_SUCCESS)
  {
    return NX_NOT_SUCCESSFUL;
  }

  /* Enable the ICMP */

  /* USER CODE BEGIN ICMP_Protocol_Initialization */

  /* USER CODE END ICMP_Protocol_Initialization */

  ret = nx_icmp_enable(&NetXDuoEthIpInstance);

  if (ret != NX_SUCCESS)
  {
    return NX_NOT_SUCCESSFUL;
  }

  /* Enable TCP Protocol */

  /* USER CODE BEGIN TCP_Protocol_Initialization */

  /* USER CODE END TCP_Protocol_Initialization */

  ret = nx_tcp_enable(&NetXDuoEthIpInstance);

  if (ret != NX_SUCCESS)
  {
    return NX_NOT_SUCCESSFUL;
  }

  /* Enable the UDP protocol required for  DHCP communication */

  /* USER CODE BEGIN UDP_Protocol_Initialization */

  /* USER CODE END UDP_Protocol_Initialization */

  ret = nx_udp_enable(&NetXDuoEthIpInstance);

  if (ret != NX_SUCCESS)
  {
    return NX_NOT_SUCCESSFUL;
  }

   /* Allocate the memory for main thread   */
  if (tx_byte_allocate(byte_pool, (VOID **) &pointer, NX_APP_THREAD_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
  {
    return TX_POOL_ERROR;
  }

  /* Create the main thread */
  ret = tx_thread_create(&NxAppThread, "NetXDuo App thread", nx_app_thread_entry , 0, pointer, NX_APP_THREAD_STACK_SIZE,
                         NX_APP_THREAD_PRIORITY, NX_APP_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);

  if (ret != TX_SUCCESS)
  {
    return TX_THREAD_ERROR;
  }

  /* USER CODE BEGIN MX_NetXDuo_Init */

  /* USER CODE END MX_NetXDuo_Init */

  return ret;
}

/**
* @brief  Main thread entry.
* @param thread_input: ULONG user argument used by the thread entry
* @retval none
*/
static VOID nx_app_thread_entry (ULONG thread_input)
{
  /* USER CODE BEGIN Nx_App_Thread_Entry 0 */

  /* USER CODE END Nx_App_Thread_Entry 0 */

}
/* USER CODE BEGIN 1 */
static VOID thread_server_entry(ULONG thread_input)
{
	NX_PACKET *RecPacket;
	NX_PACKET *TraPacket;

	ULONG bytes_read;

	UINT source_port;
	ULONG source_ip_address;

	uint8_t send_buffer[20];
	ULONG count = 0;

	UINT ret = nx_udp_socket_create(&NetXDuoEthIpInstance,
		&UDPSocket,
		"UDP Server Socket",
		NX_IP_NORMAL,
		NX_FRAGMENT_OKAY,
		NX_IP_TIME_TO_LIVE,
		512);
	if (ret != NX_SUCCESS) {
		printf("create socket err\n");
	}

	ret = nx_udp_socket_bind(&UDPSocket, UDP_SERVER_PORT, TX_WAIT_FOREVER);
	if (ret != NX_SUCCESS) {
		printf("bind err\n");
	}

	while (1) {
		/* 接收数据 */
		ret = nx_udp_socket_receive(&UDPSocket, &RecPacket, TX_WAIT_FOREVER);

		if (ret == NX_SUCCESS) {
			/* 将UDP数据包中的数据复制到缓冲data_buffer */
			nx_packet_data_extract_offset(RecPacket, 0, data_buffer, sizeof(data_buffer), &bytes_read);

			/* 获取远程端口和IP  */
			nx_udp_source_extract(RecPacket, &source_ip_address, &source_port);

//			PRINT_DATA(source_ip_address, source_port, data_buffer);

			nx_packet_release(RecPacket);

			ret = nx_packet_allocate(&NxAppPool, &TraPacket, NX_UDP_PACKET, TX_WAIT_FOREVER);
			if (ret) {
				printf("udp packet allocate fail\n");
			}

//			sprintf((char *)send_buffer, "send buff = %lu\r\n", count++);

			/*将要发�?�的数据附加到TraPacket */
			ret = nx_packet_data_append(
				TraPacket, (VOID *)send_buffer, strlen((char *)send_buffer), &NxAppPool, TX_WAIT_FOREVER);
			if (ret) {
				printf("udp packet data append fail\n");
			}

			/* 发�?�数据包到UDP发�?�端 */
			ret = nx_udp_socket_send(&UDPSocket, TraPacket, source_ip_address, source_port);
		}
	}
}
/* USER CODE END 1 */


回复

使用道具 举报

9

主题

59

回帖

101

积分

初级会员

积分
101
发表于 2024-11-20 21:06:03 | 显示全部楼层
Eth初始化里添加拉高拉低reset一下phy模块
回复

使用道具 举报

7

主题

33

回帖

54

积分

初级会员

积分
54
 楼主| 发表于 2024-11-21 09:45:58 | 显示全部楼层
egoistaw 发表于 2024-11-20 21:06
Eth初始化里添加拉高拉低reset一下phy模块

[C] 纯文本查看 复制代码
		HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET); // Lan8720 Reset Code
		HAL_Delay(50);
		HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_SET);
		HAL_Delay(50);


已经在HAL_ETH_MspInit最后加了phy的复位了,还是不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-11-21 10:30:10 | 显示全部楼层
capw 发表于 2024-11-21 09:45
[mw_shl_code=c,true]                HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET); // La ...

上电后延迟3秒再初始化网络试试。

还是不行,手动复位下,再延迟3秒执行网络初始化试试。
回复

使用道具 举报

7

主题

33

回帖

54

积分

初级会员

积分
54
 楼主| 发表于 2024-11-26 11:11:06 | 显示全部楼层
eric2013 发表于 2024-11-21 10:30
上电后延迟3秒再初始化网络试试。

还是不行,手动复位下,再延迟3秒执行网络初始化试试。

重新配置了新工程,在  MX_ETH_Init()后延迟了3s,ping没有问题了, 但是1472B这种大包偶尔还是会丢,32B小包一小时都不会丢
回复

使用道具 举报

7

主题

33

回帖

54

积分

初级会员

积分
54
 楼主| 发表于 2024-11-26 18:39:21 | 显示全部楼层
最后把ETH对应的IO速率全部设置为VeryHigh,并给任务NetXDuoEthIpInstance分配2*1024字节,百万ping包(1472B)就没有问题了。
IDE用的是STM32CubeIDE
Snipaste_2024-11-26_18-37-18.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-11-27 08:58:06 | 显示全部楼层
capw 发表于 2024-11-26 18:39
最后把ETH对应的IO速率全部设置为VeryHigh,并给任务NetXDuoEthIpInstance分配2*1024字节,百万ping包(147 ...

谢谢告知最终原因
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2025-3-10 23:27:11 | 显示全部楼层
同样的原因,感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 20:12 , Processed in 0.288025 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表