硬汉嵌入式论坛

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

[以太网] netxduo 移植求助

  [复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2024-10-17 19:30:49 | 显示全部楼层 |阅读模式
1 学习两个礼拜了,真的恶心死了,从未如此有挫败感,论坛翻遍了都解决不了问题,不想学了,现在看到netxduo就恶心;
2 环境:MCU :stm32H43XI  IDE:cubemxIDE   操作系统:Threadx  ; 驱动包:最新     移植过程:裸机工程+threadx+netxduo ;
3 netxduo 协议栈参考官方的en.x-cube-azrtos-h7-v3-3-0包里面关于NETX的工程(NUCLEO-H723ZG和STM32H735G-DK);
4 现象:获取不到IP,卡在红色代码里面;
[C] 纯文本查看 复制代码
        printf("The network cable is connected.\n");

        /* Send request to enable PHY Link. */
        nx_ip_driver_direct_command(&NetXDuoEthIpInstance, NX_LINK_ENABLE,&actual_status);

        /* Send request to check if an address is resolved. */
[color=#ff0000]        status = nx_ip_interface_status_check(&NetXDuoEthIpInstance, 0, NX_IP_ADDRESS_RESOLVED,&actual_status, 10);
        if(status == NX_SUCCESS)[/color]

5 ETH PHY芯片LAN8720A,工程里面phy驱动已经参考DM9162修改成LAN8720A;


6 上传代码!!!老哥们有时间看下,不胜感激

回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-10-17 19:35:00 | 显示全部楼层
工程已经上传,现象是卡在这里(有操作系统,我也不知道跑哪里了)
status = nx_ip_interface_status_check(&NetXDuoEthIpInstance, 0, NX_IP_ADDRESS_RESOLVED,&actual_status, 10);
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-10-17 19:46:04 | 显示全部楼层
代码上传了 ,怎么不显示……再上传一次!!!

Template_threadx.zip

4.2 MB, 下载次数: 7

回复

使用道具 举报

10

主题

75

回帖

120

积分

初级会员

积分
120
发表于 2024-10-18 08:47:07 | 显示全部楼层
8成MPU设置问题,照着这个来试试
mpu084624.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-10-18 10:00:35 | 显示全部楼层
特别注意MPU/Cache配置,非常重要,以及以太网描述要配置到指定的RAM空间,以太网缓冲区不要配置到TCM了,可以使用CubeMX生成个配置,将里面的相关配置整合到你现在的工程里面
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-10-19 18:28:12 | 显示全部楼层
egoistaw 发表于 2024-10-18 08:47
8成MPU设置问题,照着这个来试试

谢谢回复!!!问题已经找到!!!
1)全局中断我没写进来。netx驱动接口有HAL_ETH_TxCpltCallback 和 HAL_ETH_RxCpltCallback回调函数,我以为全局中里面也有;
2)D2域的MPU需要配置,size需要配置成MPU_REGION_SIZE_256B;
3)现在tcp作为服务器能连上了,但是接收还有问题,接收到client消息就会崩溃!!!
4)下面事MPU配置,给遇到这个问题的同学们参考下!!!
/** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;[/mw_shl_code]
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2024-10-19 18:29:02 | 显示全部楼层
eric2013 发表于 2024-10-18 10:00
特别注意MPU/Cache配置,非常重要,以及以太网描述要配置到指定的RAM空间,以太网缓冲区不要配置到TCM了, ...

谢谢回复!!!问题已经找到!!!
1)全局中断我没写进来。netx驱动接口有HAL_ETH_TxCpltCallback 和 HAL_ETH_RxCpltCallback回调函数,我以为全局中里面也有;
2)D2域的MPU需要配置,size需要配置成MPU_REGION_SIZE_256B;
3)现在tcp作为服务器能连上了,但是接收还有问题,接收到client消息就会崩溃!!!
4)下面事MPU配置,给遇到这个问题的同学们参考下!!!
/** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_128KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-10-20 10:36:57 | 显示全部楼层
Mr1sky 发表于 2024-10-19 18:29
谢谢回复!!!问题已经找到!!!
1)全局中断我没写进来。netx驱动接口有HAL_ETH_TxCpltCallback 和 H ...

发送和接收缓存区也可以配置下MPU。
回复

使用道具 举报

6

主题

27

回帖

50

积分

初级会员

积分
50
发表于 2024-10-23 14:41:18 | 显示全部楼层
Mr1sky 发表于 2024-10-19 18:29
谢谢回复!!!问题已经找到!!!
1)全局中断我没写进来。netx驱动接口有HAL_ETH_TxCpltCallback 和 H ...

楼主你第二部分的mpu怎么没有写BaseAddress呀,还有全局中断是什么问题想了解一下
回复

使用道具 举报

4

主题

126

回帖

138

积分

初级会员

积分
138
发表于 2024-10-23 19:55:09 | 显示全部楼层
newton 发表于 2024-10-23 14:41
楼主你第二部分的mpu怎么没有写BaseAddress呀,还有全局中断是什么问题想了解一下

建议按照ARM官方来设置MPU,这个应该是通用的。 mpu.png
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-11-21 17:05:28 | 显示全部楼层
怎么移植LAN8720A的驱动啊?有开源的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-22 09:34:53 | 显示全部楼层
hmjames 发表于 2024-11-21 17:05
怎么移植LAN8720A的驱动啊?有开源的吗?

用ST官方的LAN8742驱动即可,和8720在使用上基本一样。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-11-27 13:16:11 | 显示全部楼层
eric2013 发表于 2024-11-22 09:34
用ST官方的LAN8742驱动即可,和8720在使用上基本一样。

我用CubeMX生成的代码,网卡灯亮了,但是ping不通。刚开机的时候进ETH中断处理程序看到dma_error值是0xC0C0,查了743参考手册发现对应的错误是Bit 7 RBU: Receive Buffer Unavailable。但是后面ping和udp 发送数据都没有触发ETH中断处理程序。是哪里配置的不对吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-11-28 08:34:40 | 显示全部楼层
hmjames 发表于 2024-11-27 13:16
我用CubeMX生成的代码,网卡灯亮了,但是ping不通。刚开机的时候进ETH中断处理程序看到dma_error值是0xC0 ...

这种情况的话,可以优先排查下8720,上电后,会通过8720获取网络状态,全双工,100M,看看这个正常获取了没
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-12-3 09:02:18 | 显示全部楼层
eric2013 发表于 2024-11-28 08:34
这种情况的话,可以优先排查下8720,上电后,会通过8720获取网络状态,全双工,100M,看看这个正常获取了 ...

状态正常的,后来发现和MPU配置有关系,一开始用的是开启cache的高性能模式,后来关闭cache就可以接收到了,但是跑十几秒又ping不通了。
    /* 最高性能,读Cache和写Cache都开启 */
#if 0
           /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x24000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);

    /* 最低性能,读Cache和写Cache都关闭 */
#else
        /* 配置AXI SRAM的MPU属性为NORMAL, NO Read allocate,NO Write allocate */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x24000000;
        MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);
#endif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-3 10:21:44 | 显示全部楼层
hmjames 发表于 2024-12-3 09:02
状态正常的,后来发现和MPU配置有关系,一开始用的是开启cache的高性能模式,后来关闭cache就可以接收到 ...

关键是以太网涉及的RAM空间MPU/Cache设置,这个地方做了没。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-12-4 14:15:43 | 显示全部楼层
eric2013 发表于 2024-12-3 10:21
关键是以太网涉及的RAM空间MPU/Cache设置,这个地方做了没。

这么配置的:
    /* 配置以太网收发描述符部分为Strongly Ordered */
    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress = 0x30040000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER1;
    MPU_InitStruct.SubRegionDisable = 0x0;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

    NX_DRIVER_INFORMATION nx_driver_information __MEMORY_AT(0x30040200);

    /* Ethernet Rx DMA 描述符 */
    ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __MEMORY_AT(0x30040000);

    /* Ethernet Tx DMA 描述符 */
    ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __MEMORY_AT(0x30040060);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-5 08:51:52 | 显示全部楼层
hmjames 发表于 2024-12-4 14:15
这么配置的:
    /* 配置以太网收发描述符部分为Strongly Ordered */
    MPU_InitStruct.Enable = MP ...

还有个以太网描述符的MPU/Cache配置,这个配了没
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-12-9 13:16:18 | 显示全部楼层
eric2013 发表于 2024-12-5 08:51
还有个以太网描述符的MPU/Cache配置,这个配了没

就这些,V7的例程里面就配置这些
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-10 08:02:09 | 显示全部楼层
hmjames 发表于 2024-12-9 13:16
就这些,V7的例程里面就配置这些

省事些,直接使用AZURE H7软件包里面提供好的工程基础上改下,他的那个工程是基于LAN8742,这个是可以直接用在LAN8720上的
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2024-12-13 09:17:01 | 显示全部楼层
eric2013 发表于 2024-12-10 08:02
省事些,直接使用AZURE H7软件包里面提供好的工程基础上改下,他的那个工程是基于LAN8742,这个是可以直 ...

主要问题可能在netxduo pool的大小,我后来把pool改大到可以放199个packet就可以了。主要我们的应用一次连续发99个包间隔几十毫秒后再发。要是接收一个处理一个就会造成延时丢包。只有都收下来在间隔期间处理。但是这样SRAM3就不够用作缓冲区了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-14 00:53:32 | 显示全部楼层
hmjames 发表于 2024-12-13 09:17
主要问题可能在netxduo pool的大小,我后来把pool改大到可以放199个packet就可以了。主要我们的应用一次 ...

可以考虑用其他缓冲区,只有那个以太网DMA描述符必须在指定SRAM
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2025-1-22 14:56:07 | 显示全部楼层
eric2013 发表于 2024-12-14 00:53
可以考虑用其他缓冲区,只有那个以太网DMA描述符必须在指定SRAM

也就是说“    NX_DRIVER_INFORMATION nx_driver_information __MEMORY_AT(0x30040200);

    /* Ethernet Rx DMA 描述符 */
    ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __MEMORY_AT(0x30040000);

    /* Ethernet Tx DMA 描述符 */
    ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __MEMORY_AT(0x30040060); ”这里面只有DMARxDscrTab和DMATxDscrTab要指定在SRAM,nx_driver_information其实没关系的?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-23 06:18:04 | 显示全部楼层
hmjames 发表于 2025-1-22 14:56
也就是说“    NX_DRIVER_INFORMATION nx_driver_information __MEMORY_AT(0x30040200);

    /* Ether ...

对,正常是这样的。

推荐DMA的发送和接收缓冲也放在这个里面。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2025-1-23 15:52:13 | 显示全部楼层
eric2013 发表于 2025-1-23 06:18
对,正常是这样的。

推荐DMA的发送和接收缓冲也放在这个里面。

发送和接收缓冲怎么配置的啊?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-24 06:25:55 | 显示全部楼层
hmjames 发表于 2025-1-23 15:52
发送和接收缓冲怎么配置的啊?

也用__MEMORY_AT设置位置到这个RAM区。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 06:33 , Processed in 0.058140 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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