有人在无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楼的兄弟?
zchongnari@126.com

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
派别:
等级:------
来自:
不错

posted on 2010-07-12 10:22  xilentz  阅读(1202)  评论(0编辑  收藏  举报