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

📄 net_main.c

📁 TI的2812控制交通灯
💻 C
📖 第 1 页 / 共 2 页
字号:
//#include "excalibur.h"

//#include <stdio.h>
#include "net_main.h"
#include "net_arp.c"   //ARP处理程序
#include "net_ping.c"  //Ping回应处理程序
#include "net_head.c"  //首部处理程序
#include "net_tcp.c"   //tcp处理程序
#include "net_http.c"  //http应用处理程序

#include "F2812_DataType.h"
#include "F2812_Reg.h"

#define DMA_DATA_BUF 0//1  0:8Bit  1:16Bit

//#include "DSP281x_Device.h"     // DSP281x Headerfile Include File


//extern unsigned int *P_ext;
//#define NET_Write_Data(m_Addr,m_Data) 	P_ext[m_Addr+0x0300]=m_Data
//#define NET_Read_Data(m_Addr)					(P_ext[m_Addr+0x0300]&0xff)

#define REVPAGE	0x4c
unsigned int tapdev_read(void);    //ygm 返回一个包的长度
extern void Init_Four();
extern void ClearGpio(void);
extern void SetGpio(void);

int net_main(void)
{
   //UINT i=0;
   //UINT Coun_PACK=0;
   
   //ClearGpio();
   //SetGpio();
   Init_system();  //系统初始化
   Init_NET();  //8019初始化
   //Init_Four();
   Set_MAC_Addr();
   //NET_CLEAR_Data();  //清除8019的原始数据
   //SET_PAGE0;  //停止8019的DMA操作,页面设置为0
   NET_Write_Data(0x0000,0x00);
   NET_CLEAR_Data();
   //printf("RTL8019AS ID0 is 0x%x\n",NET_ID(0)&0xff);  //8019的ID
   //printf("RTL8019AS ID1 is 0x%x\n",NET_ID(1)&0xff);

   //NET_Send_Packet(TEST_ARP,sizeof(TEST_ARP));  //发送地址解析协议包

   //printf("%d\n",sizeof(html_header));
   //printf("%s\n",html_header);




   //printf("复位完成,等待接收数据包\n");


   while(1)
   {
      NET_Wait_PACK();  //等待收到新的数据
      
      //while(tapdev_read())
      /*
      for(;;)
      {
      	if(tapdev_read())
      	{
      		asm("	nop");
      		break;
      	}
      	Delay(10000);
      	Delay(10000);
      	Delay(10000);
      }
	  asm("	nop");
      */
      asm("	nop");
      
      if (PACK_Type==PACK_ARP)  //ARP协议包
         if(m_Data_Compare(Receive_Buffer,14+28-4,IP_Addr,0,4)==0)  //目标地址是本地
         {
            //printf("收到ARP包\n");
            IP_ARP();   //返回ARP包
         }

      if (PACK_Type==PACK_IP)  //IP协议包
         if(m_Data_Compare(Receive_Buffer,0,MAC_Addr,0,6)==0)  //目标MAC地址是本地
         {
            SaveAdd();
            
            //printf("IP协议包\n");
            if(Receive_Buffer[14+9]==1)  //ICMP协议包
            {
               //printf("ICMP协议包\n");
               if(Receive_Buffer[14+20+0]==8)  //ICMP的请求回显(Ping请求)
               {
                  //printf("ICMP的请求回显(Ping请求)数据包\n");
                  Revert_Ping();
               }
            }
            if(Receive_Buffer[14+9]==6)  //TCP协议数据包
            {
               //printf("收到TCP协议数据包\n");
               IP_TCP();
            }
         }
   }
}

#define IO_DELAY Delay(10)

unsigned int tapdev_read(void)    //ygm 返回一个包的长度
{
    u16 i,length,nextpage,bury,temp ;
	u8 DMA_Buffer[ARP_PACK_Len+4];  //新数据的第一次缓冲
	
    NET_Write_Data(0x0000,0x00);//CR=0x00 ;
    IO_DELAY ;
    temp=NET_Read_Data(0x0007); //ISR ;
    IO_DELAY ;
    bury=NET_Read_Data(0x0003); //LOW(BNRY);    //ygm 读取8019的bury寄存器
    IO_DELAY ;
    NET_Write_Data(0x0000,0x40);// CR=0x40 ;
    IO_DELAY ;
    nextpage=NET_Read_Data(0x07);// LOW(CURR);   //ygm 读取8019的curr寄存器
    IO_DELAY ;

    if(bury!=nextpage )  //ygm 如果有新的包收到,通过判断寄存器得到这个信息
    {
        if ( nextpage >= 0x80 || nextpage < REVPAGE)
        {
            temp=((bury-REVPAGE)+1)%(0x80-REVPAGE)+REVPAGE ;
	        NET_Write_Data(0x0000,0); //CR=0x00 ;
	        IO_DELAY ;
	        NET_Write_Data(0x0003,temp);//BNRY=temp ;
	        IO_DELAY ;
	        NET_Write_Data(0x0000,0x40);//CR=0x40 ;
    		IO_DELAY ;
	        NET_Write_Data(0x0007,temp);//CURR=temp ;
	        NET_Write_Data(0x0000,0x22);//CR=0x22 ;
	        return 0 ;
        }

        //DMA_Read_Data(uip_buf,(bury<<8)+4,ARP_PACK_LEN+UIP_LLH_LEN);
        DMA_Read_Data(DMA_Buffer,BURY_Data*256,ARP_PACK_Len+4);
		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];
			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((PACK_Len<(32+14))||(PACK_Len>sizeof(Receive_Buffer)))  //ygm 如果包长度计算出来的结果是假的
            {
                goto error_pack ;  //ygm 跳转到错误包处理程序
            }			
			DMA_Read_Data(Receive_Buffer,BURY_Data*256+4,PACK_Len);    //将完整的IP包数据写入Receive_Buffer中
		}
        else //ygm 如果包类型不是 0800 也不是 0806
        {
			error_pack :  //ygm 错误包处理程序
			//DMA_Read_Data(uip_buf, ( bury <<8 ) , 128 );
			NET_Write_Data(0x0000,0x00);//CR=0x00 ;
			IO_DELAY ;
			bury=NET_Read_Data(0x000c);//LOW(RSR);
			IO_DELAY ;
			NET_Write_Data(0x0003,nextpage);//BNRY=nextpage ;
			IO_DELAY ;
			NET_Write_Data(0x0003,0x22);//CR=0x22 ;
			return 0 ;  //ygm 修复8019寄存器,并返回0
        }

        temp=((length/256)+(bury-REVPAGE)+1)%(0x80-REVPAGE)+REVPAGE ;
        NET_Write_Data(0x0000,0x00);//CR=0x00 ;
        IO_DELAY ;
        NET_Write_Data(0x0003,temp);//BNRY=temp ;
        IO_DELAY ;
        NET_Write_Data(0x0000,0x22);//CR=0x22 ;
        return length ;  //ygm 读取包后,修改寄存器值,并返回包长度
    }
    else   //ygm 如果没有收到新的数据包
    {
        if((temp&0x90)==0x90)
        {
            //DMA_Read_Data(uip_buf,REVPAGE<<8,UIP_BUFSIZE);
            DMA_Read_Data(Receive_Buffer,REVPAGE*256,sizeof(Receive_Buffer));    //将完整的IP包数据写入Receive_Buffer中
        }
        NET_Write_Data(0x0000,0x00); //CR=0x00 ;
        IO_DELAY ;
        bury=NET_Read_Data(0x000c);//LOW(RSR);
        IO_DELAY ;
        NET_Write_Data(0x0007,0xff);//ISR=0xff ;
        IO_DELAY ;
        NET_Write_Data(0x0000,0x22);//CR=0x22 ;
        return 0 ;  //ygm 判断8019状态,并修改一下寄存器置,返回0
    }
}



void Delay(u16 m_Delay)  //延时子程序
{
   while(m_Delay--);
}



void NET_Write_Data(u16 m_Addr,u8 m_Data)  //8019写一个数据的时序
{
   Delay(2);
   P_ext[0x0300+m_Addr]=m_Data&0xff;
   Delay(2);
}



u8 NET_Read_Data(u16 m_Addr)     //8019读一个数据的时序
{
   u8 m_Data;
   Delay(2);
   m_Data=(P_ext[0x0300+m_Addr]&0xff);
   //return 0;
   Delay(2);
   return m_Data;
}


void NET_Page_Set(u16 m_Page)      //设定当前页面
{
//页面寄存器 任何页 00单元(CR) 7,6位(PS1,PS0)  另 2位为‘0’
   u16 Temp;
   Temp=NET_Read_Data(0x0000);
   Temp=Temp&0x003B;                //注意不是0x3F ,TXP位在平时一定要置为0.
   m_Page=m_Page<<6;
   Temp=Temp|m_Page;
   NET_Write_Data(0x0000,Temp);
}

u16 NET_ID(u8 m_Num)        //获得8019的ID
{
//ID号在0页的,0x0A和0x0B两个单元 (8019ID0,8019ID1)这两个地址的读和写不是同一个寄存器
   u16 m_ID;
   NET_Page_Set(0);
   //NET_Write_Data(0x0000,0x22);    //start command;remote DMA
   m_ID=NET_Read_Data(0x000a+m_Num);
   return m_ID;
}

void Set_MAC_Addr(void)  //设置8019网卡MAC地址
{
//MAC地址寄存器在页面2,0x01~06 (PAR0-PAR5)
   u16 i;
   NET_Page_Set(1);
   for(i=0;i<6;i++)
      NET_Write_Data(i+1,MAC_Addr[i]);
}

/*
void Read_Phy_ID(void)     //获得网卡物理地址  该程序可能有点问题
{
//
   u8 i;
//   u8 Temp;
   NET_Page_Set(0);
   NET_Write_Data(0x0008,0x00);//RSAR0 dma read lowaddress=0;
   NET_Write_Data(0x0009,0x00);//RSAR1 dma read highaddress=0
   NET_Write_Data(0x000a,12);  //RBCR0 count low
   NET_Write_Data(0x000b,0x00);//RBCR1 read count high
   NET_Write_Data(0x0000,0x0a);//dma read and start
   //printf("\nPhysical Adress is:");
   for (i=0;i<6;i++)
   {
      Temp=NET_Read_Data(0x0010+i);//读取一个字节
      if(i<5)
         ;//printf("%x-",Temp);
      else
         ;//printf("%x\n",Temp);
      Temp=NET_Read_Data(0x0010+i);//读取一个重复的字节,这个字节被丢弃
   }
}
*/


void NET_Hard_Reset(void)      //8019硬复位
{
   u16 Temp;
//通过对8019的复位Pin的控制来达到硬件复位的效果
   /*
   na_NET_RST->np_piodata=1;   //8019模块复位
   printf("等待复位过程完成,时间5秒\n");
   nr_delay(5000);
   na_NET_RST->np_piodata=0;   //8019模块复位结束
   */
   SetGpio();   
   for(Temp=0;Temp<1000;Temp++)
   	Delay(1000);
   ClearGpio();
}


void NET_Soft_Reset(void)      //8019软复位
{
//对复位地址写任意数据达到复位结果
//复位地址是任何页面的,0x18~0x1f单元
   u16 Temp;
   //Temp=NET_Read_Data(0x001f);  //1F 是 Reset Port
   //NET_Write_Data(0x001f,Temp);
   Temp=NET_Read_Data(0x001f);  //1F 是 Reset Port
   NET_Write_Data(0x001f,Temp);
   //nr_delay(100);
   for(Temp=0;Temp<1000;Temp++)
   	Delay(1000);
}

/*
void NET_INT_ISR(int context)  //中断服务子程序
{
   DISABLE;
   na_NET_INT->np_pioedgecapture=0;    //清除中断标志
   printf("Interrupt!!\n");
   ENABLE;
}
*/


void Init_system(void)   //系统初始化
{
   /*
   na_NET_AEN->np_piodata=1;   //8019模块无效
   na_NET_WR->np_piodata=1;    //读、写信号无效
   na_NET_RD->np_piodata=1;
   */
   //NET_Hard_Reset();    //硬件复位
   NET_Soft_Reset();    //软件复位
   /*
   nr_installuserisr(na_NET_INT_irq,NET_INT_ISR,0);   //分配中断服务程序
   na_NET_INT->np_piodirection=0;
   na_NET_INT->np_pioedgecapture=0;
   ENABLE;
   */
}

/*
void Init_NET(void)  //8019初始化
{
   NET_Write_Data(0x0000,0x21);  //选择页0的寄存器,网卡停止运行,因为还没有初始化。TXP=0
   				 //TXP在发送数据包时必须设置,当发送完毕或发送失败时会自动复位。为0时是没有发送。
   				 //STA=0,STP=1,stop command.
   NET_Write_Data(0x0001,0x4c);  //寄存器Pstart 页面开始寄存器,设置为接收缓冲器的起始地址
   NET_Write_Data(0x0002,0x80);//0x7f);//0x80);  //Pstop  页面停止寄存器,设置为接收缓冲器的停止地址,一般使用8位时不超过60,使用16位时不超过80
   NET_Write_Data(0x0003,0x4c);  //BURY   边界寄存器,存放host读过的最后一个buffer的起始地址。 原有数据时0x4c
   NET_Write_Data(0x0004,0x45);//0x4c-7);//0x45);  //TPSR  发送页面起始地址,存放发送数据包的起始页面地址。
   NET_Write_Data(0x0007,0xff);  //ISR  清除中断标志位
   NET_Write_Data(0x000c,0xff);//0xc6);//0xde);  //RCR   接收结构寄存器  原来时CC
   				 //7,6 =1;
   				 //5.MON监控模式设置位=0;
   				 //4.PRO=0,目标地址必须与PAR0-5相匹配;
   				 //3.AM=1,数据包有多点传输目标地址
   				 //2.AB=1,数据包是广播数据包
   				 //1.AR=0,数据包长度必须大于64Bytes.
   				 //0.SEP=0,收到的数据包没有错误检测。

   NET_Write_Data(0x000d,0xe0);  //TCR 发送结构寄存器。
   				 //7.6.5=1,
   				 //4.OFST=0 冲突偏移使能
   				 //3.ATD=0 不使用自动传输
   				 //2.1.LB1,LB0=0 正常操作
   				 //0.CRC=0 CRC较验激活
   #if DMA_DATA_BUF
   NET_Write_Data(0x000e,0xc9);//0xc8);  //DCR 数据配置寄存器 8位数据dma
   #else
   NET_Write_Data(0x000e,0xc8);//0xc8);  //DCR 数据配置寄存器 8位数据dma   
   #endif
   				 //7.=1
   				 //6.5 FT1.FT0 =10 FIFO片选位
   				 //4.ARM=0 自动远程初始化 发送数据包,命令不执行
   				 //3.LS=1 LookBack模式选择,正常模式,不使用LookBack
   				 //2.LSA=0
   				 //1.BOS=0 字节顺序选择(不执行) MS放在DM15-8,LS放在DM7-0,(32XXX,80X86)
   				 //0.WTS=0 字传输选择 宽字节的DMA传输

   NET_Write_Data(0x000f,0x00);  //IMR  屏蔽所有中断
   NET_Page_Set(1);              //选择页1的寄存器
   NET_Write_Data(0x0005,0x55);   //PAR4
   NET_Write_Data(0x0007,0x4c);//0x4d);   //CURR  设置当前页面寄存器。 原来数据时0x4d
   NET_Write_Data(0x0008,0x00);   //MAR0
   NET_Write_Data(0x0009,0x41);//0x00);//0x41);   //MAR1
   NET_Write_Data(0x000a,0xaa);//0x00);//0xaa);   //MAR2
   NET_Write_Data(0x000b,0x80);//0x00);//0x80);   //MAR3
   NET_Write_Data(0x000c,0x00);   //MAR4
   NET_Write_Data(0x000d,0x00);   //MAR5
   NET_Write_Data(0x000e,0x00);   //MAR6
   NET_Write_Data(0x000f,0x00);   //MAR7
   NET_Write_Data(0x0000,0x22);   //选择页0寄存器,网卡执行命令,停止DMA传输。
}
*/
void Init_NET(void)  //8019初始化
{
   NET_Write_Data(0x0000,0x21);  //选择页0的寄存器,网卡停止运行,因为还没有初始化。TXP=0
   				 //TXP在发送数据包时必须设置,当发送完毕或发送失败时会自动复位。为0时是没有发送。
   				 //STA=0,STP=1,stop command.
   NET_Write_Data(0x0001,0x4c);  //寄存器Pstart 页面开始寄存器,设置为接收缓冲器的起始地址
   NET_Write_Data(0x0002,0x80);  //Pstop  页面停止寄存器,设置为接收缓冲器的停止地址,一般使用8位时不超过60,使用16位时不超过80
   NET_Write_Data(0x0003,0x4c);  //BURY   边界寄存器,存放host读过的最后一个buffer的起始地址。 原有数据时0x4c
   NET_Write_Data(0x0004,0x45);  //TPSR  发送页面起始地址,存放发送数据包的起始页面地址。
   NET_Write_Data(0x0007,0xff);  //ISR  清除中断标志位
   NET_Write_Data(0x000c,0xde);  //RCR   接收结构寄存器  原来时CC
   				 //7,6 =1;
   				 //5.MON监控模式设置位=0;
   				 //4.PRO=0,目标地址必须与PAR0-5相匹配;
   				 //3.AM=1,数据包有多点传输目标地址
   				 //2.AB=1,数据包是广播数据包
   				 //1.AR=0,数据包长度必须大于64Bytes.
   				 //0.SEP=0,收到的数据包没有错误检测。

   NET_Write_Data(0x000d,0xe0);  //TCR 发送结构寄存器。
   				 //7.6.5=1,
   				 //4.OFST=0 冲突偏移使能
   				 //3.ATD=0 不使用自动传输
   				 //2.1.LB1,LB0=0 正常操作
   				 //0.CRC=0 CRC较验激活

   NET_Write_Data(0x000e,0xc8);  //DCR 数据配置寄存器 8位数据dma
   				 //7.=1
   				 //6.5 FT1.FT0 =10 FIFO片选位
   				 //4.ARM=0 自动远程初始化 发送数据包,命令不执行
   				 //3.LS=1 LookBack模式选择,正常模式,不使用LookBack
   				 //2.LSA=0
   				 //1.BOS=0 字节顺序选择(不执行) MS放在DM15-8,LS放在DM7-0,(32XXX,80X86)
   				 //0.WTS=0 字传输选择 宽字节的DMA传输

   NET_Write_Data(0x000f,0x00);  //IMR  屏蔽所有中断
   NET_Page_Set(1);              //选择页1的寄存器
   NET_Write_Data(0x0005,0x55);   //PAR4
   NET_Write_Data(0x0007,0x4d);   //CURR  设置当前页面寄存器。 原来数据时0x4d
   NET_Write_Data(0x0008,0x00);   //MAR0
   NET_Write_Data(0x0009,0x41);   //MAR1
   NET_Write_Data(0x000a,0xaa);   //MAR2
   NET_Write_Data(0x000b,0x80);   //MAR3
   NET_Write_Data(0x000c,0x00);   //MAR4
   NET_Write_Data(0x000d,0x00);   //MAR5
   NET_Write_Data(0x000e,0x00);   //MAR6
   NET_Write_Data(0x000f,0x00);   //MAR7
   NET_Write_Data(0x0000,0x22);   //选择页0寄存器,网卡执行命令,停止DMA传输。
}



void DMA_Write_Data(u8 *m_Buffer,u16 m_StartAddr,u16 m_Len)   //DMA写数据,指定数据,指定8019存储地址,指定长度
{
   u32 i;
   #if DMA_DATA_BUF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -