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

📄 main.c

📁 嵌入式TCP/IP模块
💻 C
📖 第 1 页 / 共 2 页
字号:
    j=sizeof(mynetp);
    j-=6;             //减去MAC
    p=&mynetp.myip[0];
    ReadEEprom(Temp,NETPARAMETER,16);
    for(i=0;i<16;i++)
         *p++=Temp[i]; 
    ReadEEprom(&Temp[16],(NETPARAMETER+16),(j-16));
    for(i=16;i<j;i++)
         *p++=Temp[i];
         
    My_ip[0]=mynetp.myip[0];      
    My_ip[1]=mynetp.myip[1];     
    My_ip[2]=mynetp.myip[2];     
    My_ip[3]=mynetp.myip[3];   
    MyServerPort=mynetp.myport;
        
    GateWayIP[0]=mynetp.gateway[0];
    GateWayIP[1]=mynetp.gateway[1];
    GateWayIP[2]=mynetp.gateway[2];
    GateWayIP[3]=mynetp.gateway[3];

    SubIPMark[0]=mynetp.submark[0];
    SubIPMark[1]=mynetp.submark[1];
    SubIPMark[2]=mynetp.submark[2];
    SubIPMark[3]=mynetp.submark[3];
    
    RemoteServerIP[0]=mynetp.remoteip[0];//远端服务器ip
    RemoteServerIP[1]=mynetp.remoteip[1];    
    RemoteServerIP[2]=mynetp.remoteip[2];
    RemoteServerIP[3]=mynetp.remoteip[3];  
    RemoteServerPort=mynetp.remoteport; //远端服务器端口号
    
    WorkMode=mynetp.workmode;
    
    set.baudrate=mynetp.baudrate;
    set.datab=mynetp.bit;
    set.stopb=mynetp.stopbit;
    set.parity=mynetp.parity;
    
    if(WorkMode==CLIENTHOST)            //客户端状态为关
         TcpStatus[0].State=TCP_STATE_CLOSED;                
    if(Testwritep()==FALSE)   //设置状态
    {
         My_ip[0]=192;
         My_ip[1]=168;
         My_ip[2]=1;
         My_ip[3]=100;         
         MyServerPort=80;
                  
         GateWayIP[0]=192;    
         GateWayIP[1]=168;    
         GateWayIP[2]=1;    
         GateWayIP[3]=1;  
         
         SubIPMark[0]=255; 
         SubIPMark[1]=255; 
         SubIPMark[2]=255; 
         SubIPMark[3]=0;   
              
	     WorkMode=SERVERHOST;
	     TcpStatus[0].State=TCP_STATE_LISTEN;                             
    }       
         

         
         
         
            
}
/****************************************************/
void InitializeInterrupt (void)
{

      IRQDisable();
 //     PINSEL0=PINSEL0|0x0000C000;   // extern interrupt 2 
      
  //    EXTMODE=EXTMODE|0X04;         //edge interrupt
  //    EXTPOLAR=EXTPOLAR|0X04;       //falling interrupt
      
  /*    VICIntSelect=0x00000000;      
 //     VICVectCntl0=0x30;            //exit2 assigned control 0    
 //     VICVectAddr0=(int)IRQ_Eint2;
 //     EXTINT=0x04;
      
   //   VICIntEnable=0x10000;*/
         
      //set.datab  = 8;
      //set.stopb  = 1;
      //set.parity = 0;
      UART0_Init(set.baudrate);			// 串口初始化

      U0FCR = 0xC1;						// 使能FIFO,并设置触发点为14字节
      U0IER = 0x03;						// 允许RBR中断,即接收中断 
 
      VICIntSelect=0x00;                //select FIQ 0r IRQ 
 
      VICVectCntl1=0x20|0x06;
      VICVectAddr1=(uint32)IRQ_UART0;
      VICIntEnable=(1<<6);             //UART0中断允许

      VICVectCntl0 = (0x20 | 0x04);   
      VICVectAddr0 = (int32)Timer0_Handler;
      VICIntEnable = VICIntEnable|(1 << 4);//Timer0中断允许
      
      T0IR = 0xffffffff;
      T0TC = 0;
      T0TCR = 0x01;
      T0MCR = 0x03;
      T0MR0 = (Fpclk / 200);
      
      IRQEnable();      
      
      
}
/***************************************************/
uint8 InitializeClient (void)
{
        uint8 i=0;
        SOCKET	s; 
        struct sockaddr servaddr;		

		servaddr.sin_family=0;
		servaddr.sin_addr[0]=RemoteServerIP[0];
		servaddr.sin_addr[1]=RemoteServerIP[1];
		servaddr.sin_addr[2]=RemoteServerIP[2];
		servaddr.sin_addr[3]=RemoteServerIP[3];
		servaddr.sin_port=RemoteServerPort;		
		
		s=*socket( 0, 0, 0);       //本地ip及端口
	
		i=connect((SOCKET * )&s, (struct sockaddr*)&servaddr,0);		
		return(i);
		
}



/**************************************************************/
void Delayms(uint8 T)
{
 uint16 i;
 for(;T>0;T--)
    for(i=0;i<5750;i++);
}
/**************************************************
void __irq IRQ_Eint2 (void)
{
     int8  i;
     i=Rec_Packet();
     if(i!=0)
        NICREFLAG=i;        //缓冲区用的块数
     else
        NICREFLAG=0;
     EXTINT=0X04;
     VICVectAddr=0x00;      //vector Interrupt finish
}*/
//==========================================================================================================
/*********************************************************/
void __irq Timer0_Handler(void)   //5毫秒中断
{
    static uint8 t;
    T0IR = 0x01;
    
    t++;
    LastData.RepeatTimer++;          //重发时间计数     
    ConTimer++;   
    if(ReTimeroutf==1)        //RS232 接受标记
    {
         ReTimerout++;
         if(ReTimerout>=5)      //15ms<=ReTimerout<=20ms
         {
	         uart0.ReLength=uart0.ReIndex;
	         uart0.ReIndex=0x00;               
	         uart0.ReFinished=1;  
	         ReTimerout=0;       
             ReTimeroutf=0;    
         }       
    }  
    if(t>=200)
    {
        t=0;
        Second++;           
    } 
     
    VICVectAddr = 0;            // 通知中断控制器中断结束
}




//========================================================================================================
/*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
	uint8 i,j;
	
	while(((j=U0IIR)&0x01)==0)
	{
	    switch(j&0x0e)
	    {
	          case 0x02:
	               if(uart0.SendLength==0x00)
	                   break;
	               for(i=0;i<14;i++)
	               {
                       uart0.SendIndex++;	
                       uart0.SendLength--;    
                       if(uart0.SendLength==0x00) 
                           break;                                                                     
                       U0THR=uart0.SendBuf[uart0.SendIndex];                                                                               	                      
	               }  
	               break;                  
                   case 0x04:
                       for(i=0;i<14;i++)
                       {
	                       uart0.ReBuf[uart0.ReIndex]=U0RBR;      //读UART0 FIFO	的数据
	                       uart0.ReIndex++;
                            	                   
	                   } 
	                   ReTimerout=0;     //重新计时,如果15毫秒以后没收到数据就发送
	                   ReTimeroutf=1;           	               
	                   break;	               
	               case 0x06:
	              // i=U0LSR;
	                   break;
	               
	               case 0x0c:
	                    while((U0LSR&0x01)==0x01)
	                    {
	                         uart0.ReBuf[uart0.ReIndex]=U0RBR;
	                         uart0.ReIndex++;
	                    }
	                    ReTimerout=0;     //重新计时
	                    ReTimeroutf=0;
	                    uart0.ReLength=uart0.ReIndex;
	                    uart0.ReIndex=0x00;               
	                    uart0.ReFinished=1;                   
	                    break;
	               default:
	                    break;                                        
	          
	    }
	}
	VICVectAddr = 0x00;			// 中断处理结束
}
/*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
uint8 UART0_Init (uint32 baud)
{
    uint32 i;
	uint32 bak;
	i=((baud>>20)&0x0f)*100000;
	i+=((baud>>16)&0x0f)*10000;
	i+=((baud>>12)&0x0f)*1000;
	i+=((baud>>8)&0x0f)*100;
	i+=((baud>>4)&0x0f)*10;
	i+=(baud&0x0f);
	baud=i;
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	
	return (1);
}
/*****************************************/
void WdtFeed (void)
{
    IRQDisable();
    WDFEED = 0xaa;
    WDFEED = 0X55;
    IRQEnable();  
}


⌨️ 快捷键说明

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