最近在調試DM9000,遇到了很多問題,在網上幾乎也能找到同樣的問題,但是答案千變萬化,弄的我這樣不行,那樣也不行。
1、遇到的第一個問題,網卡不識別,出現的調試信息就是:
dm9000 dm9000.0:??DM9000E read wrong id 0x00000040
dm9000 dm9000.0:??DM9000E read wrong id 0x00000040
dm9000 dm9000.0:??DM9000E read wrong id 0x00000046
dm9000 not found
其中id經常發生變化,常見的有0x00000000或者?0x2b2a2928
這個問題主要在四個方面去查:CMD信號,看看CMD信號是否連接到ADDR2(最好不要給Addr1上連接,驅動修改起來比較困難)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Int信號,看看Int信號是否連接到EINT的管腳,這個可以隨便選擇,選擇完后,需要在驅動里面進行修改,修改之處在:
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7, //外部中斷改這個地方
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
}
從上面可以看到,INT管腳使用的是EINT7,其余地方不用修改
RST信號:在不確定RST信號連接的管腳時,最好直接接到地,這樣比較保險
cs信號:CS的信號可選4個,這個是情況而定,如果選擇了NGCS3,那么在網卡驅動中要做對應的修改,修改之處在:
static struct resource s3c_dm9k_resource[] =
{
[0] =
{
.start = S3C2410_CS3, //網卡連接在CS3總線上 ,總線改這個地方
.end = S3C2410_CS3 + 3,
.flags = IORESOURCE_MEM,
},
[1] =
{
.start = S3C2410_CS3 + 4, //S3C2410_CS3 + 2,
.end = S3C2410_CS3 + 4 + 3, //S3C2410_CS3 + 2 + 3, //addr改這個地方
.flags = IORESOURCE_MEM,
},
這樣,如果芯片焊接的沒問題,那么DM9000在系統啟動的時候就可以發現了,啟動后出現如下的信息,表明DM9000已經發現了:
dm9000 Ethernet Driver, V1.31
*****dm9000.c line 1248 db->addr_res=-1068488320
****dm9000.c line 1285 i=0
***dm9000.c line 1270 db->io_addr=-998113280
***dm9000.c line 1289 db->io_data=-998096892
eth0 (dm9000): not using net_device_ops yet
eth0: dm9000e at c4820000,c4824004 IRQ 52 MAC: 00:4a:00:00:00:00 (chip)
這樣第一個問題就可以解決了,但是有時候DM9000發現了,但是不能通信,就是Ping不通,當插上網線后出現如下的信息:
eth0: ?eth0: link up, 100Mbps, full-duplex, no lpa?
這個問題調試了好長時間,一直以為是驅動問題,網上有人說是6.8K電阻的精度不夠或者PCB的走線有問題等(搞的差點重新繪制電路板了)
經過檢查原來是有個信號在作怪,我在DM9000上掛了一個AT93C46的存儲器,是用來存儲MAC地址的,其實很簡單就是SPI接口,但是就是應為疏忽了這點導致花費了很多功夫。
開始我沒有在EECS信號上加上拉電阻,當系統在運行udhcpc (v1.15.1) started 的時候,就會彈出一大堆的信息,沒有抓下來圖,大概就是Time out之類的信息,然后下次插上網卡后可以識別,但是彈出eth0: ?eth0: link up, 100Mbps, full-duplex, no lpa 。
解決的辦法就是:首先將AT93C46給去掉了,然后就已經可以通信成功,但是MAC地址不能存儲。在EECS信號線上加了4.7K的上拉電阻,焊接上AT93C46就可以通信了,Ping某個IP地址就可成功。
PING 172.20.223.40 (172.20.223.40): 56 data bytes
64 bytes from 172.20.223.40: seq=0 ttl=64 time=2.932 ms
64 bytes from 172.20.223.40: seq=1 ttl=64 time=1.027 ms
64 bytes from 172.20.223.40: seq=2 ttl=64 time=0.894 ms
64 bytes from 172.20.223.40: seq=3 ttl=64 time=0.846 ms
64 bytes from 172.20.223.40: seq=4 ttl=64 time=0.876 ms
64 bytes from 172.20.223.40: seq=5 ttl=64 time=0.896 ms
64 bytes from 172.20.223.40: seq=6 ttl=64 time=0.905 ms
64 bytes from 172.20.223.40: seq=7 ttl=64 time=0.890 ms
64 bytes from 172.20.223.40: seq=8 ttl=64 time=1.454 ms
64 bytes from 172.20.223.40: seq=9 ttl=64 time=0.879 ms
64 bytes from 172.20.223.40: seq=10 ttl=64 time=0.863 ms
64 bytes from 172.20.223.40: seq=11 ttl=64 time=0.808 m
?