硬件信息
主控:stm32f407VET6
PHY芯片:LAN8720A
网络变压器:HR91105A 带网口座
TCP/IP 协议栈
LWIP
版图设计
PCB制作完成,打样板回来后,发现有几个问题:
- HR911105A的 4 脚忘了接。。。应该接到VDDE,此处飞线轻松解决;
- 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的程序是有点问题的,以后有时间了再仔细考究下。