LwIP无法ping通的问题
我有一块STM32F103ZE-EK板子,尝试在上面跑RT-Thread操作系统,使用默认的LwIP。现在已经可以让STM32认出板子上的DM9000AE了(网口的灯也已经可以亮,通过shell可以读回DM9000AE的ID、IP地址等信息)。板子与PC机通过路由器相连,问题在于:1、将板子的IP、网关、掩码、DNS服务器地址等设置得与路由器上的PC机一样(当然,IP地址不一样),但是PC通过路由器无法ping通板子,可以ping通另一台路由器上的PC;
2、将LwIP设置为DHCP方式,然后将板子接上路由器,无法获取IP地址等(更不用说ping通了);
3、将板子的ip固定成192.168.1.2,PC的ip固定成192.168.1.1,默认网关均为0.0.0.0,掩码255.255.255.0,其他不管,用网线将板子与PC直连,无法ping通,但是网络连接一直显示是连着的,没有“网络连接断开”的提示,也没有寻找网络的提示。
疑问:
1、RT-Thread的默认DM9000的IO地址为0x6C000000,数据地址为0x6C000008;而目标板是0x6C100000和0x6C100008。一开始我没有修改这两个地址,是ping不通的,但是我发现以后修改了地址,还是ping不通(所有的现象都是一样的);
2、是否网口灯可以亮起并闪烁证明网络连接已经建立?因为如果shell里没有读到DM9000AE初始化成功的提示,则网口灯不会亮起闪烁。
3、原理图里看到板子上的DM9000AE中断配置为低有效,这个会有影响吗?
4、如果以上三点疑问都不对的话,请各位指点我一下可能的问题。
谢谢大家花费时间看完这么多字,呵呵,调了一个通宵还是没有任何进展。 感谢任何形式的帮助。 你又是那个包里取的吧? 注意下MAC地址. 有些非法MAC地址路由不让过的.
当时为这个问题困扰了好久.不知道那个包里面改了没有.
1.地址应该可以很好修改.你原来是多少就是多少.改掉就行了.
2.网口灯亮只是说明DM9000A的寄存器基本设置对了.不代表可以通.
既然灯都亮了,说明上面的地址修改没有问题.
3.DM9000A默认中断为高电平触发.你确认你的那个原理图上面改掉了?
比较怀疑你的中断设置得不对.
再不行,你启用 DM9000_DEBUG 吧.把收到和发送的数据都打印出来. 回复【1楼】aozima
-----------------------------------------------------------------------
我把板子上的电阻去掉,这样就让DM9000A工作在高电平触发了。并打开了DM9000_DEBUG宏,还是无法工作。打印的信息如下:
\ | /
- RT - Thread Operating System
/ | \ 0.3.0 build Apr 30 2010
2006 - 2009 Copyright by rt-thread team
dm9000 id: 0x90000a46
finsh>>operating at 100M full duplex mode
dm9000 tx: 350
dm9000 tx: first packet
dm9000 tx done
dm9000 tx: 350
dm9000 tx: second packet
断了一下,是定在
rt_err_t rt_dm9000_tx( rt_device_t dev, struct pbuf* p)
{
...
/* enable dm9000a interrupt */
dm9000_io_write(DM9000_IMR, dm9000_device.imr_all);
/* wait ack */
rt_sem_take(&sem_ack, RT_WAITING_FOREVER); //等不到信号量,所以一直等
DM9000_TRACE("dm9000 tx done\n");
...
}
而释放这个信号量的函数是在DM9000A的中断响应函数中:
/* interrupt service routine */
void rt_dm9000_isr()
{
...
/* One packet sent complete */
rt_sem_release(&sem_ack);
...
}
看来真的是中断的问题,可是中断我已经试过高电平触发和低电平触发了,都是没有反应的,有点困惑。 我试验了一下,将DM9000的EECK管脚设置成高电平触发,或者低电平触发,都可以成功地初始化DM9000,但是打印的信息都是一样,停在等待中断那里。我先试试改MAC地址。 关键还是板子的配置不一样,看看你的硬件然后对照代码仔细看看是什么问题
从你的描述来看,中断部分应该不一样。发送一侧,写了数据包后,发送成功的中断回不来。 中断引脚不同,中断服务函数名及中断引脚也要做对应的修改吧. 回复【4楼】ffxz
-----------------------------------------------------------------------
回复【5楼】aozima
-----------------------------------------------------------------------
谢谢两位,应该是中断问题了,打算晚上再继续奋战。吃饭先。 mark,学习了 回复【6楼】McDeggy 再见,列宁
回复【4楼】ffxz
-----------------------------------------------------------------------
回复【5楼】aozima
-----------------------------------------------------------------------
谢谢两位,应该是中断问题了,打算晚上再继续奋战。吃饭先。
-----------------------------------------------------------------------
有结果了? 楼主的问题解决了么?我也遇到和你一样的问题。。。 回复【8楼】eworker
-----------------------------------------------------------------------
回复【9楼】wunihaoo
-----------------------------------------------------------------------
最后的结果如各位boss所提示的,硬件上中断方式和代码里的中断方式不匹配造成的。修改中断管脚的中断方式后就好了。 我也遇到了同样的问题,打开调试后,信息如下
dm9000 id: 0x90000a46
finsh>>operating at 100M full duplex mode
dm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0022
000 isr: intdm9000 tx: 350
dm9000 tx: first packet
dm9dm9000 isr: int status 0002
000 isr: int
请高手指教 mark,谢谢我也遇到了同样的问题
页:
[1]