嵌入式技术论坛
直播中

贾大林

7年用户 1336经验值
私信 关注
[问答]

STM32F2 LAN8720A可以发送数据却无法接收数据 请问有解决的方法吗

1.环境 使用RT-Studio 创建的标准F2 工程,已经修改了HSE时钟。
RT 版本 : 4.0.3
STM32CubeMX 版本 6.4
编译不通过,提示 重复定义的 PHY_FULL_DUPLEX

修改 PHY_FULL_DUPLEX的名称为 EPHY_FULL_DUPLEX
编译通过,但是不知道为啥

2 phy_reset.c 如下
   #include "board.h"
   #include "drv_common.h"
   #include <rtdevice.h>
   #define RESET_IO GET_PIN(A,3)
   void phy_reset(void){
   rt_pin_write(RESET_IO, PIN_LOW);
   rt_thread_mdelay(50);
   rt_pin_write(RESET_IO, PIN_HIGH);
   }
   int phy_init(void){
   rt_pin_mode(RESET_IO, PIN_MODE_OUTPUT);
   rt_pin_write(RESET_IO, PIN_HIGH);
   return RT_EOK;
   }
   INIT_APP_EXPORT(phy_init);
   开打 #define DRV_DEBUG 日志如下
   [I/sal.skt] Socket Abstraction Layer initialize success.
   msh >[D/drv.emac] Found a phy, address:0x00
   [D/drv.emac] RESET PHY!
   [D/drv.emac] phy basic status reg is 0x7829
   [D/drv.emac] phy control status reg is 0x1058
   [D/drv.emac] link up
   [D/drv.emac] 100Mbps
   [D/drv.emac] full-duplex
   [D/drv.emac] transmit frame length :42
   [D/drv.emac] receive frame faild
   [D/drv.emac] phy basic status reg is 0x782D
   [D/drv.emac] phy control status reg is 0x1058
   [D/drv.emac] phy basic status reg is 0x782D
   定位到

/* Get received frame */
state = HAL_ETH_GetReceivedFrame_IT(&EthHandle);
if (state != HAL_OK)
{
LOG_D("receive frame faild");
return NULL;
}
HAL_ETH_GetReceivedFrame_IT(&EthHandle); 返回了 HAL_ERROR

/* Scan descriptors owned by CPU */
while (((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (descriptorscancounter < ETH_RXBUFNB))
这个条件没有过,

请问有解决的方法么?

芯片是STM32F207ZET6,原理图如下

![1.jpg](//file.elecfans.com/web2/M00/62/EE/pYYBAGL9n_6ALpWdAALjwiDCooY144.jpg)

STM32 F4的寄存器状态

1.jpg

STM32 F2的寄存器状态

1.jpg

2.jpg

STM32F2的 OWM bit 是SET 的状态。其他位好像都是无效的

OWN: Own bit
When set, this bit indicates that the descriptor is owned by the DMA. When this bit is reset, it
indicates that the descriptor is owned by the CPU. The DMA clears this bit either when it
completes the frame transmission or when the buffers allocated in the descriptor are read
completely. The ownership bit of the frame’s first descriptor must be set after all subsequent
descriptors belonging to the same frame have been set.

这个是用STM32 ( 192.168.1.10) ping 电脑主机的IP( 192.168.1.23)

1.jpg

电脑回复了,但是32 一直无法收到

回帖(3)

王平

2022-8-18 10:15:42
rt-thread.map 文件中的ETH dma 地址映射

.bss.DMARxDscrTab
                0x2000245c        0x4 ./drivers/drv_eth.o
.bss.DMATxDscrTab
                0x20002460        0x4 ./drivers/drv_eth.o
.bss.Rx_Buff   0x20002464        0x4 ./drivers/drv_eth.o
.bss.Tx_Buff   0x20002468        0x4 ./drivers/drv_eth.o
.bss.EthHandle
                0x2000246c       0x48 ./drivers/drv_eth.o
.bss.stm32_eth_device
                0x200024b4       0x84 ./drivers/drv_eth.o
@cuphead 这边eth dma 的配置是在哪里看参考资料捏,我怎么看 F4 的eth dma地址映射也差不多的样子?

.bss.DMARxDscrTab
                0x200028d0        0x4 ./drivers/drv_eth.o
.bss.DMATxDscrTab
                0x200028d4        0x4 ./drivers/drv_eth.o
.bss.Rx_Buff   0x200028d8        0x4 ./drivers/drv_eth.o
.bss.Tx_Buff   0x200028dc        0x4 ./drivers/drv_eth.o
.bss.EthHandle
                0x200028e0       0x48 ./drivers/drv_eth.o
.bss.stm32_eth_device
                0x20002928       0x84 ./drivers/drv_eth.o
举报

李丽

2022-8-18 10:16:05
简单一点,OWN为1就说明此时EMAC还没收到包。

可能原因:

包没到PHY,网络接收有问题(协商速率时要用到,可以排除)
包没到EMAC,MII/RMII的接收有问题,如IO配置,映射不对,或虚焊短路。
包到了EMAC但过滤掉了,检查EMAC配置和MAC地址。或是包校验不过。
你板子的IP是静态还是DHCP?如果是DHCP,那第1,2条都可以排除。第3条可以把过滤器那里接收所有包这个位打开,这样所有包都能进来。
举报

贾大林

2022-8-18 10:16:36
IO配置我检查过的,有可能是虚焊短路
静态IP地址 而且板子可以发送给主机
ARP协议的 广播地址 全都是 FF,应该确实没有收到
DHCP是无法获取到地址的,因为接收不到
举报

更多回帖

发帖
×
20
完善资料,
赚取积分