OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5059|回复: 7

网络新手人麻了:STM32F401RCT6+DM9000A+LWIP的裸机网络通信,没有FSMC,用的IO模拟驱动;DHCP能被分配IP,但是一直ping不通

[复制链接]

5

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2020-6-17
在线时间
55 小时
发表于 2021-9-4 17:46:20 | 显示全部楼层 |阅读模式
5金钱
STM32F401RCT6+DM9000A+LWIP的裸机网络通信,按着原子STM32F103战舰的LWIP无操作系统移植章节改的,没有FSMC,用的IO模拟驱动;读取DM9000_ID正常,DHCP功能下分配IP成功,但是一直ping不通,显示无法访问主机。附上改的DM9000A源码和电路图,烦请路过的大佬帮忙看看!!
  1. int main(void)
  2. {
  3.         u32 count_time;
  4.         lwip_localtime = 0;
  5.         time_count = 0;
  6.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  7.         delay_init(84);
  8.         LED_Init();
  9.         USART2_Init(115200);
  10.         TIM3_Int_Init(840-1,100-1);                //1ms
  11.         TIM4_Int_Init(840-1,1000-1);                //10ms
  12.        
  13.         my_mem_init(SRAMIN);
  14.         //my_mem_init(SRAMEX);
  15.         while(lwip_comm_init())
  16.         {
  17.                 printf("LWIP_COMM_INIT Failed!\r\n");
  18.         }
  19.        
  20. #if LWIP_DHCP   //ê1óÃDHCP
  21.         while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))
  22.         {
  23.                 lwip_periodic_handle();
  24.                 lwip_pkt_handle();
  25.         }
  26. #endif
  27.        
  28. //        delay_ms(1000);
  29. //        tcp_server_test();

  30.         while(1)
  31.         {               
  32.                 count_time = time_count;
  33.                 lwip_periodic_handle();
  34.                 lwip_pkt_handle();
  35.                 count_time = time_count - count_time;//测试以上两个函数的运行时间,约28ms左右,不知道正常不正常
  36.                 printf("Time Cost: %d\n",count_time);
  37.                 i++;
  38.                 if(i==50)
  39.                 {
  40.                         LINK_LED = ~LINK_LED;
  41.                         i=0;
  42.                 }
  43. }
复制代码

4.png
3.png
2.png
1.png

DM9000.rar

6.57 KB, 下载次数: 20

最佳答案

查看完整内容[请看2#楼]

搞了一两个星期终于能ping通并且长时间不宕机了,说一下改的可能有问题的部分吧 1)刚开始用的DM9000AEP的芯片,把原子例程中断删了,导致ping不通,加上中断部分(软硬件)就能ping通(会进中断函数清除标志位),但是还是会有ping了一会就宕机的情况; 2)怀疑是铺的地平面的问题造成干扰太大才出现的宕机,所以把网口下尤其是差分线附近的地平面,上下层全割了。效果有改善、但是时间长了还是会出现rx error; 3)注意到开发 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2020-6-17
在线时间
55 小时
 楼主| 发表于 2021-9-4 17:46:21 | 显示全部楼层
搞了一两个星期终于能ping通并且长时间不宕机了,说一下改的可能有问题的部分吧
1)刚开始用的DM9000AEP的芯片,把原子例程中断删了,导致ping不通,加上中断部分(软硬件)就能ping通(会进中断函数清除标志位),但是还是会有ping了一会就宕机的情况;
2)怀疑是铺的地平面的问题造成干扰太大才出现的宕机,所以把网口下尤其是差分线附近的地平面,上下层全割了。效果有改善、但是时间长了还是会出现rx error;
3)注意到开发板上用的是DM9000CEP,所以换芯片。换了DM9000CEP之后在程序保留中断部分且硬件也连了中断时,可以ping通但是会宕机(rx error)。然后一次无意的中断飞线断开了
     发现可以ping通且长时间不宕机(36h以上)。(ps:程序中还是保留的中断部分)
4)ping之后加上TCP Server的程序后能稳定ping通不宕机,且与PC(TCP Client)能正常通信。
目前就遇到了上述一些问题,希望对大家也有用!
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-9-6 12:37:12 | 显示全部楼层
帮顶  
回复

使用道具 举报

70

主题

6671

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12230
金钱
12230
注册时间
2012-11-26
在线时间
3644 小时
发表于 2021-9-6 13:10:00 | 显示全部楼层
你mac地址是胡写的,还是算出来的?mac地址得符合一个算式来着
回复

使用道具 举报

5

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2020-6-17
在线时间
55 小时
 楼主| 发表于 2021-9-6 14:30:09 | 显示全部楼层
jermy_z 发表于 2021-9-6 13:10
你mac地址是胡写的,还是算出来的?mac地址得符合一个算式来着
  1.         temp = *(vu32*)(0x1FFF7A10);        //获取stm32的唯一id的前24位做mac地址后三字节
  2.         dm9000cfg.mode = DM9000_AUTO;
  3.         dm9000cfg.queue_packet_len = 0;
  4.         dm9000cfg.imr_all = IMR_PAR|IMR_PRI;
  5.         //初始化mac地址
  6.         printf("STM32_ID:%#x\r\n",temp);
  7.         dm9000cfg.mac_addr[0]=2;
  8.         dm9000cfg.mac_addr[1]=0;
  9.         dm9000cfg.mac_addr[2]=0;
  10.         dm9000cfg.mac_addr[3]=(temp>>16)&0xff;        //低三字节用stm32唯一id
  11.         dm9000cfg.mac_addr[4]=(temp>>8)&0xfff;
  12.         dm9000cfg.mac_addr[5]=temp&0xff;
复制代码



这里用的原子例程里的代码,就是第一行地址改成了stm32f401的ID地址了
回复

使用道具 举报

70

主题

6671

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12230
金钱
12230
注册时间
2012-11-26
在线时间
3644 小时
发表于 2021-9-6 14:32:25 | 显示全部楼层
Jiangji 发表于 2021-9-6 14:30
这里用的原子例程里的代码,就是第一行地址改成了stm32f401的ID地址了

那就是胡写的  你去找个符合规则的MAC填进去试试
学无止境
回复

使用道具 举报

5

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2020-6-17
在线时间
55 小时
 楼主| 发表于 2021-9-6 15:12:06 | 显示全部楼层
jermy_z 发表于 2021-9-6 14:32
那就是胡写的  你去找个符合规则的MAC填进去试试

换了之后也不行;这个原来例程中的方法按理来说开发板上ping通过,应该没有问题
回复

使用道具 举报

5

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2020-6-17
在线时间
55 小时
 楼主| 发表于 2021-9-6 20:09:03 | 显示全部楼层
在初始化之后进行DHCP分配IP时DM9000_Receive_Packet()函数收到的第一个字节(状态rxbyte)=0x01,之后Ping时一直收不到数据(rxbyte=0x00)。看程序每次都进行假读了但是还不行,感觉硬件、程序都没问题,要不然DHCP也不会分配成功,再想会不会是移植的时候哪个协议没考虑到,但这一部分程序文件都是按着例程直接复制的,应该也没问题,人麻了。。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 06:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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