微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 十一 ARM9(2440)的网卡接口扩展

十一 ARM9(2440)的网卡接口扩展

时间:11-27 来源:互联网 点击:

(unsigned char reg)

{

DM_ADDR_PORT = reg;

return DM_DATA_PORT;//将数据从数据端口读出

}
void delay(U32 t)
{
U32 i;
for(;t>0;t--)
{
for(i=0;i<100;i++){}
}
}

void dm_init(void)

{
//int i;
dm_reg_write(DM9000_NCR,3);//1//软件复位DM9000

delay(30);//延时至少20μs

dm_reg_write(DM9000_NCR,0);//清除复位位

dm_reg_write(DM9000_NCR,3);//1//为了确保复位正确,再次复位

delay(30);

dm_reg_write(DM9000_NCR,0);

dm_reg_write(DM9000_GPCR,1);//设置GPIO0为输出
delay(50);
dm_reg_write(DM9000_GPR,0);//激活内部PHY
delay(50);/////////////////////////////////////

dm_reg_write(DM9000_NSR,0x2c);//清TX状态

dm_reg_write(DM9000_ISR,0x3f); //0xf//清中断状态

dm_reg_write(DM9000_RCR,0x39);//设置RX控制

dm_reg_write(DM9000_TCR,0);//设置TX控制

dm_reg_write(DM9000_BPTR,0x3f);

dm_reg_write(DM9000_FCTR,0x3a);

dm_reg_write(DM9000_FCR,0xff);

dm_reg_write(DM9000_SMCR,0x00);

dm_reg_write(DM9000_PAR0,0x00);//设置MAC地址:00-01-02-03-04-05

dm_reg_write(DM9000_PAR1,0x01);

dm_reg_write(DM9000_PAR2,0x02);

dm_reg_write(DM9000_PAR3,0x03);

dm_reg_write(DM9000_PAR4,0x04);

dm_reg_write(DM9000_PAR5,0x05);

dm_reg_write(DM9000_NSR,0x2c);//再次清TX状态

dm_reg_write(DM9000_ISR,0x3f); //0xf//再次清中断状态

dm_reg_write(DM9000_IMR,0x81);//打开接受数据中断

}

void dm_tran_packet(unsigned char *datas, int length)

{

int i;

dm_reg_write(DM9000_IMR, 0x80);//在发送数据过程中禁止网卡中断

dm_reg_write(DM9000_TXPLH, (length>>8) & 0x0ff);//设置发送数据长度

dm_reg_write(DM9000_TXPLL, length & 0x0ff);

DM_ADDR_PORT = DM9000_MWCMD;//发送数据缓存赋予数据端口

//发送数据

for(i=0;i

{

delay(50);

DM_DATA_PORT = datas[i]|(datas[i+1]<8);//8位数据转换为16位数据输出

}

dm_reg_write(DM9000_TCR, 0x01);//把数据发送到以太网上

while((dm_reg_read(DM9000_NSR) & 0x0c) == 0)

;//等待数据发送完成

delay(50);

dm_reg_write(DM9000_NSR, 0x2c);//清除TX状态

dm_reg_write(DM9000_IMR, 0x81);//打开DM9000接收数据中断

}

int dm_rec_packet(unsigned char *datas)

{

unsigned char int_status;

unsigned char rx_ready;

unsigned short rx_status;

unsigned short rx_length;

unsigned short temp;

int i;

int_status = dm_reg_read(DM9000_ISR);//读取ISR

if(int_status & 0x1)//判断是否有数据要接受

{
dm_reg_write(DM9000_ISR,0x01);//清除中断*******************F
rx_ready = dm_reg_read(DM9000_MRCMDX);//先读取一个无效的数据
Uart_Printf("ready1=%dn",rx_ready);

rx_ready = (unsigned char)DM_DATA_PORT;//真正读取到的数据包首字节
Uart_Printf("ready2=%dn",rx_ready);

if(rx_ready == 1)//判读首字节是否为1或0

{

DM_ADDR_PORT = DM9000_MRCMD;//连续读取数据包内容

rx_status = DM_DATA_PORT;//状态字节

rx_length = DM_DATA_PORT;//数据长度

Uart_Printf("nlength=%dn",rx_length);

for(i=0; i//16位数据转换为8位数据存储

{

delay(20);

temp = DM_DATA_PORT;

datas[i] = temp & 0x0ff;

datas[i + 1] = (temp >> 8) & 0x0ff;

}
if((datas[12]==8)&&(datas[13]==6))
{
if((datas[20]==0)&&(datas[21]==1))
Uart_Printf("ARP请求n");
if((datas[20]==0)&&(datas[21]==2))
Uart_Printf("ARP应答n");
for(i=1; i<=rx_length; i++)
{
Uart_Printf("%d",datas[i-1]);
if(i%6==0)
Uart_Printf("n");
}
}

}

}

else if(rx_ready !=0)//停止设备

{

//dm_reg_write(DM9000_IMR,0x80);//停止中断

//dm_reg_write(DM9000_ISR,0x0F);//清中断状态

//dm_reg_write(DM9000_RCR,0x0);//停止接收

//还需要复位系统,这里暂时没有处理

}

dm_reg_write(DM9000_ISR, 0x1);//清中断

return rx_length;

}

void __irq uartISR(void)

{

char ch;

rSUBSRCPND |= 0x1;

rSRCPND |= 0x1<28;

rINTPND |= 0x1<28;

ch=rURXH0;

if(ch == s)

tran=1;//表示发送一个ARP数据请求包


while(!(rUTRSTAT0 & 0x2));
rUTXH0=ch;
//for(i=0;i<100;i++);

}
void __irq DM9000ISR(void)

{


DisableIrq(BIT_EINT4_7);
Uart_Printf("nEINT7 Occuredn");

if(rEINTPEND&(1<7))

{

rEINTPEND = rEINTPEND | (0x1<7);

packet_len = dm_rec_packet(buffer);//接收网卡数据



}

rSRCPND = rSRCPND | (0x1<4);

rINTPND = rINTPND | (0x1<4);


EnableIrq(BIT_EINT4_7);

}

void init()
{
//uart0 port

rGPHCON = 0x00faaa;

rGPHUP= 0x7ff;

rULCON0 = 0x3;

rUCON0 = 0x5;

rUFCON0 = 0;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top