Перейти к содержанию
    

Господа, w3150a не хочет за раз передавать больше 1471 байта, хотя буфер там по меньшей мере 4к а то и 8к на сокет.

Не пойму в чем проблема, все перелопатил.

Передача идет раз в 0,3 сек по пустому кабелю так что передать может сколько угодно.

Задача передавать пакетами сразу по максимуму например по 8к с одного сокета.

Если ставить num_out=1471 - нормально, если выше то получаем разницу между 1471 и установленной или вообще от балды сколько байт.

Память на сокет 8к стоит (при 4к тоже самое), все маски сдвиги вроде правильно...

Или прога на компе не может принимать больше не пойму.

 

 

Прога

#define   Write_W3150   0xF0
#define   Read_W3150    0x0F

//*********************************************************
extern char           data_out[num_out+3];

void Init_W3150(void)
{
unsigned int ii;
       // reset
       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++);         
       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++); 

       SPI_Send (Write_W3150, 0, 0, 0x80);

       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++);
       for(ii=0;ii<65000;ii++); 


       //--------- Приемник ------------------------
       // шлюз 192.168.10.1
       SPI_Send (Write_W3150, 0, 1, 8);

       SPI_Send (Write_W3150, 0, 2, 168);
       SPI_Send (Write_W3150, 0, 3, 10);
       SPI_Send (Write_W3150, 0, 4, 1);
       // маска сети 255.255.255.0
       SPI_Send (Write_W3150, 0, 5, 255);
       SPI_Send (Write_W3150, 0, 6, 255);
       SPI_Send (Write_W3150, 0, 7, 255);
       SPI_Send (Write_W3150, 0, 8, 0);
       // MAC  0.0.0.1.0.0
       SPI_Send (Write_W3150, 0, 9, 0);
       SPI_Send (Write_W3150, 0, 10, 0);
       SPI_Send (Write_W3150, 0, 11, 0);
       SPI_Send (Write_W3150, 0, 12, 1);
       SPI_Send (Write_W3150, 0, 13, 0);
       SPI_Send (Write_W3150, 0, 14, 0);
       // IP 192.168.10.3
       SPI_Send (Write_W3150, 0, 15, 192);
       SPI_Send (Write_W3150, 0, 16, 168);
       SPI_Send (Write_W3150, 0, 17, 10);
       SPI_Send (Write_W3150, 0, 18, 3);
       //RCR
       SPI_Send (Write_W3150, 0, 0x19, 1);     // 
       //RMSR
       SPI_Send (Write_W3150, 0, 0x1A, 0x02); //8K памяти на сокет 0 прием 
       //TMSR
       SPI_Send (Write_W3150, 0, 0x1B, 0x02); //8K памяти на сокет 0 передачу


       // SOCKET 0 -> UDP
       SPI_Send (Write_W3150, 0x04, 0x00, 0x02);
       // SOCKET 0 Port=1
       SPI_Send (Write_W3150, 0x04, 0x04, 0x00);
       SPI_Send (Write_W3150, 0x04, 0x05, 0x01);
       // SOCKET 0 -> OPEN
       SPI_Send (Write_W3150, 0x04, 0x01, 0x01);

       if ((SPI_Send (Read_W3150, 0x04, 0x03, 0x00))!=0x22){ 

           SPI_Send (Write_W3150, 0x04, 0x01, 0x10);// close
           }


       //- Передатчик -------------------------------

       // IP  получателя  192.168.10.110
       SPI_Send (Write_W3150, 0x04, 0x0C, 192);
       SPI_Send (Write_W3150, 0x04, 0x0D, 168);
       SPI_Send (Write_W3150, 0x04, 0x0E, 10);
       SPI_Send (Write_W3150, 0x04, 0x0F, 110);
       // Port получателя 4096
       SPI_Send (Write_W3150, 0x04, 0x10, 16);
       SPI_Send (Write_W3150, 0x04, 0x11, 0);
       // MAC   получателя для команды SEND_MAC
       SPI_Send (Write_W3150, 0x04, 6, 0xe0);
       SPI_Send (Write_W3150, 0x04, 7, 0x69);
       SPI_Send (Write_W3150, 0x04, 8, 0x95);
       SPI_Send (Write_W3150, 0x04, 9, 0x89);
       SPI_Send (Write_W3150, 0x04, 10, 0x61);
       SPI_Send (Write_W3150, 0x04, 11, 0xdc);

}

//*******************************************************************

char Checked_Received_Socket0(void)
{
 char i = SPI_Send (Read_W3150, 0x04, 0x02, 0x00); // сокет 0 - статус приема/передачи    

 SPI_Send (Write_W3150, 0x04, 0x02, 0xFF);

 if (i & 0x04) return 1; else return 0;

}

//****************************************************************************

void Tranzmite_Socket0(unsigned int num)
{

char s, s1;
int size, rd, sps, i;

//-------- Передача ----------------------------------------------------

   s = SPI_Send (Read_W3150, 0x04, 0x20, 0x00);  // свободная память TX_FS
   size = s*256;
   s = SPI_Send (Read_W3150, 0x04, 0x21, 0x00);  
   size +=s;


   s   = SPI_Send (Read_W3150, 0x04, 0x24, 0x00); // указатель TX_WR ( сдвиг памяти )
   rd  = s*256;
   s   = SPI_Send (Read_W3150, 0x04, 0x25, 0x00);
   rd +=s; 


   sps = rd & 0x0FFF;                             // маска при 4к памяти 
   sps += 0X4000;                                // прибавляем адрес начало памяти TX

   //----------------------------------------
   for(i=0;i!=num+1;i++)                         // пишем данные с адреса 

      {   if (sps==0x5000)sps=0x4000;            // дошли до конца памяти 4к идем в начало

           s  = (sps & 0xff00)>>8;
           s1 = (sps & 0xff);

           SPI_Send (Write_W3150, s, s1, data_out[i]);

           sps+=1;   // следующий адрес байта 
           rd+=1;    // прибавляем размер пакета 
      } 
   //----------------------------------------

   s=(rd & 0xff00)>>8;
   s1=(rd & 0xff);  

   SPI_Send (Write_W3150, 0x04, 0x24, s);       // пишем в TX_WR 
   SPI_Send (Write_W3150, 0x04, 0x25, s1); 

   SPI_Send (Write_W3150, 0x04, 0x01, 0x20);     // команда SEND

   while( SPI_Send (Read_W3150, 0x04, 0x01, 0x00));

   SPI_Send (Write_W3150, 0x04, 0x02, 0xFF);



}

//******************************************************************

Изменено пользователем Herz
Оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Входной буфер приема у компа 64кбайт вроде не должен ограничивать

Изменено пользователем whale_nik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно не включена поддержка больших пакетов (jumbo-frames) в сетевой на стороне компа. Либо там ограничение на размер пакетов какое-то прописано. Я бы в этом направлении разбирался.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас UDP сокет, как я понял. Читаем datasheet от W3150A:

No support IP Fragmentation
Т.е. UDP пакет должен влезть в один Ethernet пакет.

Размер стандартного Ethernet фрейма (payload часть) - 1500 байт. Плюс заголовки IP & UDP, вот 1471 и выходит. Jumbo фреймы похоже не поддерживаются

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас UDP сокет, как я понял. Читаем datasheet от W3150A:

Т.е. UDP пакет должен влезть в один Ethernet пакет.

Размер стандартного Ethernet фрейма (payload часть) - 1500 байт. Плюс заголовки IP & UDP, вот 1471 и выходит. Jumbo фреймы похоже не поддерживаются

 

Спасибо я об этом подозревал, теория с практикой сошлась на 100% )

Изменено пользователем whale_nik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...