whale 1 28 августа, 2016 Опубликовано 28 августа, 2016 (изменено) · Жалоба Господа, 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); } //****************************************************************** Изменено 28 августа, 2016 пользователем Herz Оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 28 августа, 2016 Опубликовано 28 августа, 2016 (изменено) · Жалоба Входной буфер приема у компа 64кбайт вроде не должен ограничивать Изменено 28 августа, 2016 пользователем whale_nik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 28 августа, 2016 Опубликовано 28 августа, 2016 · Жалоба Короче разбил все данные на пакеты по 512 байт и забил, тему можно закрыть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kane 0 29 августа, 2016 Опубликовано 29 августа, 2016 · Жалоба Возможно не включена поддержка больших пакетов (jumbo-frames) в сетевой на стороне компа. Либо там ограничение на размер пакетов какое-то прописано. Я бы в этом направлении разбирался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 29 августа, 2016 Опубликовано 29 августа, 2016 · Жалоба У вас UDP сокет, как я понял. Читаем datasheet от W3150A: No support IP FragmentationТ.е. UDP пакет должен влезть в один Ethernet пакет. Размер стандартного Ethernet фрейма (payload часть) - 1500 байт. Плюс заголовки IP & UDP, вот 1471 и выходит. Jumbo фреймы похоже не поддерживаются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 1 29 августа, 2016 Опубликовано 29 августа, 2016 (изменено) · Жалоба У вас UDP сокет, как я понял. Читаем datasheet от W3150A: Т.е. UDP пакет должен влезть в один Ethernet пакет. Размер стандартного Ethernet фрейма (payload часть) - 1500 байт. Плюс заголовки IP & UDP, вот 1471 и выходит. Jumbo фреймы похоже не поддерживаются Спасибо я об этом подозревал, теория с практикой сошлась на 100% ) Изменено 29 августа, 2016 пользователем whale_nik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться