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

📄 ip_arp_udp_tcp.i

📁 Control ENC28J60 codevision
💻 I
字号:

unsigned char   enc28j60ReadOp(unsigned char op, unsigned char address);
void            enc28j60WriteOp(unsigned char op, unsigned char address, unsigned char data);
void            enc28j60ReadBuffer(unsigned int len, unsigned char* data);
void            enc28j60WriteBuffer(unsigned int len, unsigned char* data);
void            enc28j60SetBank(unsigned char address);
unsigned char   enc28j60Read(unsigned char address);
void            enc28j60Write(unsigned char address, unsigned char data);
void            enc28j60PhyWrite(unsigned char address, unsigned int data);
void            enc28j60clkout(unsigned char clk);
void            enc28j60Init(unsigned char* macaddr);
void            enc28j60PacketSend(unsigned int len, unsigned char* packet);
unsigned int    enc28j60PacketReceive(unsigned int maxlen, unsigned char* packet);
unsigned char   enc28j60getrev(void);

#pragma used+
sfrb PINF=0;
sfrb PINE=1;
sfrb DDRE=2;
sfrb PORTE=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4;      
sfrb ADCSRA=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRR0L=9;
sfrb UCSR0B=0xa;
sfrb UCSR0A=0xb;
sfrb UDR0=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e;   
sfrb SFIOR=0x20;
sfrb WDTCR=0x21;
sfrb OCDR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrw ICR1=0x26;   
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;  
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;  
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;  
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb ASSR=0x30;
sfrb OCR0=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TIFR=0x36;
sfrb TIMSK=0x37;
sfrb EIFR=0x38;
sfrb EIMSK=0x39;
sfrb EICRB=0x3a;
sfrb XDIV=0x3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-

#asm
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x20
	.EQU __sm_mask=0x1C
	.EQU __sm_powerdown=0x10
	.EQU __sm_powersave=0x18
	.EQU __sm_standby=0x14
	.EQU __sm_ext_standby=0x1C
	.EQU __sm_adc_noise_red=0x08
	.SET power_ctrl_reg=mcucr
	#endif
#endasm

#pragma used+
char getchar1(void)
{
char status,data;
while (1)
{
while (((status=(*(unsigned char *) 0x9b)) & (1<<7))==0);
data=(*(unsigned char *) 0x9c);
if ((status & ((1<<4) | (1<<2) | (1<<3)))==0)
return data;
};
}
#pragma used-

#pragma used+
void putchar1(char c)
{
while (((*(unsigned char *) 0x9b) & (1<<5))==0);
(*(unsigned char *) 0x9c)=c;
}
#pragma used-

void convert(unsigned char in)
{
unsigned char a0,a1,a2;
a0=in%10;
a1=(in/10)%10;
a2=in/100;
putchar1(a2+'0');   
putchar1(a1+'0');
putchar1(a0+'0');
}

unsigned char wwwport=80;
unsigned char macaddr[6];
unsigned char ipaddr[4];
unsigned int info_hdr_len=0;
unsigned int info_data_len=0;
unsigned char seqnum=0xa; 

unsigned char checksum(unsigned char *buf, unsigned int len,unsigned char type)
{

unsigned long int sum = 0;

if(type==1){
sum+=0x11; 

sum+=len-8; 
}
if(type==2){
sum+=0x06; 

sum+=len-8; 
}

while(len >1)
{
sum +=( 0xFFFF & ((*buf)<<8|*(buf+1)) );
buf+=2;
len-=2;
}

if (len){
sum += (0xFF & *buf)<<8;
}

while (sum>>16){
sum = (sum & 0xFFFF)+(sum >> 16);
}

return( (unsigned char) sum ^ 0xFFFF);
}

void init_ip_arp_udp_tcp(unsigned char *mymac,unsigned char *myip,unsigned char wwwp)
{
unsigned char i=0;
wwwport=wwwp;
while(i<4){
ipaddr[i]=myip[i];
i++;
}
i=0;
while(i<6){
macaddr[i]=mymac[i];
i++;
}
}
unsigned char eth_type_is_arp_and_my_ip(unsigned char* buf,unsigned int len)
{
unsigned char i=0;

if (len<41)
{
return(0);
}
if( (buf[12] != 0x08) || (buf[13] != 0x06) )        
{                
DDRD.6=1;PORTD.6=~PORTD.6;
return(0);
}
while(i<4)
{
if(buf[0x26+i] != ipaddr[i])                
{
return(0);
}
i++;
}

return(1);
}
unsigned char eth_type_is_ip_and_my_ip(unsigned char* buf,unsigned char len)
{
unsigned char i=0;

putchar1(' ');
putchar1((len/100)%10+'0');
putchar1((len/10)%10+'0');
putchar1(len%10+'0');
putchar1(' ');
for(i=0;i<len;i++)
{
convert(i);
putchar1(' ');
convert( *(buf+i) );
putchar1(' ');
putchar1(' ');
}
putchar1('\n');
putchar1('\r');
i=0;

if (len<42)
{
return(0);
}
if(buf[12]!=0x08 || buf[13]!=0x00)
{
DDRD.4=1;PORTD.4=~PORTD.4;
return(0);
}
if (buf[0xe]!=0x45)
{

return(0);
}
while(i<4)
{
if(buf[0x1e+i]!=ipaddr[i]){
return(0);
}
i++;
}
return(1);
}

void make_eth(unsigned char *buf)
{
unsigned char i=0;

while(i<6){
buf[0 +i]=buf[6 +i];
buf[6 +i]=macaddr[i];
i++;
}
}

void make_eth_ip_new(unsigned char *buf, unsigned char* dst_mac)
{
unsigned char i=0;

while(i<6){
buf[0 +i]=dst_mac[i];
buf[6 +i]=macaddr[i];
i++;
}
buf[ 12 ] = 0x08;
buf[ 13 ] = 0x00;
}
void fill_ip_hdr_checksum(unsigned char *buf)
{
unsigned char ck;

buf[0x18 ]=0;
buf[0x18 +1]=0;
buf[0x14     ]=0x40; 
buf[0x14     +1]=0;  
buf[0x16]=64; 

ck=checksum(&buf[0x0E], 20,0);
buf[0x18 ]=ck>>8;
buf[0x18 +1]=ck& 0xff;
}
static unsigned char ip_identifier = 1;

void make_ip_tcp_new(unsigned char *buf, unsigned char len,unsigned char *dst_ip)
{
unsigned char i=0;

buf[ 0x0E ] = 0x40 | 0x05;

buf[ 0x0F ] = 0x00;

buf[ 0x10 ] = (len >>8)& 0xff;
buf[ 0x11 ] = len & 0xff;

buf[ 0x12 ] = (ip_identifier >>8) & 0xff;
buf[ 0x13 ] = ip_identifier & 0xff;
ip_identifier++;

buf[ 0x14 ] = 0x00;
buf[ 0x15 ] = 0x00;

buf[ 0x16 ] = 128;

buf[ 0x17 ] = 0x06;

while(i<4){
buf[0x1e+i]=dst_ip[i];
buf[0x1a+i]=ipaddr[i];
i++;
}
fill_ip_hdr_checksum(buf);
}

void make_ip(unsigned char *buf)
{
unsigned char i=0;
while(i<4){
buf[0x1e+i]=buf[0x1a+i];
buf[0x1a+i]=ipaddr[i];
i++;
}
fill_ip_hdr_checksum(buf);
}

void make_tcphead(unsigned char *buf,unsigned char rel_ack_num,unsigned char mss,unsigned char cp_seq)
{
unsigned char i=0;
unsigned char tseq;
while(i<2){
buf[0x24+i]=buf[0x22+i];
buf[0x22+i]=0; 
i++;
}

buf[0x23]=wwwport;
i=4;

while(i>0){
rel_ack_num=buf[0x26+i-1]+rel_ack_num;
tseq=buf[0x2A+i-1];
buf[0x2A+i-1]=0xff&rel_ack_num;
if (cp_seq){

buf[0x26+i-1]=tseq;
}else{
buf[0x26+i-1]= 0; 
}
rel_ack_num=rel_ack_num>>8;
i--;
}
if (cp_seq==0){

buf[0x26+0]= 0;
buf[0x26+1]= 0;

buf[0x26+2]= seqnum; 
buf[0x26+3]= 0;

seqnum+=2;
}

buf[0x32]=0;
buf[0x33]=0;

if (mss){

buf[0x36]=2;
buf[0x36+1]=4;
buf[0x36+2]=0x05; 
buf[0x36+3]=0x80;

buf[0x2E]=0x60;
}else{

buf[0x2E]=0x50;
}
}
void make_arp_answer_from_request(unsigned char *buf)
{
unsigned char i=0;

make_eth(buf);
buf[0x14]=0x0;
buf[0x15]=0x02;

while(i<6){
buf[0x20+i]=buf[0x16+i];
buf[0x16+i]=macaddr[i];
i++;
}
i=0;
while(i<4){
buf[0x26+i]=buf[0x1c+i];
buf[0x1c+i]=ipaddr[i];
i++;
}

enc28j60PacketSend(42,buf); 
}
void make_echo_reply_from_request(unsigned char *buf,unsigned int len)
{
make_eth(buf);
make_ip(buf);
buf[0x22]=0;

if (buf[0x24] > (0xff-0x08)){
buf[0x24+1]++;
}
buf[0x24]+=0x08;

enc28j60PacketSend(len,buf);
}

void make_udp_reply_from_request(unsigned char *buf,char *data,unsigned char datalen,unsigned char port)
{
unsigned char i=0;
unsigned char ck;
make_eth(buf);
if (datalen>220){
datalen=220;
}

buf[0x10]=0;
buf[0x11]=20+8+datalen;
make_ip(buf);
buf[0x24]=port>>8;
buf[0x25]=port & 0xff;

buf[0x26]=0;
buf[0x27]=8+datalen;

buf[0x28]=0;
buf[0x29]=0;

while(i<datalen){
buf[0x2a+i]=data[i];
i++;
}
ck=checksum(&buf[0x1a], 16 + datalen,1);
buf[0x28]=ck>>8;
buf[0x29]=ck& 0xff;
enc28j60PacketSend(8+20+14+datalen,buf);
}
void make_tcp_synack_from_syn(unsigned char *buf)
{
unsigned char ck;
make_eth(buf);

buf[0x10]=0;
buf[0x11]=20+20+4;
make_ip(buf);
buf[0x2F]=0x12;
make_tcphead(buf,1,1,0);

ck=checksum(&buf[0x1a], 8+20+4,2);
buf[0x32]=ck>>8;
buf[0x33]=ck& 0xff;

enc28j60PacketSend(20+20+4+14,buf);
}

unsigned int get_tcp_data_pointer(void)
{
if (info_data_len)
{
return ((unsigned char)0x22+info_hdr_len);
}
else
{
return(0);
}
}

void init_len_info(unsigned char *buf)
{
info_data_len=(buf[0x10]<<8)|(buf[0x11]&0xff);
info_data_len-=20;
info_hdr_len=(buf[0x2E]>>4)*4; 
info_data_len-=info_hdr_len;
if (info_data_len<=0){
info_data_len=0;
}
}

unsigned int fill_tcp_data_p(unsigned char *buf,unsigned int pos,unsigned char *progmem_s)
{
char c;

while ((c = *(progmem_s++))) {
buf[0x33+3+pos]=c;
pos++;
}
return(pos);
}

unsigned int fill_tcp_data(unsigned char *buf,unsigned int pos, unsigned char *s)
{

while (*s) 
{
buf[0x33+3+pos]=*s;
pos++;
s++;
}
return(pos);
}

void make_tcp_ack_from_any(unsigned char *buf)
{
unsigned char j;
make_eth(buf);

buf[0x2F]=0x10;
if (info_data_len==0){

make_tcphead(buf,1,0,1); 
}else{
make_tcphead(buf,info_data_len,0,1); 
}

j=20+20;
buf[0x10]=j>>8;
buf[0x11]=j& 0xff;
make_ip(buf);

j=checksum(&buf[0x1a], 8+20,2);
buf[0x32]=j>>8;
buf[0x33]=j& 0xff;
enc28j60PacketSend(20+20+14,buf);
}

void make_tcp_ack_with_data(unsigned char *buf,unsigned char dlen)
{
unsigned char j;

buf[0x2F]=0x10|0x08|0x01;

j=20+20+dlen;
buf[0x10]=j>>8;
buf[0x11]=j& 0xff;
fill_ip_hdr_checksum(buf);

buf[0x32]=0;
buf[0x33]=0;

j=checksum(&buf[0x1a], 8+20+dlen,2);
buf[0x32]=j>>8;
buf[0x33]=j& 0xff;
enc28j60PacketSend(20+20+dlen+14,buf);
}

void make_arp_request(unsigned char *buf, unsigned char *server_ip)
{
unsigned char i=0;
while(i<6)
{
buf[0 +i]=0xff;
buf[6 +i]=macaddr[i];
i++;
}
buf[ 12 ] = 0x08;
buf[ 13 ] = 0x06;

buf[0x14]=0x00;
buf[0x15]=0x01;

buf[ 0x0E ] = 0x00;
buf[ 0x0F ] = 0x01;

buf[ 0x10 ] = 0x08;
buf[ 0x11 ] = 0x00;

buf[ 0x12 ] = 0x06;

buf[ 0x13 ] = 0x04;

for ( i=0; i<6; i++)
{
buf[ 0x20 + i ] = 0x00;
buf[ 0x16 + i ] = macaddr[i];
}

for ( i=0; i<4; i++)
{
buf[ 0x26 + i ] = server_ip[i];
buf[ 0x1C + i ] = ipaddr[i];
}

enc28j60PacketSend(42,buf);
}
unsigned char arp_packet_is_myreply_arp ( unsigned char *buf )
{
unsigned char i;

if( buf[ 12 ] != 0x08 || buf[ 13 ] != 0x06)
return 0;

if ( buf[ 0x14 ] != 0x00 || buf[ 0x15 ] != 0x02 )
return 0;

for(i=0; i<4; i++){
if(buf[0x26+i] != ipaddr[i]){
return 0;
}
}
return 1;
}

void tcp_client_send_packet(unsigned char *buf,unsigned char dest_port, unsigned char src_port, unsigned char flags, unsigned char max_segment_size, 
unsigned char clear_seqack, unsigned char next_ack_num, unsigned char dlength, unsigned char *dest_mac, unsigned char *dest_ip)
{
unsigned char i=0;
unsigned char tseq;
unsigned char ck;
make_eth_ip_new(buf, dest_mac);
buf[0x24]= (unsigned char) ( (dest_port>>8) & 0xff);
buf[0x25]= (unsigned char) (dest_port & 0xff);
buf[0x22]= (unsigned char) ( (src_port>>8) & 0xff);
buf[0x23]= (unsigned char) (src_port & 0xff);

if(next_ack_num)
{
for(i=4; i>0; i--)
{
next_ack_num=buf[0x26+i-1]+next_ack_num;
tseq=buf[0x2A+i-1];
buf[0x2A+i-1]=0xff&next_ack_num;

buf[0x26    + i - 1 ] = tseq;
next_ack_num>>=8;
}
}

if(max_segment_size)
{

buf[0x26+0]= 0;
buf[0x26+1]= 0;

buf[0x26+2]= seqnum;
buf[0x26+3]= 0;

seqnum+=2;

buf[0x36]=2;
buf[0x36+1]=4;
buf[0x36+2]=0x05;
buf[0x36+3]=0x80;

buf[0x2E]=0x60;
dlength +=4;
}
else{

buf[0x2E]=0x50;
}
make_ip_tcp_new(buf,20+20+dlength, dest_ip);

if(clear_seqack)
{
buf[0x2A   ] = 0;
buf[0x2A   +1] = 0;
buf[0x2A   +2] = 0;
buf[0x2A   +3] = 0;
}

buf[0x32]=0;
buf[0x33]=0;

buf[0x2F] = flags;

buf[ 0x30    ] = ((600 - 20 - 14)>>8) & 0xff;
buf[ 0x31 ] = (600 - 20 - 14) & 0xff;

buf[ 0x34    ] = 0;
buf[ 0x35 ] = 0;

ck=checksum(&buf[0x1a], 8+20+dlength,2);
buf[0x32]=ck>>8;
buf[0x33]=ck& 0xff;

enc28j60PacketSend(20+20+dlength+14,buf);
}
unsigned int tcp_get_dlength(unsigned char *buf)
{
int dlength, hlength;
dlength = ( buf[ 0x10 ] <<8 ) | ( buf[ 0x11 ] );
dlength -= 20;
hlength = (buf[ 0x2E ]>>4) * 4; 
dlength -= hlength;
if ( dlength <= 0 )
dlength=0;
return ((unsigned int)dlength);
}

⌨️ 快捷键说明

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