硬汉嵌入式论坛

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

[以太网] 分享个修正版RL-TCPnet V7.X和LwIP的LAN8720驱动,符合CMSIS-Driver驱动规范,适用于所有STM32系列(V1.0)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-4-14 10:55:49 | 显示全部楼层 |阅读模式
在CMSIS-Driver提供的原始驱动基础上之加了复位功能,这个复位功能非常重要,否则运行阶段8720容易通信异常。

【非常重要的帖子,必读】
CMSIS-Driver驱动各种以太网PHY芯片,读取ID前建议加上软件复位
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95709



这个驱动是在H7-TOOL的RTX5全家桶版上使用的。

PHY_LAN8720.h (5.03 KB, 下载次数: 362)
PHY_LAN8720.c (7.96 KB, 下载次数: 420)
  1. /*
  2. * Copyright (c) 2013-2018 Arm Limited. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the License); you may
  7. * not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  14. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * -----------------------------------------------------------------------
  19. *
  20. * $Date:        25. May 2018
  21. * $Revision:    V6.2
  22. *  
  23. * Driver:       Driver_ETH_PHYn (default: Driver_ETH_PHY0)
  24. * Project:      Ethernet Physical Layer Transceiver (PHY)
  25. *               Driver for LAN8720
  26. * -----------------------------------------------------------------------
  27. * Use the following configuration settings in the middleware component
  28. * to connect to this driver.
  29. *
  30. *   Configuration Setting                     Value
  31. *   ---------------------                     -----
  32. *   Connect to hardware via Driver_ETH_PHY# = n (default: 0)
  33. * -------------------------------------------------------------------- */

  34. /* History:
  35. *  Version 6.2
  36. *    Updated for ARM compiler 6
  37. *  Version 6.1
  38. *    Added driver flow control flags
  39. *  Version 6.00
  40. *    Based on API V2.00
  41. *  Version 5.01
  42. *    Based on API V1.10 (namespace prefix ARM_ added)
  43. *  Version 5.00
  44. *    Initial release
  45. */

  46. #include "PHY_LAN8720.h"

  47. #define ARM_ETH_PHY_DRV_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(6,2) /* driver version */


  48. #ifndef ETH_PHY_NUM
  49. #define ETH_PHY_NUM     0        /* Default driver number */
  50. #endif

  51. #ifndef ETH_PHY_ADDR
  52. #define ETH_PHY_ADDR    0x00     /* Default device address */
  53. #endif


  54. /* Driver Version */
  55. static const ARM_DRIVER_VERSION DriverVersion = {
  56.   ARM_ETH_PHY_API_VERSION,
  57.   ARM_ETH_PHY_DRV_VERSION
  58. };

  59. /* Ethernet PHY control structure */
  60. static PHY_CTRL PHY = { NULL, NULL, 0, 0, 0 };


  61. /**
  62.   \fn          ARM_DRIVER_VERSION GetVersion (void)
  63.   \brief       Get driver version.
  64.   \return      \ref ARM_DRIVER_VERSION
  65. */
  66. static ARM_DRIVER_VERSION GetVersion (void) {
  67.   return DriverVersion;
  68. }


  69. /**
  70.   \fn          int32_t Initialize (ARM_ETH_PHY_Read_t  fn_read,
  71.                                    ARM_ETH_PHY_Write_t fn_write)
  72.   \brief       Initialize Ethernet PHY Device.
  73.   \param[in]   fn_read   Pointer to \ref ARM_ETH_MAC_PHY_Read
  74.   \param[in]   fn_write  Pointer to \ref ARM_ETH_MAC_PHY_Write
  75.   \return      \ref execution_status
  76. */
  77. static int32_t Initialize (ARM_ETH_PHY_Read_t fn_read, ARM_ETH_PHY_Write_t fn_write) {

  78.   if ((fn_read == NULL) || (fn_write == NULL)) { return ARM_DRIVER_ERROR_PARAMETER; }

  79.   if ((PHY.flags & PHY_INIT) == 0U) {
  80.     /* Register PHY read/write functions. */
  81.     PHY.reg_rd = fn_read;
  82.     PHY.reg_wr = fn_write;

  83.     PHY.bmcr   = 0U;
  84.     PHY.flags  = PHY_INIT;
  85.   }

  86.   return ARM_DRIVER_OK;
  87. }

  88. /**
  89.   \fn          int32_t Uninitialize (void)
  90.   \brief       De-initialize Ethernet PHY Device.
  91.   \return      \ref execution_status
  92. */
  93. static int32_t Uninitialize (void) {

  94.   PHY.reg_rd = NULL;
  95.   PHY.reg_wr = NULL;
  96.   PHY.bmcr   = 0U;
  97.   PHY.flags  = 0U;

  98.   return ARM_DRIVER_OK;
  99. }

  100. /**
  101.   \fn          int32_t PowerControl (ARM_POWER_STATE state)
  102.   \brief       Control Ethernet PHY Device Power.
  103.   \param[in]   state  Power state
  104.   \return      \ref execution_status
  105. */
  106. static int32_t PowerControl (ARM_POWER_STATE state) {
  107.   uint16_t val;

  108.   switch ((int32_t)state) {
  109.     case ARM_POWER_OFF:
  110.       if ((PHY.flags & PHY_INIT) == 0U) {
  111.         /* Initialize must provide register access function pointers */
  112.         return ARM_DRIVER_ERROR;
  113.       }

  114.       PHY.flags &= ~PHY_POWER;
  115.       PHY.bmcr   =  BMCR_POWER_DOWN;

  116.       return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr));

  117.     case ARM_POWER_FULL:
  118.       if ((PHY.flags & PHY_INIT) == 0U) {
  119.         return ARM_DRIVER_ERROR;
  120.       }
  121.       if (PHY.flags & PHY_POWER) {
  122.         return ARM_DRIVER_OK;
  123.       }
  124.          
  125.           {
  126.                 uint32_t tout;
  127.                  
  128.                 PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, BMCR_RESET);
  129.                 for (tout = 0; tout < 0x10000; tout++)
  130.                 {
  131.                         PHY.reg_rd(ETH_PHY_ADDR, REG_BMCR, &val);
  132.                         if (!(val & 0x8000))
  133.                         {
  134.                                 break;
  135.                         }
  136.                 }
  137.          
  138.           }
  139.          
  140.       /* Check Device Identification. */
  141.       PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR1, &val);

  142.       if (val != PHY_ID1) {
  143.         /* Invalid PHY ID */
  144.         return ARM_DRIVER_ERROR_UNSUPPORTED;
  145.       }

  146.       PHY.reg_rd(ETH_PHY_ADDR, REG_PHYIDR2, &val);

  147.       if ((val & 0xFFF0) != PHY_ID2) {
  148.         /* Invalid PHY ID */
  149.         return ARM_DRIVER_ERROR_UNSUPPORTED;
  150.       }

  151.       PHY.bmcr = 0U;

  152.       if (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr) != ARM_DRIVER_OK) {
  153.         return ARM_DRIVER_ERROR;
  154.       }

  155.       PHY.flags |=  PHY_POWER;

  156.       return ARM_DRIVER_OK;

  157.     case ARM_POWER_LOW:
  158.     default:
  159.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  160.   }
  161. }

  162. /**
  163.   \fn          int32_t SetInterface (uint32_t interface)
  164.   \brief       Set Ethernet Media Interface.
  165.   \param[in]   interface  Media Interface type
  166.   \return      \ref execution_status
  167. */
  168. static int32_t SetInterface (uint32_t interface) {

  169.   if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }

  170.   switch (interface) {
  171.     case ARM_ETH_INTERFACE_RMII:
  172.       break;
  173.     case ARM_ETH_INTERFACE_MII:
  174.     default:
  175.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  176.   }
  177.   return(0);
  178. }

  179. /**
  180.   \fn          int32_t SetMode (uint32_t mode)
  181.   \brief       Set Ethernet PHY Device Operation mode.
  182.   \param[in]   mode  Operation Mode
  183.   \return      \ref execution_status
  184. */
  185. static int32_t SetMode (uint32_t mode) {
  186.   uint16_t val;

  187.   if ((PHY.flags & PHY_POWER) == 0U) { return ARM_DRIVER_ERROR; }

  188.   val = PHY.bmcr & BMCR_POWER_DOWN;

  189.   switch (mode & ARM_ETH_PHY_SPEED_Msk) {
  190.     case ARM_ETH_PHY_SPEED_10M:
  191.       break;
  192.     case ARM_ETH_PHY_SPEED_100M:
  193.       val |=  BMCR_SPEED_SEL;
  194.       break;
  195.     default:
  196.       return ARM_DRIVER_ERROR_UNSUPPORTED;
  197.   }

  198.   switch (mode & ARM_ETH_PHY_DUPLEX_Msk) {
  199.     case ARM_ETH_PHY_DUPLEX_HALF:
  200.       break;
  201.     case ARM_ETH_PHY_DUPLEX_FULL:
  202.       val |=  BMCR_DUPLEX;
  203.       break;
  204.   }

  205.   if (mode & ARM_ETH_PHY_AUTO_NEGOTIATE) {
  206.     val |= BMCR_ANEG_EN;
  207.   }

  208.   if (mode & ARM_ETH_PHY_LOOPBACK) {
  209.     val |= BMCR_LOOPBACK;
  210.   }

  211.   if (mode & ARM_ETH_PHY_ISOLATE) {
  212.     val |= BMCR_ISOLATE;
  213.   }

  214.   PHY.bmcr = val;

  215.   return (PHY.reg_wr(ETH_PHY_ADDR, REG_BMCR, PHY.bmcr));
  216. }

  217. /**
  218.   \fn          ARM_ETH_LINK_STATE GetLinkState (void)
  219.   \brief       Get Ethernet PHY Device Link state.
  220.   \return      current link status \ref ARM_ETH_LINK_STATE
  221. */
  222. static ARM_ETH_LINK_STATE GetLinkState (void) {
  223.   ARM_ETH_LINK_STATE state;
  224.   uint16_t           val = 0U;

  225.   if (PHY.flags & PHY_POWER) {
  226.     PHY.reg_rd(ETH_PHY_ADDR, REG_BMSR, &val);
  227.   }
  228.   state = (val & BMSR_LINK_STAT) ? ARM_ETH_LINK_UP : ARM_ETH_LINK_DOWN;

  229.   return (state);
  230. }

  231. /**
  232.   \fn          ARM_ETH_LINK_INFO GetLinkInfo (void)
  233.   \brief       Get Ethernet PHY Device Link information.
  234.   \return      current link parameters \ref ARM_ETH_LINK_INFO
  235. */
  236. static ARM_ETH_LINK_INFO GetLinkInfo (void) {
  237.   ARM_ETH_LINK_INFO info;
  238.   uint16_t          val = 0U;

  239.   if (PHY.flags & PHY_POWER) {
  240.     PHY.reg_rd(ETH_PHY_ADDR, REG_PSCSR, &val);
  241.   }

  242.   info.speed  = (val & PSCSR_SPEED)  ? ARM_ETH_SPEED_10M   : ARM_ETH_SPEED_100M;
  243.   info.duplex = (val & PSCSR_DUPLEX) ? ARM_ETH_DUPLEX_FULL : ARM_ETH_DUPLEX_HALF;

  244.   return (info);
  245. }


  246. /* PHY Driver Control Block */
  247. extern
  248. ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM);
  249. ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(ETH_PHY_NUM) = {
  250.   GetVersion,
  251.   Initialize,
  252.   Uninitialize,
  253.   PowerControl,
  254.   SetInterface,
  255.   SetMode,
  256.   GetLinkState,
  257.   GetLinkInfo
  258. };
复制代码






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-14 11:10:04 | 显示全部楼层
更新完毕。
回复

使用道具 举报

609

主题

3045

回帖

4892

积分

至尊会员

积分
4892
发表于 2020-4-14 13:17:25 | 显示全部楼层

等有空了,也罢我的 LAN8742 驱动更新一下看看哟
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-14 19:48:41 | 显示全部楼层
hpdell 发表于 2020-4-14 13:17
等有空了,也罢我的 LAN8742 驱动更新一下看看哟

8742一样的,加上复位更靠谱。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-4-14 21:58:39 | 显示全部楼层
好文,点赞!
回复

使用道具 举报

609

主题

3045

回帖

4892

积分

至尊会员

积分
4892
发表于 2020-4-15 10:31:24 | 显示全部楼层

貌似下载的 RL-TCPnet v1.10 版本的工程,使用 keil 打不开呀 ??
H7-TOOL_STM32H7_App-master 这个文件
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-4-15 12:42:26 | 显示全部楼层
hpdell 发表于 2020-4-15 10:31
貌似下载的 RL-TCPnet v1.10 版本的工程,使用 keil 打不开呀 ??
H7-TOOL_STM32H7_App-master 这个文 ...

路径不要有中文,防止MDK无法识别。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-6-8 14:48:22 | 显示全部楼层
STM32F407板子如何添加这个驱动啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-8 14:50:27 | 显示全部楼层
1210159064 发表于 2020-6-8 14:48
STM32F407板子如何添加这个驱动啊

这个里面的V5板子就是F407,V6是F429,V7是H743

新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配RTX5和FreeRTOS两版本,更新至第14章(2020-01-19)
http://www.armbbs.cn/forum.php?m ... 5243&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-6-8 14:53:20 | 显示全部楼层
eric2013 发表于 2020-6-8 14:50
这个里面的V5板子就是F407,V6是F429,V7是H743

新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配 ...

一定是要上RTX5 的吗用HAL库的吗?这个驱动根据你之前的RL-TCP教程,库函数版的能不能修改
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-8 14:57:30 | 显示全部楼层
1210159064 发表于 2020-6-8 14:53
一定是要上RTX5 的吗用HAL库的吗?这个驱动根据你之前的RL-TCP教程,库函数版的能不能修改

也可以的,那个是老版RL-TCPnet,老版的话,自己实现吧。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-6-8 14:59:55 | 显示全部楼层
eric2013 发表于 2020-6-8 14:57
也可以的,那个是老版RL-TCPnet,老版的话,自己实现吧。

老版本的驱动在ETH_STM32F4XX.C里面,不知道如何修改啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-8 15:00:34 | 显示全部楼层
1210159064 发表于 2020-6-8 14:59
老版本的驱动在ETH_STM32F4XX.C里面,不知道如何修改啊

尝试修改下,实在搞不定就算了。
这个问题就聊这么多吧,结帖。
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2020-11-12 19:27:54 | 显示全部楼层
#define ETH_PHY_ADDR    0x00     /* Default device address */ 这里最新版的驱动是0x01  
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-11-12 20:36:57 | 显示全部楼层
550185296@qq.co 发表于 2020-11-12 19:27
#define ETH_PHY_ADDR    0x00     /* Default device address */ 这里最新版的驱动是0x01

这个地方要根据自己板子的情况做修改。。。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-5-28 10:53:59 | 显示全部楼层
硬汉大哥,有没有V5或者V6开发板RTX版本的RL-TCPnet例程(LAN8720或者DP83848之类的PHY),因为给出的例程是DM9161的PHY,想尝试移植到其他PHY平台上,比如LAN8720,但是不知道具体步骤。我这边用上面的LAN8720驱动替换后,不知道还需要改些什么,debug卡死在netInitialize()。希望能给出具体PHY移植步骤,或其他PHY例程我自己对比下尝试修改。谢谢啦~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-5-28 10:59:41 | 显示全部楼层
caiheng1991 发表于 2021-5-28 10:53
硬汉大哥,有没有V5或者V6开发板RTX版本的RL-TCPnet例程(LAN8720或者DP83848之类的PHY),因为给出的例程 ...

这个教程的移植章节

新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配RTX5和FreeRTOS两版本,更新至第14章(2020-01-19)
http://www.armbbs.cn/forum.php?m ... 5243&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-5-28 11:04:20 | 显示全部楼层
eric2013 发表于 2021-5-28 10:59
这个教程的移植章节

新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配RTX5和FreeRTOS两版本,更新 ...

好的,谢谢!先学习下!
回复

使用道具 举报

4

主题

11

回帖

28

积分

新手上路

积分
28
发表于 2021-5-29 11:11:53 | 显示全部楼层
eric2013 发表于 2021-5-28 10:59
这个教程的移植章节

新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配RTX5和FreeRTOS两版本,更新 ...


硬汉大哥,我这边用您这个LAN8720文件参照工程移植的程序,在PowerControl这里读取出来的ID是0xFFFF,一直返回不支持器件,串口出来的是:


请问是有什么地方还需要修改吗?我检查了下硬件,PHY_ADDR这一部分配置是OK的啊。谢谢回复~~~



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-5-29 19:11:34 | 显示全部楼层
caiheng19910621 发表于 2021-5-29 11:11
硬汉大哥,我这边用您这个LAN8720文件参照工程移植的程序,在PowerControl这里读取出来的ID是0xFFFF, ...

转到你这个帖子里面交流
http://www.armbbs.cn/forum.php?mod=viewthread&tid=107102
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2021-8-31 15:10:13 | 显示全部楼层
硬汉哥,event recoder如何去掉rtx的信息只看eth的呢,还有我遇到个现象。network显示linkup,但是无法收发数,ping也ping不通,可能是什么原因呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-8-31 17:53:06 | 显示全部楼层
yuanzhongda 发表于 2021-8-31 15:10
硬汉哥,event recoder如何去掉rtx的信息只看eth的呢,还有我遇到个现象。network显示linkup,但是无法收发 ...

可以在RTX的配置向导里面EVR相关的对钩都取消掉
可以考虑上电后延迟一段时间再启动网络试试
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2021-8-31 19:24:37 | 显示全部楼层
eric2013 发表于 2021-8-31 17:53
可以在RTX的配置向导里面EVR相关的对钩都取消掉
可以考虑上电后延迟一段时间再启动网络试试

找到问题,是mpu配置那,按照v7例子配的话,就是有发没收,把这段不使能之后就是几秒钟后不能收也不能发
回复

使用道具 举报

4

主题

166

回帖

178

积分

初级会员

积分
178
发表于 2021-8-31 19:47:46 | 显示全部楼层
eric2013 发表于 2021-8-31 17:53
可以在RTX的配置向导里面EVR相关的对钩都取消掉
可以考虑上电后延迟一段时间再启动网络试试

这个收发指的是rl-tcpnet在keil里面看的,单看中断能收到。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-9-1 08:28:20 | 显示全部楼层
yuanzhongda 发表于 2021-8-31 19:24
找到问题,是mpu配置那,按照v7例子配的话,就是有发没收,把这段不使能之后就是几秒钟后不能收也不能发

以太网描述符的的RAM空间配置下MPU就行。
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-5-13 11:49:31 | 显示全部楼层
请问 这两个文件 ,不管是lwip还是 rl-tcpnet 都通用吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-5-14 09:26:19 | 显示全部楼层
中尴人 发表于 2022-5-13 11:49
请问 这两个文件 ,不管是lwip还是 rl-tcpnet 都通用吗?

是这样的。
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-5-16 17:19:52 | 显示全部楼层
昨天试过了 ,在 PHY_LAN8720.c的  powerControl()里面软复位无效
还是要硬复位才有效
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-5-17 00:12:03 | 显示全部楼层
中尴人 发表于 2022-5-16 17:19
昨天试过了 ,在 PHY_LAN8720.c的  powerControl()里面软复位无效
还是要硬复位才有效

我们TOOL就是用的这个驱动8720,很好用。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 03:59 , Processed in 0.416392 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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