天嵌 ARM开发社区

 找回密码
 注册
查看: 5606|回复: 2

关于dm9000a的驱动

[复制链接]
zuiqiang 发表于 2011-1-15 16:49:23 | 显示全部楼层 |阅读模式
我自己写了一个dm9000的裸机程序,ping和打开webserver都没问题,但是用dm9000a的时候发现可以发送数据但接收会出现问题,下面是接收的代码
unsigned int receivepacket(unsigned short maxlen,unsigned char *datas)
{
        unsigned int i,temp;
        unsigned int status, len,a,b;
        unsigned char ready;

        ready = 0;        //希望读取到"01H"
        status = 0;        //数据包状态
        len = 0;         //数据包长度
        //以上为有效数据包前的4个状态字节
        /*
        if(DM_Read_Reg(DM9000_ISR) & 0x01)
        {
                DM_Write_Reg(DM9000_ISR,0x01);//清除接收中断标志位
        }
        */

    temp=DM_Read_Reg(DM9000_MRRL);        //must add this two read,DM9000不需要
           temp=DM_Read_Reg(DM9000_MRRH);

        ready = DM_Read_Reg(DM9000_MRCMDX); // 第一次读取,一般读取到的是 00H
        //设置读取SRAM数据, 内部地址不递增
        //Uart_Printf("The first char is : 0x%x\n",ready);
        if((ready & 0x0ff) != 0x01)
        {
                ready = DM_Read_Reg(DM9000_MRCMDX); // 第二次读取,总能获取到数据
                //Uart_Printf("The Second char is : 0x%x\n",ready);
                if((ready & 0x01) != 0x01)
                {
                        if((ready & 0x01) != 0x00) //若第二次读取到的不是 01H 或 00H ,则表示没有初始化成功
                        {
                                DM_Write_Reg(DM9000_IMR, 0x80);//屏幕网卡中断
                                DM9000_init();//重新初始化
                                udelay(10);
                                DM_Write_Reg(DM9000_IMR, 0x81);//打开网卡中断
                        }
                        //Uart_Printf("I'm out!\n");
                        return 0;
                }
        }
        //以上表示若接收到的第一个字节不是"01H",则表示没有数据包,返回0
        //Uart_Printf("I'm not out!\n");

        DM9000_outb(DM9000_MRCMD,DM9000_IO);//读出来的是接收ram中的前2个字节即前16位
        udelay(20);
        status=DM9000_inw(DM9000_DATA);
        len = DM9000_inw(DM9000_DATA);//第3,4个字节是长度
        Uart_Printf("RX status: 0x%02x RX len: %d\n", status, len);

        if((status&0xbf00)||(len<0x40)||(len>DM9000_PKT_MAX))
        {                                        //出现的错误原因
                if(status & 0x0100)
                Uart_Printf("rx fifo error\n");
                if (status & 0x0200)
                Uart_Printf("rx crc error\n");
                if (status & 0x8000)
                Uart_Printf("rx length error\n");
                if (len > DM9000_PKT_MAX)
                Uart_Printf("rx length too big\n");
               
                DM9000_Reset();
        }
        else                                //接收数据正确
        {
                for(i=0;i<len;i+=2)
                {
                        udelay(20);
                        temp=DM9000_inw(DM9000_DATA);
                        datas[i] = temp & 0x0ff;
                        datas[i + 1] = (temp >>8) & 0x0ff;
                }
               
        }
       
        //以上接收数据包,注意的地方与发送数据包的地方相同

        return len;
}
运行后会出现以下信息
RX status: 0x4001 RX len: 64
RX status: 0xffff RX len: 65535
rx fifo error
rx crc error
rx length error
rx length too big
网上说,dm9000a的接收程序要在开始时读取MRRL和MRRH这2个寄存器,可是我写了也不成功,谁能帮帮我?
TQ_guoxixiao 发表于 2012-5-10 11:42:31 | 显示全部楼层
参考我们的uboot源码
simple_do 发表于 2015-10-28 16:49:09 | 显示全部楼层
楼主威武,研究DM9000中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-18 12:33 , Processed in 1.046888 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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