Я бы взял stm32f407, но корпус великоват, да и PHY все равно снаружи ставить.
Более менее эквивалент w5200 - ENC424J600, но после enc28j60 как-то я опасаюсь.
По w5200
Интересно, что при снижении тактовой частоты процессора скорость передачи падает практически один в один.
А при отправке пакета через восемь сокетов сразу в некоторые моменты скорость передачи достигает максимальной. Подключение напрямую, без коммутатора.
CODE
int16_t _UDPSend(uint8_t s, const uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
{
uint8_t status=0;
uint16_t ret=0;
if (((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || ((port == 0x00)))
return 0;
status = getSn_SR(s);
if(status == SOCK_CLOSED)
return ERROR_CLOSED;
if((IINCHIP_READ(Sn_MR(s))&0x0F) != Sn_MR_UDP)
return ERROR_NOT_UDP_SOCKET;
if(status != SOCK_UDP)
return ERROR_NOT_UDP_SOCKET;
//-----------------------
/* wait to process the command... */
while(IINCHIP_READ(Sn_CR(s)));
while (sending[s] && ((IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK))
{
if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT)
{
/* clear interrupt */
IINCHIP_WRITE(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */
sending[s] = 0;
return ERROR_TIME_OUT;
}
}
IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK);
sending[s] = 0;
ClearSubnet(); // for errata
//------------------
if (len > getIINCHIP_TxMAX(s))
ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
else
ret = len;
IINCHIP_WRITE(Sn_DIPR0(s),addr[0]);
IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]);
IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]);
IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]);
IINCHIP_WRITE(Sn_DPORT0(s),(uint8_t)((port & 0xff00) >> 8));
IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8_t)(port & 0x00ff));
// copy data
send_data_processing(s, (uint8_t *)buf, ret);
SetSubnet(Subnet); // for errata
IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);
sending[s] = 1;
return ret;
}