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

📄 ethernet_mini_driver.c

📁 利用 pic18f67j60 单片机来实现10M IP网络的连接
💻 C
📖 第 1 页 / 共 5 页
字号:
			ipaddrascii[1]+= 1;
	  }while(binarynumber >= 10);
	}
	ipaddrascii[2]+= binarynumber;
}
//******************************************************************
//*	Read the transmit buffer
//*   This routine reads the contents of the transmit buffer
//*   Uncomment debuggc array definition to use
//******************************************************************
/*
void read_xmit_buffer(void)
{
	unsigned int i;
	//banksel(ERDPTL);
	ERDPTL= LOW_BYTE(TXSTART);
	ERDPTH= HIGH_BYTE(TXSTART);
    for(i=0;i<300;++i)	
		debuggc[i]= rd_sram();
}
*/
//******************************************************************
//*	  SEND DHCP BOUND MESSAGE VIA BROADCAST UDP
//******************************************************************
void send_dhcp_bound_datagram()
{
	char *bufferptr,temp;
	unsigned int i,j;	
	char msg[];
	tx_end = 0;
   //load beginning page for transmit buffer
    //banksel(EWRPTL);
	EWRPTL = LOW_BYTE(TXSTART);
	EWRPTH = HIGH_BYTE(TXSTART);
	
	i = 6;
	while(i--)   		//write destination MAC address	
	{
		EDATA = 0xFF;
		//i--;
	};	
	
	bufferptr = macaddrc;
	i = 6;
	while(i--)   			//write source MAC address	

	{
		EDATA = *bufferptr++;
	//	bufferptr++;
	//	i--;
	};	
	EDATA =  0x08;		//write 0800 type field
	EDATA =  0x00;
	tx_end += 15;
	
	//BEGIN IP HEADER
	EDATA =  0x45;		//write 4500 vers/len field
	EDATA =  0x00;
	EDATA =  0x00;		//write packet length 0x0114
	EDATA =  0x00;
	EDATA =  0x00;		//write id field
	EDATA =  0x01;
	EDATA =  0x00;		//write flags/frag offset
	EDATA =  0x00;
	EDATA =  0x64;		//write time to live
	EDATA =  0x11;		//write protocol type (UDP)
	EDATA =  0x00;		//write IP hdr checksum (0x0000)
	EDATA =  0x00;
	i = 4;
	bufferptr = ipaddrc;
	while(i--)   			//write source IP address	
	{
		EDATA =  *bufferptr++;
		//i--;
	};	
	i = 4;
	bufferptr = broadcastipaddrc;
	while(i--)   			//write destination IP address	
	{
		EDATA =  *bufferptr++;
		//i--;
	};	
	tx_end += 20;
	//END IP HEADER
	
	//START UPD HEADER
	EDATA =  HIGH_BYTE(MY_PORT_ADDRESS);		//write UDP source port (8088 decimal)
	EDATA =  LOW_BYTE(MY_PORT_ADDRESS);
	EDATA =  HIGH_BYTE(MCHP_UDP_PORT_ADDRESS);		//write UDP destination port (30303 decimal)
	EDATA =  LOW_BYTE(MCHP_UDP_PORT_ADDRESS);
	EDATA =  0x00;		//write UDP length 
	EDATA =  0x00;
	EDATA =  0x00;		//write UDP checksum (no checksum)
	EDATA =  0x00;
	tx_end += 8;
	//END UDP HEADER
	
    //START UDP DATA
    //write MAC address message
    i = 36;
    tx_end += i;
    msgpointer = dhcpmacmsg;
	while(i--)   			
		{
			EDATA =  *msgpointer++;
			//i--;
		};
	//write IP address message	
    i = 19;
    tx_end += i;
    msgpointer = dhcpipmsg;
	while(i--)   		
		{
			EDATA =  *msgpointer++;
		//	i--;
		};	
	for(i=0;i<4;++i)
		{
			binary_to_ascii(ipaddrc[i]);
			bufferptr = ipaddrascii;	
            j = sizeof(ipaddrascii);
            tx_end += j;
            if(ipaddrascii[0] == 0x30)
            {
	        	tx_end--;
	            j--;
	            bufferptr++;
	        }
	        if(ipaddrascii[1] == 0x30  && ipaddrascii[0] == 0x30)
	        {
	        	tx_end--;
	            j--;
	            bufferptr++;
            }	
			while(j--)   		//write FTII IP address 	
			{
				EDATA =  *bufferptr++;
				//j--;
			};
			if(i<3)
			{
				EDATA =  0x2E;	//write . period
				tx_end += 1;
			}
		}	
	//write gateway address message				
     i = 27;
     tx_end += i;
     msgpointer = dhcpgwaymsg;
	 while(i--)  		//write gateway address message
	 {
	  	EDATA =  *msgpointer++;
		//i--;
	 };	
	 for(i=0;i<4;++i)
	 {
		binary_to_ascii(gwayipaddrc[i]);
		bufferptr = ipaddrascii;	
        j = sizeof(ipaddrascii);
        tx_end += j;
        if(ipaddrascii[0] == 0x30)
        {
	     	tx_end--;
	        j--;
	        bufferptr++;
	    }
	    if(ipaddrascii[1] == 0x30  && ipaddrascii[0] == 0x30)
	    {
	    	tx_end--;
	        j--;
	        bufferptr++;
        }	
		while(j--)   		//write FTII gateway IP address 	
		{
			EDATA =  *bufferptr++;
			//j--;
		};
		if(i<3)
		{
			EDATA =  0x2E;	//write . period
			tx_end += 1;
		}
	   }
	//write subnet mask address message				
     i = 20;
     tx_end += i;
     msgpointer = dhcpsubnetmaskmsg;
	 while(i--)   		//write gateway address message
	 {
	  	EDATA =  *msgpointer++;
		//i--;
	 };	
	 for(i=0;i<4;++i)
	 {
		binary_to_ascii(subnetmaskc[i]);
		bufferptr = ipaddrascii;	
        j = sizeof(ipaddrascii);
        tx_end += j;
        if(ipaddrascii[0] == 0x30)
        {
	     	tx_end--;
	        j--;
	        bufferptr++;
	    }
	    if(ipaddrascii[1] == 0x30  && ipaddrascii[0] == 0x30)
	    {
	    	tx_end--;
	        j--;
	        bufferptr++;
        }	
		while(j--)   		//write subnet mask	
		{
			EDATA =  *bufferptr++;
			//j--;
		};
		if(i<3)
		{
			EDATA =  0x2E;	//write . period
			tx_end += 1;
		}
	   }
	//read_xmit_buffer();
	//++i;
	
	// write ip header total length
    //banksel(EWRPTL);
	EWRPTL = LOW_BYTE(TXSTART+0x11);
	EWRPTH = HIGH_BYTE(TXSTART+0x00);
	
	i = tx_end - 15;	
	EDATA =  HIGH_BYTE(i);   
	EDATA =  LOW_BYTE(i);   

	// write udp header total length
    //banksel(EWRPTL);
	EWRPTL = LOW_BYTE(TXSTART+0x27);
	EWRPTH = HIGH_BYTE(TXSTART+0x00);
	
	i = tx_end - 35;	
	EDATA =  HIGH_BYTE(i);   

	//compute ip header checksum
    hdrlen = (0x45 & 0x0F) * 4; //hdrlen = 20 bytes
	offsetval = TXSTART+15;		//beginning of IP header
	EDMASTL = LOW_BYTE(offsetval);
	EDMASTH = HIGH_BYTE(offsetval);
	offsetval += (hdrlen-1);
	EDMANDL = LOW_BYTE(offsetval);
	EDMANDH = HIGH_BYTE(offsetval);
	ECON1 |= (ECON1_CSUMEN | ECON1_DMAST);
   // while(ECON1 & ECON1_DMAST);
   	while(DMAST);
    chksum_lo =  EDMACSL;
    chksum_hi =  EDMACSH;
   
    //write ip checksum values to TX buffer
    offsetval = TXSTART+25;
    EWRPTL = LOW_BYTE(offsetval);
    EWRPTH = HIGH_BYTE(offsetval);
	EDATA =  chksum_hi;
	EDATA =  chksum_lo;
    tx_end += (TXSTART-1);
    //banksel(ETXNDL);
	ETXNDL = LOW_BYTE(tx_end);
	ETXNDH = HIGH_BYTE(tx_end);

   //send the contents of the transmit buffer onto the network
	//temp =  EIR;
	//if((temp & EIR_TXERIF) == 1)
	if(TXERIF)
	{
	 TXERIF = 0;
     TXRTS = 1;
   	 TXRTS = 0;
	}
	TXIF = 0;
   	TXRTS = 1;
	//while(1 == (ECON1 & ECON1_TXRTS));
	while(TXRTS);
}
//******************************************************************
//*	INITIALIZE DHCP STATE MACHINE
//******************************************************************
void init_DHCP(void)
{
	if(DHCPSTATE == DHCP_DISABLED)
		return;
		
	DHCPSTATE = DHCP_ENTRY;
	dhcpflags = 0;
}
//******************************************************************
//*	DHCP STATE MACHINE
//******************************************************************
void dhcp_state_engine(void)
{
	unsigned int i;
	switch(DHCPSTATE)
	{
		case DHCP_ENTRY:
			printf("\r\nDHCP RESET..");
			for(i=0;i<4;++i)
				tempipaddrc[i] = 0x00;
			DHCPSTATE = DHCP_INIT;
		case DHCP_INIT:
			printf("\r\nDHCP INIT..");	
			for(i=0;i<6;++i)
				svrmacaddrc[i] = 0xFF;
			for(i=0;i<4;++i)
				svridc[i] = 0xFF;
			msecs_timer = 0;
			DHCPSTATE = DHCP_WAIT;
		case DHCP_WAIT:
			if(msecs_timer >= 2000)
				DHCPSTATE = DHCP_BROADCAST;
		break;
		case DHCP_BROADCAST:
			leasetime = 60;
			if(bbound)
			{
				DHCPSTATE = DHCP_REQUEST;
			}
			else
			{
				send_dhcp(DHCP_DISCOVER_MESSAGE);
				msecs_timer = 0;
				DHCPSTATE = DHCP_DISCOVER;
				printf("\r\nSENT DISCOVER MESSAGE..");
			}
		break;
		case DHCP_DISCOVER:
			if(msecs_timer >= 2000)
			{
				DHCPSTATE = DHCP_BROADCAST;
				return;
			}
			if(bnewdhcppkt)
			{
				if(receive_dhcp() == DHCP_OFFER_MESSAGE)
				{
					DHCPSTATE = DHCP_REQUEST;
					printf("\r\nRECEIVED DHCP OFFER MESSAGE..");
				}
				clr_newdhcppkt;
			}
		break;
		case DHCP_REQUEST:
			send_dhcp(DHCP_REQUEST_MESSAGE);
			msecs_timer = 0;
			DHCPSTATE = DHCP_BIND;
			printf("\r\nSENT DHCP REQUEST MESSAGE..");
		break;
		case DHCP_BIND:
		    if(bnewdhcppkt)
		    {
				dhcpreturncode = receive_dhcp();
				clr_newdhcppkt;
			}
			if(dhcpreturncode == DHCP_NAK_MESSAGE)
			{	
				printf("\r\nRECEIVED DHCP NAK MESSAGE..");
				init_DHCP();
				return;
			}
			else if(dhcpreturncode == DHCP_ACK_MESSAGE)
			{
				printf("\r\nRECEIVED DHCP ACK MESSAGE..");
				lease_timer = 0;
				DHCPSTATE = DHCP_BOUND;
				for(i=0;i<4;++i)
				{
					ipaddrc[i] = tempipaddrc[i];
					subnetmaskc[i] = tempsubnetmaskc[i];
					gwayipaddrc[i] = tempgwayipaddrc[i];
				}
				set_bound;
				printf("\r\nNEW IP ADDRESS IS %d.%d.%d.%d..",ipaddrc[0],ipaddrc[1],ipaddrc[2],ipaddrc[3]);
				printf("\r\nNEW GATEWAY ADDRESS IS %d.%d.%d.%d..",gwayipaddrc[0],gwayipaddrc[1],gwayipaddrc[2],gwayipaddrc[3]);
				printf("\r\nNEW SUBNET MASK IS %d.%d.%d.%d..",subnetmaskc[0],subnetmaskc[1],subnetmaskc[2],subnetmaskc[3]);
				send_dhcp_bound_datagram();
				return;
			}
			else if(msecs_timer >= 2000)
				DHCPSTATE = DHCP_BROADCAST;
		break;
		case DHCP_BOUND:
			if(lease_timer >= leasetime)
			{
				printf("\r\nDHCP LEASE TIME EXPIRED..");
				DHCPSTATE = DHCP_INIT;
			}
		break;
	}
}

//******************************************************************
//*	SEND A DHCP MESSAGE ROUTINE
//******************************************************************
void send_dhcp(char dhcpmsgtype)
{
	char *bufferptr,temp;
	unsigned int i;	
	
	tx_end = 0;
   //load beginning page for transmit buffer
    //banksel(EWRPTL);
	EWRPTL = LOW_BYTE(TXSTART);
	EWRPTH = HIGH_BYTE(TXSTART);
	
	EDATA =  0x0E;   //write control byte
	i = 6;
	while(i)   		//write destination MAC address	
	{
		EDATA = 0xFF;
		i--;
	};	
	
	bufferptr = macaddrc;
	i = 6;
	while(i)   			//write source MAC address	

	{
		EDATA = *bufferptr;
		bufferptr++;
		i--;
	};	
	EDATA =  0x08;		//write 0800 type field
	EDATA =  0x00;
	tx_end += 15;
	
	//BEGIN IP HEADER
	EDATA =  0x45;		//write 4500 vers/len field
	EDATA =  0x00;
	EDATA =  0x00;		//write packet length 0x0114
	EDATA =  0x00;
	EDATA =  0x00;		//write id field
	EDATA =  0x01;
	EDATA =  0x00;		//write flags/frag offset
	EDATA =  0x00;
	EDATA =  0x64;		//write time to live
	EDATA =  0x11;		//write protocol type (UDP)
	EDATA =  0x00;		//write IP hdr checksum (0x0000)
	EDATA =  0x00;
	i = 4;
	while(i)   			//write source IP address	
	{

⌨️ 快捷键说明

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