Login

Subversion Repositories NedoOS

Rev

Rev 8 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed


#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
}