|
我自己写了一个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个寄存器,可是我写了也不成功,谁能帮帮我? |
|