有人在无os下使用DM9000吗?【恢复】
回复数:16,点击数:1074
【楼主位】 zchong
积分:850
派别:
等级:------
来自:中国·南京
最近在ADS下驱动DM9000老是不成功,不知道有没有人在无os下对DM9000操作?
2008-09-25,12:46:09
【1楼】 ql103
积分:84
派别:
等级:------
来自:桂林
最近我也在做DM9000的驱动移植到linux2.6内核,毫无头绪呢!
2008-09-25,21:40:07
【2楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
我在ADS下调试,发现读取ID总是为0x46464646,每次读取的都是DM9000的0x28寄存器内容,不知何故
2008-09-26,12:31:58
【3楼】 xiaoerge
积分:148
派别:
等级:------
来自:
好像DM9000的所有控制寄存器都是按字节访问的,个别数据寄存器可以按16位访问
我在LPC2200下可以收发包,没有继续往下做了
2008-09-26,15:31:43
【4楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
能把驱动发一份吗,3楼的兄弟?
[email protected]
2008-09-26,17:38:43
【5楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
接着等
2008-09-27,12:13:42
【6楼】 zllfdd
积分:349
派别:
等级:------
来自:河南洛阳
uboot中有dm9000的驱动,不知道uboot算不算os。
2008-09-27,12:30:34
【7楼】 xiaoerge
积分:148
派别:
等级:------
来自:
我上网较少,其实这个东西只要初始化没有问题基本上就可以收发数据了,HASH的那几个寄存器随便设的,不太懂
我的板子是LPC2220的
//---------------------------------------------------------
#define DM9000_ADDR 0x82000000
#define DM9000_DATA 0x82000002
#define DM9000Write(add,dat) * ((volatile unsigned short *) DM9000_ADDR) = add; \
* ((volatile unsigned short *) DM9000_DATA) = dat
#define DM9000Read(add,dat) * ((volatile unsigned short *) DM9000_ADDR) = add; \
dat = * ((volatile unsigned short *) DM9000_DATA)
//---------------------------------------------------------
/*******************************************************************/
void DM9000Init (void)
{
unsigned short i;
DM9000Write (0x1F, 0x00); //Power up PHY
DM9000Write (0x00, 0x01); //Insert soft reset
while (1)
{
DM9000Read (0x00, i);
if ((i & 0x01) == 0)
{
break;
}
}
DM9000Write (0x00, 0x00);
DM9000Write (0xFF, 0x81); //Enable SRAM pointor auto return to start address
//-------------------------------------------------------------------
//Initiate phisical address
DM9000Write (0x15, 0x00); //0x10-15 is phisical address
DM9000Write (0x14, 0x03);
DM9000Write (0x13, 0x00);
DM9000Write (0x12, 0x00);
DM9000Write (0x11, 0x00);
DM9000Write (0x10, 0x00);
DM9000Write (0x1D, 0x00);
DM9000Write (0x1C, 0x03);
DM9000Write (0x1B, 0x00);
DM9000Write (0x1A, 0x00);
DM9000Write (0x19, 0x00);
DM9000Write (0x18, 0x00);
DM9000Write (0x17, 0x00);
DM9000Write (0x16, 0x03);
DM9000Write (0x01, 0x2C); //Clear flag
//DM9000Write (0x23, 0x00); //Tx SRAM Read Pointer Address
//DM9000Write (0x22, 0x00);
//DM9000Write (0x25, 0x0C); //Rx SRAM Read Pointer Address
//DM9000Write (0x24, 0x00);
DM9000Write (0x32, 0x03); //Enable receive checksum check
//DM9000Write (0x32, 0x00);
//DM9000Write (0x2E, 0x18);
//DM9000Write (0x2E, 0x00);
DM9000Write (0x05, 0x6F); //Enable receive
DM9000Write (0xFE, 0x3F); //Clear All Interrupt Flag
Dm9000RecvPtr = 0x0C00;
Dm9000TransPtr = 0x00;
}
/*******************************************************************/
unsigned short DM9000PacketRead (unsigned short * ptr)
{
unsigned int i;
unsigned short j;
DM9000Write (0xF4, Dm9000RecvPtr); //Write read address
DM9000Write (0xF5, (Dm9000RecvPtr>> 8)); //Write read address
* ((volatile unsigned short *) DM9000_ADDR) = 0xF0; //Pre-fetch data
i = * ((volatile unsigned short *) DM9000_DATA);
* ((volatile unsigned short *) DM9000_ADDR) = 0xF2;
i = * ((volatile unsigned short *) DM9000_DATA); //Head 0x01 and status
i = * ((volatile unsigned short *) DM9000_DATA); //Byte count
j = i - 4;
Dm9000RecvPtr = Dm9000RecvPtr + i + 4;
i = (i - 3)>> 1; //Sub CRC length, odd byte count include
do
{
* ptr = * ((volatile unsigned short *) DM9000_DATA);
ptr ++;
}
while ((-- i)> 0);
return (j);
}
/*******************************************************************/
2008-09-27,17:25:36
【8楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
to【6楼】 zllfdd :
我的就是从u-boot中提出来的
to【7楼】 xiaoerge :
谢谢了,有读取ID的语句吗?我的程序的汇编我也看了,没发现什么问题,慢慢找原因吧
我的情况是这样的
读取VID和PID时,就是读取DM90000的0x28-0x2B寄存器,我的测试程序为:
id_val = DM9000_ior(DM9000_VIDL);id_val = 0x46
id_val = DM9000_ior(DM9000_VIDH);id_val = 0x46
id_val = DM9000_ior(DM9000_PIDL);id_val = 0x46
id_val = DM9000_ior(DM9000_PIDH);id_val = 0x46
如果这样:
//id_val = DM9000_ior(DM9000_VIDL);
id_val = DM9000_ior(DM9000_VIDH);id_val = 0x0A
id_val = DM9000_ior(DM9000_PIDL);id_val = 0x0A
id_val = DM9000_ior(DM9000_PIDH);id_val = 0x0A
如果这样:
//id_val = DM9000_ior(DM9000_VIDL);
//id_val = DM9000_ior(DM9000_VIDH);
id_val = DM9000_ior(DM9000_PIDL);id_val = 0x00
id_val = DM9000_ior(DM9000_PIDH);id_val = 0x00
还有:
//id_val = DM9000_ior(DM9000_VIDL);
//id_val = DM9000_ior(DM9000_VIDH);
//id_val = DM9000_ior(DM9000_PIDL);
id_val = DM9000_ior(DM9000_PIDH);id_val = 0x90
也就是说第一次读的是正确的,后面读取的数据和前面的都相同,感觉像是某个小地方出现了问题,但是就是查不出来
2008-09-28,08:23:35
【9楼】 stdio
积分:245
派别:
等级:------
来自:深圳
检查一下DM9K的复位电路。RST脚直接连电源有问题。
2008-09-28,09:44:15
【10楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
to 【9楼】 stdio :
谢谢,我再研究研究
2008-09-28,12:14:06
【11楼】 ql103
积分:84
派别:
等级:------
来自:桂林
终于搞定了dm9000驱动在linux2.6上的移植,但是奇怪就是不能ping通自己。
2008-09-28,12:19:07
【12楼】 zchong
积分:850
派别:
等级:------
来自:中国·南京
to 【9楼】 stdio :
我的RST引脚直接接的GND,应该没问题的,硬件应该是没问题的,因为在linux下可以使用。
【11楼】 ql103 :
不知道这位兄台有没有在ADS下测试过DM9000,只要是无操作系统的环境下就行?
2008-09-28,13:10:53
【13楼】 am675
积分:30
派别:
等级:------
来自:cd
找到问题了 是在MMU_Init函数中开启 数据缓存造成的 把MMU_EnableDCache去掉就正常了
具体原理期待高手的解释
本贴被 am675 编辑过,最后修改时间:2009-09-25,16:24:10.
2009-09-25,16:23:42
【14楼】 am675
积分:30
派别:
等级:------
来自:cd
已经找到真正的原因,是在MMU_Init中吧相应的地址段,所对应的cache打开了,这样cpu的读写操作都会在中进行,导致结果一直相同
解决办法是:
在MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for dm9000
把RW_CNB 改为RW_NCNB //cache_off,WR_BUF 以关闭cache
2009-09-25,21:26:34
【17楼】 ep1c3
积分:221
派别:
等级:------
来自:
谢谢楼上的讲解,我碰到同样的问题,解决了
2010-04-25,20:14:00
【18楼】 eworker
积分:460
派别:
等级:------
来自:
不错