#include "config.h"
#include "ethfunc.h"
#include "RamFunctions.h"
#include "opora.h"
const uint16_t MyMAC[3]={0x3412,0x7856,0xBC9A}; //MAC-рфЁхё ъюэЄЁюыыхЁр
/*const*/ uint16_t MyIPAddress[2]={0xA8C0,0x5701}; //IP-рфЁхё: 192.168.1.87
_Rec_Frame Frame;
uint32_t Time_old,Time_new,Time_delta;
uint16_t Counter;
//typedef struct
union
{
uint8_t buffer8[1600];
uint16_t buffer[800];
uint32_t buffer32[400];
} outbuf;
// uint16_t buffer[800];
void Answear_ARP(void);
void PacketAnaliser(void);
uint16_t CheckSum_IP(void);
uint16_t CheckSum_ICMP(uint16_t);
void Answear_ICMP(void);
void Answear_UDP(void);
void Request_ARP(void);
void SysTickInit(void);
void /*int*/ main()
{
ClkConfig();
EthernetConfig();
PortConfig();
SysTickInit(); // шэшЎшрышчрЎш ёшёЄхьэюую ЄрщьхЁр
WriteDataToRAM(0x60000000,0);
if (TestData(0x60000000,0)) {
//PORTD->SETTX=1<<7; //ЄхёЄ єёях°эю чртхЁ°хэ!
}else {
MyIPAddress[1]=0x5601; //PORTD->SETTX=1<<8; //ЄхёЄ чртхЁ°шыё ё ю°шсъющ!
}
//loop:
WriteDataToRAM(0x60000000,1);
if(TestData(0x60000000,1)) {
//PORTD->SETTX=1<<9; //ЄхёЄ єёях°эю чртхЁ°хэ!
}else {
MyIPAddress[1]=0x5501; //PORTD->SETTX=1<<10; //ЄхёЄ чртхЁ°шыё ё ю°шсъющ!
}
//goto loop;
NVIC_EnableIRQ(ETHERNET_IRQn);
while(1)
{
if((ETHERNET->PHY_STATUS&0x02)==0x00) PORTB->SETTX=1<<15; //юЄюсЁрцхэшх ёшуэрыр LINK
else PORTB->CLRTX=1<<15;
if((ETHERNET->PHY_STATUS&0x08)==0x00) PORTB->SETTX=1<<14; //Full Duplex Mode
else PORTB->CLRTX=1<<14;
}
//Time_old=0x00FFFFFF;
}
void ETHERNET_Handler()
{
uint16_t Status;
Status=ETHERNET->IFR;
ETHERNET->IFR=Status;
Status&=0x101;
PORTD->RXTX^=(1<<9);
if((Status&0x01)==0x01)
{
PORTD->SETTX=1<<7;
Counter=ReadPacket(&Frame);
PacketAnaliser();
PORTD->CLRTX=1<<7;
}
}
//*** ╘єэъЎш ЁрчсюЁр яюыєўхээюую яръхЄр
void PacketAnaliser(void)
{
switch(Frame.Data[6]) //юяЁхфхы хь Єшя ёыхфє■∙хую яЁюЄюъюыр
{
case 0x0008: //яЁюЄюъюы IP
if((Frame.Data[15]==MyIPAddress[0])&&(Frame.Data[16]==MyIPAddress[1])) //ёЁртэштрхь IP рфЁхёр т яръхЄх ё эр°шь
{ //хёыш юэш ёютярфр■Є, Єю чрэшьрхьё ЁрчсюЁюь яръхЄр фры№°х,
if(CheckSum_IP()==Frame.Data[12]) //хёыш ъюэЄЁюы№э√х ёєьь√ яръхЄр ш т√ўшёыхээр ёютярфр■Є, яЁюфюыцрхь
{ //шэрўх - юЄсЁрё√трхь яръхЄ
//--------------------UDP-------------------
if((Frame.Data[11]&0xFF00)==0x1100) //юяЁхфхышыш ёыхфє■∙шщ яЁюЄюъюы: UDP
{
PORTD->SETTX=1<<8;
Answear_UDP(); //юЄяЁртшыш юЄтхЄ эр чряЁюё Echo (ping) request
PORTD->CLRTX=1<<8;
}
//--------------------ICMP-------------------
if((Frame.Data[11]&0xFF00)==0x0100) //юяЁхфхышыш ёыхфє■∙шщ яЁюЄюъюы: ICMP
{
if(Frame.Data[17]==0x0008) //юяЁхфхышыш Єшя - Echo (ping) request
{
PORTD->SETTX=1<<8;
Answear_ICMP(); //юЄяЁртшыш юЄтхЄ эр чряЁюё Echo (ping) request
PORTD->CLRTX=1<<8;
}
}
}
//-------------------------------------------
}
break;
case 0x0608: //яЁюЄюъюы ARP
if((Frame.Data[19]==MyIPAddress[0])&&(Frame.Data[20]==MyIPAddress[1])) //ёЁртэштрхь IP рфЁхёр т яръхЄх ё эр°шь
{ //хёыш юэш ёютярфр■Є, Єю чрэшьрхьё ЁрчсюЁюь яръхЄр фры№°х,
Answear_ARP(); //юЄяЁртшыш юЄтхЄ эр ARP-чряЁюё
}
break;
}
}
//*** ╘єэъЎш ЇюЁьшЁютрэш юЄтхЄр эр ARP-чряЁюё
void Answear_ARP(void)
{
uint16_t Buf[22];
Buf[0]=Frame.Data[3]; //MAC-рфЁхё шёЄюўэшър
Buf[1]=Frame.Data[4]; //MAC-рфЁхё шёЄюўэшър
Buf[2]=Frame.Data[5]; //MAC-рфЁхё шёЄюўэшър
Buf[3]=ETHERNET->MAC_T; //эр° MAC-рфЁхё
Buf[4]=ETHERNET->MAC_M; //эр° MAC-рфЁхё
Buf[5]=ETHERNET->MAC_H; //эр° MAC-рфЁхё
Buf[6]=Frame.Data[6]; //type - ARP
Buf[7]=Frame.Data[7]; //Hardware type - Ethernet
Buf[8]=Frame.Data[8]; //Protocol type - IP
Buf[9]=Frame.Data[9]; //Hardware size - 6; Protocol size - 4
Buf[10]=0x0200; //ъюф юЄтхЄр эр чряЁюё Who has...
Buf[11]=ETHERNET->MAC_T; //Sender MAC-address: 0A.1B.2C.3D.4E.5F
Buf[12]=ETHERNET->MAC_M; //Sender MAC-address: 0A.1B.2C.3D.4E.5F
Buf[13]=ETHERNET->MAC_H; //Sender MAC-address: 0A.1B.2C.3D.4E.5F
Buf[14]=MyIPAddress[0]; //My_IP_Address[0]; //Sender IP-address: 192.168.1.87
Buf[15]=MyIPAddress[1]; //My_IP_Address[1]; //Sender IP-address: 192.168.1.87
Buf[16]=Frame.Data[3]; //Target MAC-address
Buf[17]=Frame.Data[4]; //Target MAC-address
Buf[18]=Frame.Data[5]; //Target MAC-address
Buf[19]=Frame.Data[14]; //Target IP-address
Buf[20]=Frame.Data[15]; //Target IP-address
Buf[21]=0;
SendPacket(Buf,42);
}
//*** ╘єэъЎш фы яюфёўхЄр ъюэЄЁюы№эющ ёєьь√ яръхЄр IP-яЁюЄюъюыр
uint16_t CheckSum_IP(void)
{
unsigned long cs=0;
cs = cs + Frame.Data[7];
cs = cs + Frame.Data[8];
cs = cs + Frame.Data[9];
cs = cs + Frame.Data[10];
cs = cs + Frame.Data[11];
cs = cs + Frame.Data[13];
cs = cs + Frame.Data[14];
cs = cs + Frame.Data[15];
cs = cs + Frame.Data[16];
cs = (cs >> 16) + (cs & 0xFFFF);
return (uint16_t)(~cs);
}
//*** ╘єэъЎш фы яюфёўхЄр ъюэЄЁюы№эющ ёєьь√ яръхЄр ICMP-яЁюЄюъюыр
//*** size - ъюы-тю ёыют, яю ъюЄюЁюьє эхюсїюфшью яюёўшЄрЄ№ ъюэЄЁюы№эє■ ёєььє
uint16_t CheckSum_ICMP(uint16_t size)
{
unsigned long a, cs=0;
for(a=0;a<size;a++)
{
if(a==1) continue;
else cs+=Frame.Data[a+17];
}
cs=(cs>>16)+(cs&0xFFFF);
return (uint16_t)(~cs);
}
//*** ╘єэъЎш фы ЇюЁьшЁютрэш юЄтхЄр эр чряЁюё ICMP
void Answear_ICMP(void)
{
unsigned long a;
uint16_t buffer[288];
uint16_t tmp;
//╩юы-тю срщЄ т ICMP-яръхЄх
tmp=Counter-34-4; //34 срщЄр - чруюыютюъ Eth2 ш IP яръхЄют, 4 срщЄр - ъюэЄЁюы№эр ёєььр Eth2 яръхЄр.
if((tmp&0x01)==1)
{
tmp=(tmp+1)>>1; //шч ъюы-тр срщЄ яюыєўшыш ъюы-тю ёыют
Frame.Data[tmp+16]=Frame.Data[tmp+16]&0x00FF;
}
else tmp=tmp>>1; //шч ъюы-тр срщЄ яюыєўшыш ъюы-тю ёыют
//-------Ethernet 2 Protocol---------
buffer[0]=Frame.Data[3];
buffer[1]=Frame.Data[4];
buffer[2]=Frame.Data[5];
buffer[3]=ETHERNET->MAC_T;
buffer[4]=ETHERNET->MAC_M;
buffer[5]=ETHERNET->MAC_H;
buffer[6]=Frame.Data[6];
//-------IP Protocol---------
for(a=7;a<12;a++)
{
buffer[a]= Frame.Data[a];
}
//---------------------------
buffer[12]=CheckSum_IP();
buffer[13]=Frame.Data[15];//IP->DestinAddr[0];
buffer[14]=Frame.Data[16];//IP->DestinAddr[1];
buffer[15]=Frame.Data[13];//IP->SourceAddr[0];
buffer[16]=Frame.Data[14];//IP->SourceAddr[1];
//-------ICMP Protocol---------
buffer[17]=0x0000; //юЄтхЄ
Frame.Data[17]=0x0000;
//-----------------------------
buffer[18]=CheckSum_ICMP(tmp);
for(a=19;a<((tmp-2)+19);a++)
{
buffer[a]=Frame.Data[a];
}
SendPacket(buffer,(tmp*2+34));
}
/*
╧ръхЄ ъюьрэф√
*************
................................. MAC чруюыютюъ
срщЄ 1 - MAC рфЁхё яюыєўрЄхы (ьшъЁюъюэЄЁюыыхЁ) ёЄ.срщЄ
срщЄ 2 - -"- ёЁ.срщЄ
срщЄ 3 - -"- ёЁ.срщЄ
срщЄ 4 - -"- ёЁ.срщЄ
срщЄ 5 - -"- ёЁ.срщЄ
срщЄ 6 - -"- ьы.срщЄ
срщЄ 7 - MAC рфЁхё юЄяЁртшЄхы (╧▌┬╠) ёЄ.срщЄ
срщЄ 8 - -"- ёЁ.срщЄ
срщЄ 9 - -"- ёЁ.срщЄ
срщЄ 10 - -"- ёЁ.срщЄ
срщЄ 11 - -"- ёЁ.срщЄ
срщЄ 12 - -"- ьы.срщЄ
срщЄ 13 - яЁюЄюъюы IP (800h) ёЄ.срщЄ
срщЄ 14 - -"- ьы.срщЄ
................................. IP чруюыютюъ
срщЄ 15 - тхЁёш 4, фышэр чруюыютър 5 ёыют (45h)
срщЄ 16 - Єшя ёыєцс√ (0)
срщЄ 17 - юс∙р фышэр т срщЄрї ёЄ.срщЄ
срщЄ 18 - -"- ьы.срщЄ
срщЄ 19 - шфхэЄшЇшърЄюЁ ёЄ.срщЄ
срщЄ 20 - -"- ьы.срщЄ
срщЄ 21 - Їыруш (0)
срщЄ 22 - ёьх∙хэшх ЇЁруьхэЄр (0)
срщЄ 23 - ёЁюъ цшчэш
срщЄ 24 - яЁюЄюъюы UDP (11h)
срщЄ 25 - ъюэЄЁюы№эр ёєььр IP чруюыютър ёЄ.срщЄ
срщЄ 26 - -"- ьы.срщЄ
срщЄ 27 - IP рфЁхё юЄяЁртшЄхы ёЄ.срщЄ
срщЄ 28 - -"- ёЁ.срщЄ
срщЄ 29 - -"- ёЁ.срщЄ
срщЄ 30 - -"- ьы.срщЄ
срщЄ 31 - IP рфЁхё яюыєўрЄхы ёЄ.срщЄ
срщЄ 32 - -"- ёЁ.срщЄ
срщЄ 33 - -"- ёЁ.срщЄ
срщЄ 34 - -"- ьы.срщЄ
................................. UDP чруюыютюъ
срщЄ 35 - яюЁЄ юЄяЁртшЄхы ёЄ.срщЄ
срщЄ 36 - -"- ьы.срщЄ
срщЄ 37 - яюЁЄ яюыєўрЄхы ёЄ.срщЄ
срщЄ 38 - -"- ьы.срщЄ
срщЄ 39 - фышэр фхщЄруЁрьь√ UDP ёЄ.срщЄ
срщЄ 40 - -"- ьы.срщЄ
срщЄ 41 - ъюэЄЁюы№эр ёєььр ёЄ.срщЄ
срщЄ 42 - -"- ьы.срщЄ
................................. чруюыютюъ ъюьрэф√
срщЄ 43 - эюьхЁ Ўшъыр ёЄ.срщЄ
срщЄ 44 - -"- ьы.срщЄ
срщЄ 45 - фышэр сєЇхЁр Єхъє∙хую ёюёЄю эш (фт.ёыют)
0 - сєЇхЁ эх т√фр╕Єё
срщЄ 46 - ъюф юяхЁрЎшш ъюьрэф√
................................. фрээ√х ъюьрэф√
...
...................................................
срщЄ N-(N+3) - ъюэЄЁюы№эр ёєььр MAC яръхЄр
*/
/*
int writetoarm(unsigned int addr,byte* mas,int bytes_in_line)
{
int i;
byte msg[300];
cycle++;
msg[0]=cycle>>8;
msg[1]=cycle;
msg[2]=0; //фышэр сєЇхЁр Єхъє∙хую ёюёЄю эш
msg[3]=0x04;
msg[4]=bytes_in_line>>8;//0x00;
msg[5]=bytes_in_line;//0x01;
msg[6]=addr>>24;
msg[7]=addr>>16;
msg[8]=addr>>8;
msg[9]=addr;
for(i=0;i<bytes_in_line;i++) {
msg[10+i]=mas[i];
};
call_dunin(msg,10+bytes_in_line);
read_dunin(msg,10);
addr++;
return(0);
}
*/
/*
2.1.1. ╟руЁєчшЄ№ ьрёёшт т ╟╙ яю срщЄрь
......................................
срщЄ46 - 004h
срщЄ47-48 - ъюышўхёЄтю срщЄ (ёхЄхтющ яюЁ фюъ срщЄ)
срщЄ49-52 - рфЁхё (ёхЄхтющ яюЁ фюъ срщЄ)
срщЄ53 - ьы.срщЄ ьрёёштр
...
срщЄN - ёЄ.срщЄ ьрёёштр
─рээ√х юЄтхЄэюую ёююс∙хэш :
- юЄёєЄёЄтє■Є
╤ чрфрээюую рфЁхёр ╟╙ чруЁєцрхЄё чрфрээюх
ъюышўхёЄтю срщЄ.
*/
/*
┬√яюыэшЄ№ яЁюуЁрььє яю чрфрээюьє рфЁхёє
срщЄ46 - 0f0h
срщЄ47-50 - рфЁхё (ёхЄхтющ яюЁ фюъ срщЄ)
─рээ√х юЄтхЄэюую ёююс∙хэш :
- юЄёєЄёЄтє■Є
чряєёърхЄё яЁюуЁрььр ё чрфрээ√ь рфЁхёюь, чрЄхь т√фр╕Єё юЄтхЄэюх ёююс∙хэшх
*/
//эєьхЁрЎш ё 1, Є.х. эрфю т√ўшЄрЄ№ 1
//*** ╘єэъЎш фы ЇюЁьшЁютрэш юЄтхЄр эр чряЁюё UDP
void Answear_UDP(void)
{
unsigned long a,b, cs=0;
uint16_t tmp;
int i, n;
unsigned char * framebytes = (unsigned char *)Frame.Data;
uint32_t addr;
if (framebytes[45]==0x04) {
n = (framebytes[46]<<8) + framebytes[47];
addr = (framebytes[48]<<24) + (framebytes[49]<<16) + (framebytes[50]<<8) + framebytes[51];
for(i=0; i<n; i++) {
WriteByteToRAM(addr+i, framebytes[52+i]);
};
};
if (framebytes[45]==0xf0) {
//addr = 0x50000000;
//addr = 0x20002000;
addr = (framebytes[46]<<24) + (framebytes[47]<<16) + (framebytes[48]<<8) + framebytes[49];
CallRAM(addr);
};
// uint32_t *buf32, *buf321;
Time_new=SysTick->VAL&0x00FFFFFF; // ўЄхэшх Єхъє∙хую ёшёЄхьэюую тЁхьхэш
if((SysTick->CTRL&0x10000)==0x10000)
{
Time_delta=(0x00FFFFFF+Time_old-Time_new);
}
else
{
Time_delta=(Time_old-Time_new);
};
outbuf.buffer[21]=(uint16_t)((Time_delta&0xFFFF0000)>>16); // яхЁшюф юсьхэр т ЄръЄрї - ёЄрЁ°шх срщЄ√
outbuf.buffer[22]=(uint16_t)(Time_delta&0x0000FFFF); // яхЁшюф юсьхэр т ЄръЄрї - ьырф°шх срщЄ√
Time_old=Time_new;
//╩юы-тю срщЄ т ICMP-яръхЄх
tmp=Counter-34-4; //34 срщЄр - чруюыютюъ Eth2 ш IP яръхЄют, 4 срщЄр - ъюэЄЁюы№эр ёєььр Eth2 яръхЄр.
if((tmp&0x01)==1) // хёыш эхў╕Єэюх ъюы-тю срщЄ
{
tmp=(tmp+1)>>1; //шч ъюы-тр срщЄ яюыєўшыш ъюы-тю ёыют т UDP-яръхЄх
Frame.Data[tmp+16]=Frame.Data[tmp+16]&0x00FF; // юсЁхчрхь эряюыютшэє ёыютю ёюфхЁцр∙хх яюёыхфэшщ срщЄ
}
else tmp=tmp>>1; //шч ъюы-тр срщЄ яюыєўшыш ъюы-тю ёыют т UDP-яръхЄх
//-------Ethernet 2 Protocol---------
outbuf.buffer[0]=Frame.Data[3];
outbuf.buffer[1]=Frame.Data[4];
outbuf.buffer[2]=Frame.Data[5];
outbuf.buffer[3]=ETHERNET->MAC_T;
outbuf.buffer[4]=ETHERNET->MAC_M;
outbuf.buffer[5]=ETHERNET->MAC_H;
outbuf.buffer[6]=Frame.Data[6];
//-------IP Protocol---------
outbuf.buffer[7]=Frame.Data[7];
outbuf.buffer[8]=Frame.Data[8];
outbuf.buffer[9]=Frame.Data[9];
outbuf.buffer[10]=Frame.Data[10];
outbuf.buffer[11]=Frame.Data[11];
outbuf.buffer[13]=Frame.Data[15];//IP->DestinAddr[0];
outbuf.buffer[14]=Frame.Data[16];//IP->DestinAddr[1];
outbuf.buffer[15]=Frame.Data[13];//IP->SourceAddr[0];
outbuf.buffer[16]=Frame.Data[14];//IP->SourceAddr[1];
//-----------╧юфёўхЄ ъюэЄЁюы№эющ ёєьь√ яръхЄр IP-яЁюЄюъюыр----------------
cs = cs + outbuf.buffer[7];
cs = cs + outbuf.buffer[8];
cs = cs + outbuf.buffer[9];
cs = cs + outbuf.buffer[10];
cs = cs + outbuf.buffer[11];
cs = cs + outbuf.buffer[13];
cs = cs + outbuf.buffer[14];
cs = cs + outbuf.buffer[15];
cs = cs + outbuf.buffer[16];
cs = (cs >> 16) + (cs & 0xFFFF);
outbuf.buffer[12]=(uint16_t)(~cs);
// outbuf.buffer[12]=CheckSum_IP();
//-------UDP Protocol---------
outbuf.buffer[17]=Frame.Data[18];//╧юЁЄ юЄяЁртшЄхы
outbuf.buffer[18]=Frame.Data[17];//╧юЁЄ яюыєўрЄхы
outbuf.buffer[19]=Frame.Data[19];//─ышээр UDP
outbuf.buffer[20]=0x0000; // ъюэЄЁюы№эр ёєььр
//-----------------------------
// outbuf.buffer[18]=CheckSum_ICMP(tmp);
tmp=tmp+17; // ёєььрЁэр фышэр т ёыютрї
// buf321=(uint32_t*)(Frame.Data[25]);
// buf32=(uint32_t*)(outbuf.buffer[25]);
outbuf.buffer[25]=Frame.Data[25];
b=tmp/2;
for(a=13;a<b;a++) // яхЁхяшёрЄ№ тёх фрээ√х
{
outbuf.buffer32[a]=Frame.Data32[a];
a++;
outbuf.buffer32[a]=Frame.Data32[a];
a++;
outbuf.buffer32[a]=Frame.Data32[a];
a++;
outbuf.buffer32[a]=Frame.Data32[a];
};
// /*{
// buf321=(uint32_t*)(Frame.Data[a]);
// buf32=(uint32_t*)(outbuf.buffer[a]);
// *(buf32)=(uint32_t)a;//*(buf321);
// a++;
// *(buf32++)=*(buf321++);
// a++;
// *(buf32++)=*(buf321++);
// a++;
// *(buf32++)=*(buf321++);
// }
// for(a=25;a<tmp;a++)
// {
// outbuf.buffer[a]=Frame.Data[a];
// a++;
// outbuf.buffer[a]=Frame.Data[a];
// a++;
// outbuf.buffer[a]=Frame.Data[a];
// a++;
// outbuf.buffer[a]=Frame.Data[a];
// } */
Time_new=SysTick->VAL&0x00FFFFFF; // ўЄхэшх Єхъє∙хую ёшёЄхьэюую тЁхьхэш
if((SysTick->CTRL&0x10000)==0x10000)
{
Time_delta=(0x00FFFFFF+Time_old-Time_new);
}
else
{
Time_delta=(Time_old-Time_new);
};
outbuf.buffer[23]=(uint16_t)((Time_delta&0xFFFF0000)>>16); // ъюы-тю ЄръЄют, чрЄЁрўхээ√ї эр т√ўшёыхэш - ёЄрЁ°шх срщЄ√
outbuf.buffer[24]=(uint16_t)(Time_delta&0x0000FFFF); // ъюы-тю ЄръЄют, чрЄЁрўхээ√ї эр т√ўшёыхэш - ьырф°шх срщЄ√
SendPacket(outbuf.buffer,(tmp*2));
}
//--- System Timer initialization ---
void SysTickInit() // шэшЎшрышчрЎш ёшёЄхьэюую ЄрщьхЁр
{
SysTick->LOAD = 0x00FFFFFF; //Pause 177 ms (HCLK = 96MHz)
SysTick->CTRL = 0x00000001; //Enabel SysTick
}