>>Пара вопросов по UDP.
>> 1. Нужно ли после срабатывания прерывания SocketInit вызывать команду
>> cCONNECT или cLISTEN, если не нужно, то почему в регистре
>> SOCK_STATUS значение 0x0E (инициализация завершена), а не 0x0F
>> (режим UDP)?
никаких cCONNECT или cLISTEN вызывать не нужно. Вот пример типичной инициализации сокета UDP:
void w3100a_init_udp_socket(USHORT udp_port)
{
w3100a_write_reg(W3100A_C0_CR, CCLOSE);
while (w3100a_read_reg(W3100A_C0_SSR) != SOCK_CLOSED);
w3100a_write_reg(W3100A_C0_SOPR, SOCK_DGRAM | SOCKOPT_BROADCAST);
w3100a_write_word_reg(W3100A_C0_SPR, udp_port);
w3100a_write_reg(W3100A_C0_CR, CSOCK_INIT);
while (!(w3100a_read_reg(W3100A_C0_ISR) & SSOCK_INIT_OK));
}
>> 2. Нужно ли инициализировать укзатели, как это делается при TCP/IP?
нет, не нужно
>> Вообще у меня такая проблема - микросхема данные принимает, а
>> передавать никак не хочет, вернее передавать-то передает, а вот на
>>машине я их поймать не могу, причем раньше делал на TCP/IP - все
>> работало.
Про это я уже где-то писал. Повторю:
У W3100A есть весьма неприятная бага с ARP. При работе в режиме датаграмм (UDP), он заносит в таблицу ARP MAC-адрес источника первого принятого пакета и дальше почему-то при формирование пакета на IP-адрес отличный от IP-адреса источника первого пакета все равно в заголовок MAC пихает MAC-адрес первого принятого пакета. Правда, широковещательные пакеты отправляет без проблем.
Разработчики, кстати, признали эту ошибку в чипе на своем сайте (http://www.wiznet.co.kr) в разделе Q&A. Вот их ответ:
Num | 578's Reply
Name | WIZnet [support@wiznet.co.kr]
Date | 2003-12-08 14:48
Title | RE: MAC address problem
Dear Sir,
Thank you for your detailed information.
It looks likely that you want to send data to multiple
destination in UDP mode. In this case there's no way to force
the W3100A to renew ARP, I'm afraid. Please, re-create a
UDP socket when you send data to different destinations in
UDP mode. It'll work. I'm so sorry about this inconvenience.
Best Regards,
Fabian.