stm32F407 调试 LAN8720A ping不通问题解决

7 篇文章 0 订阅
1 篇文章 0 订阅
博主在PCB制作完成后遇到网络通信问题,从硬件到软件进行了详细排查。主要包括:PHY芯片LAN8720A的接地焊盘大小、TCP/IP协议栈LWIP的配置、HR911105A的连接、PHY芯片地址设置以及程序中GPIO错误。最终发现是STM32F407的GPIO配置错误导致无法ping通,修复后成功通信。
摘要由CSDN通过智能技术生成

硬件信息

主控:stm32f407VET6

PHY芯片:LAN8720A

网络变压器:HR91105A 带网口座

TCP/IP 协议栈

LWIP

版图设计

 

PCB制作完成,打样板回来后,发现有几个问题:

  1. HR911105A的 4 脚忘了接。。。应该接到VDDE,此处飞线轻松解决;
  2. LAN8720A的封装用的不太好,芯片背面的焊盘是用来接地的,这也是该芯片唯一接地的地方,而我把这个焊盘画的有点小了,如图:

     

然后拿来野火的例程一通试,因为野火的是stm32F407ZET6,所以网络部分引脚分配和我有一点区别,就是ETH_TX_EN、ETH_TXD0 和 ETH_TXD1。

把这三个引脚改了改:

#define ETH_TX_EN_Pin               GPIO_PIN_11       //B11
#define ETH_TX_EN_GPIO_Port         GPIOB
#define ETH_TXD0_Pin                GPIO_PIN_12       //B12
#define ETH_TXD0_GPIO_Port          GPIOB
#define ETH_TXD1_Pin                GPIO_PIN_13       //B13
#define ETH_TXD1_GPIO_Port          GPIOB 

然后就是连接网线,配置IP,一通ping,结果并不能ping通。

  • 关防火墙,没用
  • 往LAN8720A底下的过孔灌锡,使其可靠接触,没用
  • 此时发现R7 R9两个电阻的阻值有问题,野火推荐是4.7K ,正点原子是10K ,我画成了510R。。。不过是下拉电阻应该没影响,换成4.7K ,没用
  • HR911105A的两个灯的串联电阻阻值不对,我也都画成了510R,可是灯都亮了,能有个毛的影响。
  • 换成正点原子的例程一通试,没用

现在是程序能够跑到 eth init 成功,也能跑到 LinkUP,可是就TMDping不通。

然后就查网上各种帖子,有人说把PHY芯片的地址设为1就可以ping通了,

/* LAN8720_PHY_ADDRESS Address*/ 
#define LAN8720_PHY_ADDRESS          1U

我也试了试,发现无论PHY芯片地址设为几,都能 init 成功,这不扯淡吗?看了看官方手册,人家就是说如果10脚不接,地址默认就为0,设置成0肯定是对的。

这时又发现了我LAN8720A的复位脚没接,OMG,这个到底有没有影响?再查芯片手册。

手册上说,这个脚人家为了防止你犯傻,已经内部上拉了,所以不接它肯定不影响你传输东西!

现在是绿灯常亮,黄灯偶尔闪一下,ping的时候,程序里倒是进了中断,但是就是ping不通。

好吧,再读一下程序,发现:



卧槽,

够坑啊,这他么怎么不用宏,直接写了个GPIOG啊,我100脚VET6哪有GPIOG,果断改成GPIOB,结果直接ping通,哈哈哈 大快人心!

难怪ping不通,能收到但是发不出来肯定不通啊。

然后我再试了试改下PHY芯片地址,改成其他数值都不行,只有0 可以,看来这个LWIP的程序是有点问题的,以后有时间了再仔细考究下。

如果您的OpenStack主机本地ping不通,可能是由于防火墙的设置导致的。您可以按照以下步骤查看防火墙设置: 1. 确认您的主机安装了防火墙软件,例如iptables或firewalld。 2. 检查防火墙是否启用。您可以运行以下命令来检查: 对于iptables: ``` sudo service iptables status ``` 对于firewalld: ``` sudo systemctl status firewalld ``` 3. 如果防火墙已启用,请检查防火墙规则是否允许ping。您可以运行以下命令来检查: 对于iptables: ``` sudo iptables -L INPUT -v -n | grep icmp ``` 对于firewalld: ``` sudo firewall-cmd --list-all | grep icmp ``` 如果没有任何规则允许icmp流量,则需要添加一个规则。例如,对于iptables,您可以运行以下命令: ``` sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT ``` 对于firewalld,您可以运行以下命令: ``` sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="your_source_address" protocol value="icmp" accept' ``` 其中,your_source_address是允许ping的来源IP地址。如果您想允许所有来源的ping,请将其设置为0.0.0.0/0。 4. 检查您的主机是否已经禁用了ping。您可以运行以下命令来检查: ``` sudo sysctl net.ipv4.icmp_echo_ignore_all ``` 如果此设置为1,则表示禁用了ping。您可以通过运行以下命令来启用ping: ``` sudo sysctl -w net.ipv4.icmp_echo_ignore_all=0 ``` 如果您希望在重启后仍然启用ping,则需要编辑/etc/sysctl.conf文件,并将以下行添加到文件末尾: ``` net.ipv4.icmp_echo_ignore_all=0 ``` 请注意,以上步骤中的具体命令可能会因您使用的系统和防火墙软件而有所不同。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值