📄 net_main.c
字号:
unsigned int temp;
#endif
NET_Write_Data(0x0000,0x22); //停止DMA传输
//NET_Write_Data(0x0007,0x40); //清楚DMA传输中断
NET_Write_Data(0x000a,m_Len%256); // 设定长度低8位
NET_Write_Data(0x000b,m_Len/256); // 设定长度高8位
NET_Write_Data(0x0008,m_StartAddr%256); // 设定地址低8位
NET_Write_Data(0x0009,m_StartAddr/256); // 设定地址高8位
NET_Write_Data(0x0000,0x12); // 启动DMA写数据命令
#if DMA_DATA_BUF
for(i=0;i<m_Len;i++)
{
if(i&0x01)
{
temp|=(m_Buffer[i]<<8)&0xff00;
P_ext[0x0310]=temp;
}
else
{
temp=m_Buffer[i];
}
}
if((i&0x01)==0)
P_ext[0x0310]=temp;// NET_Write_Data(0x0010,temp);
#else
for(i=0;i<m_Len;i++)
{
NET_Write_Data(0x0010,m_Buffer[i]);
Delay(1);
}
#endif
i=1000000L;
while(i&&(NET_Read_Data(0x0007)&0x40)==0) //等待写数据完成
i--;
NET_Write_Data(0x0000,0x22);
}
void NET_CLEAR_Data(void) //清除8019的原始数据
{
u16 i;
NET_Write_Data(0x0000,0x22); //停止DMA传输
//NET_Write_Data(0x0007,0x40); //清楚DMA传输中断
NET_Write_Data(0x000a,0x00); // 设定长度低8位
NET_Write_Data(0x000b,0x40); // 设定长度高8位
NET_Write_Data(0x0008,0x00); // 设定地址低8位
NET_Write_Data(0x0009,0x40); // 设定地址高8位
NET_Write_Data(0x0000,0x12); // 启动DMA写数据命令
for(i=0;i<0x4000;i++)
{
NET_Write_Data(0x0010,0);
//Delay(1);
}
i=10000;
while(i&&(NET_Read_Data(0x0007)&0x40)==0) //等待写数据完成
i--;
NET_Write_Data(0x0000,0x22);
}
void DMA_Read_Data(u8 *m_Buffer,u16 m_StartAddr,u16 m_Len) //DMA读数据,指定8019地址,指定数据存放地址,指定长度
{
u16 i;
#if DMA_DATA_BUF
u16 temp;
#endif
NET_Write_Data(0x0000,0x22); //停止DMA传输
NET_Write_Data(0x0007,0x40); //清楚DMA传输中断
NET_Write_Data(0x000a,m_Len%256); // 设定长度低8位
NET_Write_Data(0x000b,m_Len/256); // 设定长度高8位
NET_Write_Data(0x0008,m_StartAddr%256); // 设定地址低8位
NET_Write_Data(0x0009,m_StartAddr/256); // 设定地址高8位
NET_Write_Data(0x0000,0x08); //启动DMA读数据命令
#if DMA_DATA_BUF
for(i=0;i<m_Len;i++)
{
if(i&0x01)
{
m_Buffer[i]=(temp>>8)&0xff;
}
else
{
temp=P_ext[0x0310];// NET_Read_Data(0x0010)&0xFFff;
m_Buffer[i]=temp&0x0ff;
}
}
#else
for(i=0;i<m_Len;i++)
m_Buffer[i]=NET_Read_Data(0x0010);
#endif
NET_Write_Data(0x0000,0x22);
}
void NET_Send_Packet(u8 *m_Buffer,u16 m_Len) //发送数据包,数据的起始地址和数据长度
{
u8 H_m_Len,L_m_Len;
m_Len=(m_Len>64)? m_Len:64;
H_m_Len=m_Len>>8;
L_m_Len=m_Len&0xff;
while(NET_Read_Data(0x0000) & 0x04); //等待发包完成
NET_Write_Data(0x0000,0x22); //停止DMA操作,并将寄存器页面设置为0
DMA_Write_Data(m_Buffer,0x4000,m_Len); //写数据到缓冲区
NET_Write_Data(0x0004,0x40); //设置发送数据包的起始页面
NET_Write_Data(0x0005,L_m_Len); //传输字节数的低8位
NET_Write_Data(0x0006,H_m_Len); //传输字节数的高8位
NET_Write_Data(0x0000,0x26); //启动发包命令
while(NET_Read_Data(0x0000) & 0x04); //等待发包完成
}
u16 CR_temp;
/*
void NET_Wait_PACK(void) //等待收到新的数据,并将一个完整的数据包写入Receive_Buffer中,并检出包类型
{
u16 i;
u8 ISR_Data;
u16 PAGE_Data;
//u8 NEW_PACK; //NEW_PACK=1时表示无新的数据,=0时表示有新的数据
u8 DMA_Buffer[ARP_PACK_Len+4]; //新数据的第一次缓冲
unsigned int temp;
u8 Error_cnt=0;
start_Wait:
//NEW_PACK=1;
//while(NEW_PACK) //无新数据时不停的循环
for(;;)
{
ReRead:
SET_PAGE0;
BURY_Data=NET_Read_Data(BURY_Addr);
ISR_Data=NET_Read_Data(0x0007);
NET_Write_Data(0x0007,0);
SET_PAGE1;
CURR_Data=NET_Read_Data(CURR_Addr);
CR_temp=NET_Read_Data(0x00);
if((BURY_Data<0x4c)||(BURY_Data>0x7f)||(CURR_Data<0x4c)||(CURR_Data>0x7f))
{
Error_cnt++;
asm(" nop");
asm(" nop");
asm(" nop");
//if(Error_cnt>5)
{
if((BURY_Data>=0x4c)&&(BURY_Data<=0x7f))
{
//CURR_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1;
CURR_Data=BURY_Data;
SET_PAGE1;
NET_Write_Data(CURR_Addr,CURR_Data);
}
else if((CURR_Data>=0x4c)&&(CURR_Data<=0x7f))
{
//BURY_Data=(CURR_Data==0x4c)? 0x7f:CURR_Data-1;
BURY_Data=CURR_Data;
SET_PAGE0;
NET_Write_Data(BURY_Addr,BURY_Data);
}
else
{
SET_PAGE0;
NET_Write_Data(BURY_Addr,0x4c);
SET_PAGE1;
NET_Write_Data(CURR_Addr,0x4c);
}
}
goto ReRead;
}
else
Error_cnt=0;
//if(((BURY_Data==0x7f)&&(CURR_Data ==0x4c))||((BURY_Data!=0x7f)&&(CURR_Data==BURY_Data+1))) //判断语句表示缓冲区为空时=真
// ;
//else
if(BURY_Data!=CURR_Data) //判断语句表示缓冲区为空时=真
break;
//for(i=0;i<10;i++);
//Delay(100);
}
//printf("收到新的数据包\n");
//printf("BURY_Data=%x\n",BURY_Data);
BURY_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1; //修改BURY_Data
DMA_Read_Data(DMA_Buffer,BURY_Data*256,ARP_PACK_Len+4); //从8019读数据倒DMA_Buffer,长度按ARP包长度计算,如果是IP包,包括IP包的大小
PACK_Type=DMA_Buffer[4+12]*256+DMA_Buffer[4+13]; //数据包类型
asm(" nop");
asm(" nop");
asm(" nop");
if(PACK_Type==PACK_ARP) //如果是ARP数据包,将数据从DMA_Buffer写入Receive_Buffer中
{
for(i=0;i<ARP_PACK_Len;i++)
Receive_Buffer[i]=DMA_Buffer[i+4];
PACK_Len=ARP_PACK_Len;
}
else if(PACK_Type==PACK_IP) //如果是IP包,将IP包指定长度的数据,从8019直接写入倒Receive_Buffer中
{
IP_PACK_Len=DMA_Buffer[4+14+2]*0x100+DMA_Buffer[4+14+2+1]; //读取IP数据包的长度
PACK_Len=IP_PACK_Len+4+14;
//if(length<ARP_PACK_LEN+UIP_LLH_LEN||length>UIP_BUFSIZE) //ygm 如果包长度计算出来的结果是假的
// {
// goto error_pack ; //ygm 跳转到错误包处理程序
// }
// printf("数据包长度 %x \n",PACK_Len);
DMA_Read_Data(Receive_Buffer,BURY_Data*256+4,PACK_Len); //将完整的IP包数据写入Receive_Buffer中
}
else
{
PAGE_Data=1;
}
PAGE_Data=PACK_Len/256; //计算IP包总共占用了多少页,考虑倒下一步的处理,可能要-1
while(PAGE_Data--)
BURY_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1; //计算BURY_Data的值
//printf("最后BURY_Data的值 %x\n\n",BURY_Data);
SET_PAGE0;
NET_Write_Data(BURY_Addr,BURY_Data); //修改BURY寄存器的值
}
*/
void NET_Wait_PACK(void) //等待收到新的数据,并将一个完整的数据包写入Receive_Buffer中,并检出包类型
{
Uint16 i,PAGE_Data;
Uint8 NEW_PACK=1; //NEW_PACK=1时表示无新的数据,=0时表示有新的数据
Uint8 DMA_Buffer[ARP_PACK_Len+4]; //新数据的第一次缓冲
Uint8 ISR_Data;
while(NEW_PACK) //无新数据时不停的循环
{
SET_PAGE0;
BURY_Data=NET_Read_Data(BURY_Addr);
ISR_Data=NET_Read_Data(0x04);
SET_PAGE1;
CURR_Data=NET_Read_Data(CURR_Addr);
if(ISR_Data&0x80)
{
Init_system(); //系统初始化
Init_NET(); //8019初始化
Set_MAC_Addr();
NET_Write_Data(0x0000,0x00);
NET_CLEAR_Data();
continue;
}
if((BURY_Data<0x4c)||(BURY_Data>0x7f)||(CURR_Data<0x4c)||(CURR_Data>0x7f))
{
if((BURY_Data>=0x4c)&&(BURY_Data<=0x7f))
{
//CURR_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1;
CURR_Data=BURY_Data;
SET_PAGE1;
NET_Write_Data(CURR_Addr,CURR_Data);
}
else if((CURR_Data>=0x4c)&&(CURR_Data<=0x7f))
{
//BURY_Data=(CURR_Data==0x4c)? 0x7f:CURR_Data-1;
BURY_Data=CURR_Data;
SET_PAGE0;
NET_Write_Data(BURY_Addr,BURY_Data);
}
else
{
SET_PAGE0;
NET_Write_Data(BURY_Addr,0x4c);
SET_PAGE1;
NET_Write_Data(CURR_Addr,0x4c);
}
}
if(((BURY_Data==0x7f)&&(CURR_Data ==0x4c))||((BURY_Data!=0x7f)&&(CURR_Data==BURY_Data+1))) //判断语句表示缓冲区为空时=真
NEW_PACK=1;
else
NEW_PACK=0;
}
//printf("收到新的数据包\n");
//printf("BURY_Data=%x\n",BURY_Data);
BURY_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1; //修改BURY_Data
DMA_Read_Data(DMA_Buffer,BURY_Data*256,ARP_PACK_Len+4); //从8019读数据倒DMA_Buffer,长度按ARP包长度计算,如果是IP包,包括IP包的大小
PACK_Type=DMA_Buffer[4+12]*256+DMA_Buffer[4+13]; //数据包类型
if(PACK_Type==PACK_ARP) //如果是ARP数据包,将数据从DMA_Buffer写入Receive_Buffer中
for(i=0;i<ARP_PACK_Len;i++)
Receive_Buffer[i]=DMA_Buffer[i+4];
if(PACK_Type==PACK_IP) //如果是IP包,将IP包指定长度的数据,从8019直接写入倒Receive_Buffer中
{
IP_PACK_Len=DMA_Buffer[4+14+2]*0x100+DMA_Buffer[4+14+2+1]; //读取IP数据包的长度
PACK_Len=IP_PACK_Len+4+14;
DMA_Read_Data(Receive_Buffer,BURY_Data*256+4,PACK_Len); //将完整的IP包数据写入Receive_Buffer中
}
PAGE_Data=PACK_Len/256; //计算IP包总共占用了多少页,考虑倒下一步的处理,可能要-1
while(PAGE_Data--)
BURY_Data=(BURY_Data==0x7f)? 0x4c:BURY_Data+1; //计算BURY_Data的值
//}
SET_PAGE0;
NET_Write_Data(BURY_Addr,BURY_Data); //修改BURY寄存器的值
}
u16 m_Data_Compare(u8 *Addr1,u16 Start_Addr1,u8 *Addr2,u16 Start_Addr2,u16 Len) //多个数据判断
{
u16 Type=0; //表示两组数据中,不同数据的个数
u16 i;
for (i=0;i<Len;i++)
if ((Addr1[Start_Addr1+i]&0xff)!=(Addr2[Start_Addr2+i]&0xff))
Type++;
return Type;
}
u16 CHECK_SUM(u8 *Addr,u16 Start_Len,u16 Len) //计算校验和
{
Uint32 Data=0,i;
if(Len==1)
Data+=Addr[Start_Len]*0x100;
else if(Len%2 ==0)
{
for(i=0;i<Len;i+=2)
Data+=Addr[Start_Len+i]*0x100+Addr[Start_Len+i+1];
}
else
{
for(i=0;i<Len-1;i+=2)
Data+=Addr[Start_Len+i]*0x100+Addr[Start_Len+i+1];
Data+=Addr[Start_Len+Len-1]*0x100;
}
Data=(Data/0x10000)+(Data&0xffff);
Data+=Data/0x10000;
return ~Data&0xffff;
//return (0x10000-Data);
}
void Init_Four(void)
{
//reset8019();
//NET_Write_Data(0x18,0x00);//NICRST=0 ;
Delay(1000);
NET_Write_Data(0x00,0x00);//CR=0x00 ;
IO_DELAY ;
NET_Write_Data(0x07,0xff);//ISR=0xff ;
IO_DELAY ;
NET_Write_Data(0x00,0x40);//CR=0x40 ;
IO_DELAY ;
/*
PAR0=UIP_ETHADDR0 ;
PAR1=UIP_ETHADDR1 ;
PAR2=UIP_ETHADDR2 ;
PAR3=UIP_ETHADDR3 ;
PAR4=UIP_ETHADDR4 ;
PAR5=UIP_ETHADDR5 ;
*/
//ext = (unsigned int *)&uip_ethaddr;
NET_Write_Data(0x01,IP_Addr[0]>>8);//PAR0=((*ext)&0xff00)>>8 ;
NET_Write_Data(0x01,IP_Addr[0]>>0);//PAR1=((*ext)&0x00ff) ;
NET_Write_Data(0x01,IP_Addr[1]>>8);//PAR2=((*(ext+1))&0xff00)>>8 ;
NET_Write_Data(0x01,IP_Addr[1]>>0);//PAR3=((*(ext+1))&0x00ff) ;
NET_Write_Data(0x01,IP_Addr[2]>>8);//PAR4=((*(ext+2))&0xff00)>>8 ;
NET_Write_Data(0x01,IP_Addr[2]>>0);//PAR5=((*(ext+2))&0x00ff) ;
NET_Write_Data(0x07,REVPAGE);//CURR=REVPAGE ;
NET_Write_Data(0x08,0);//MAR0=0 ;
NET_Write_Data(0x09,0);//MAR1=0 ;
NET_Write_Data(0x0a,0);//MAR2=0 ;
NET_Write_Data(0x0b,0);//MAR3=0 ;
NET_Write_Data(0x0c,0);//MAR4=0 ;
NET_Write_Data(0x0d,0);//MAR5=0 ;
NET_Write_Data(0x0e,0);//MAR6=0 ;
NET_Write_Data(0x0f,0);//MAR7=0 ;
NET_Write_Data(0x00,0x00);//CR=0x00 ;
IO_DELAY ;
NET_Write_Data(0x0f,0x00);//IMRR=0x01; //change by ygm old is 0x00
IO_DELAY ;
#if DMA_DATA_BUF
NET_Write_Data(0x0e,0xc9);//DCR=0xc9 ;
#else
NET_Write_Data(0x0e,0xc9);//DCR=0xc9 ;
#endif //DMA_DATA_BUF
//important
//7.=1
//6.5 FT1.FT0 =10 FIFO片选位
//4.ARM=0 自动远程初始化 发送数据包,命令不执行 //zw
//3.LS=1 LookBack模式选择,正常模式,不使用LookBack
//2.LSA=0
//1.BOS=0 字节顺序选择(不执行) MS放在DM15-8,LS放在DM7-0,(32XXX,80X86)
//0.WTS=1 字传输选择 宽字节的DMA传输
IO_DELAY ;
NET_Write_Data(0x0d,0xe0);//RTCR=0xe0 ;
//7.6.5=1,
//4.OFST=0 冲突偏移使能 //zw
//3.ATD=0 不使用自动传输
//2.1.LB1,LB0=0 正常操作
//0.CRC=0 CRC较验激活 delay(1);
IO_DELAY ;
NET_Write_Data(0x0c,0xc6);//RCR=0xc6; //change by ygm old is 0xdc
//只接收广播地址和PAR0-5的地址
//7,6 =1;
//5.MON监控模式设置位=0;
//4.PRO=0,目标地址必须与PAR0-5相匹配;//zw
//3.AM=0,数据包有多点传输目标地址 //chang by ygm old is 1
//2.AB=1,数据包是广播数据包
//1.AR=1,数据包长度必须大于64Bytes. //zw //chang by ygm old is 0
//0.SEP=0,收到的数据包没有错误检测。
IO_DELAY ;
NET_Write_Data(0x04,REVPAGE-7);//TPSR=REVPAGE-7 ;
IO_DELAY ;
NET_Write_Data(0x07,0xff);//ISR=0xff ;
//复位中断标志
IO_DELAY ;
NET_Write_Data(0x01,REVPAGE);//PSTART=REVPAGE ;
//4000H-7fffH
IO_DELAY ;
NET_Write_Data(0x02,0x7f);///PSTOP=0x7f ;
IO_DELAY ;
NET_Write_Data(0x03,REVPAGE);//BNRY=REVPAGE ;
IO_DELAY ;
Delay(1000);
NET_Write_Data(0x00,0x22);//CR=0x22 ;
//选择页0寄存器,网卡执行命令。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -