⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_main.c

📁 TI的2812控制交通灯
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 + -