Сам прилично времени потратил на мучения с этим кристаллом.
Проверьте следующее:
1. Инициализируется ли чип PHY.
2. Корректно ли отвечает на запись данных.
В своём случае, с этой же библиотекой, был рабочий код:
Код
void ntp_rq(void) {
console_put_fromPGM(TXT_SEND_NTP_RQ); // Сообщаем в консоль, что запрашиваем время.
eth_frame_t *frame = (void*)net_buf; // Начинаем собирать пакет NTP. Берём начало буфера и наносим на него структуру.
ip_packet_t *ip = (void*)(frame->data); // IP пакет инкапсулируется в ETH
udp_packet_t *udp = (void*)(ip->data); // UDP пакет в IP
ntp_data_t *ntp_data = (void*)(udp->data); // А NTP данные находятся в UDP пакете.
// Яйцо в зайце, заяц в утке, утка под кроватью в больнице (>_>)
udp->to_port = htons(123);
udp->from_port = htons(55555); // Случайный номер. Может, там не будет никаких служб...
ntp_data->flags = 0xE3; // Это я взял из TCPDUMP'а со своего ПеКа.
ntp_data->stratum = 0; // Unspecified/invalid
ntp_data->poll = 3; // Polling interval - ХЗ, что это такое.
ntp_data->precision = 16; // 2^16 (О, да, мы ОЧЕНЬ высокого мнения о себе)
ntp_data->root_delay = 0x00010000; // Честно скопировано!
ntp_data->root_dispersion = 0x00010000; // Аналогично!
ntp_data->root_ID = 0; // Empty =]
ntp_data->reference_timestamp = 0; // Мы хотим узнать время.
ntp_data->originate_timestamp = 0; // Мы не знаем и этого.
ntp_data->receive_timestamp = 0; // И этого...
ntp_data->transmit_timestamp = 0; // Типа мы после сброса.
udp->len = sizeof(ntp_data_t); // Размер пакета.
ip->to_addr = inet_addr(10,0,1,1); // Прокатит? Пока что так. Захардварено, потом будет браться из EEPROM'а
udp_send(frame, udp->len);
// Пока-пока, пакетик. (⌒ω⌒)ノ
};
После lan_init() может потребоваться выждать значительно больше 30мс. Попробуйте увеличить время до 1с.
Эта штука может просто не отправить пакет, т.к. ещё нет линка на порту. Кстати, об этом будет запись в том же буфере отправки (полистайте мануал на микросхему - мне помог решить приличное количество вопросов).
Кстати, не вижу, чтобы при отправке пакета заполняли все IP поля - IP адрес и порт как назначения, так и получателя.
Советую включиться сетевой картой в сам модуль и ловить в WireShark пакеты. Очень помогает в отладке забавных казусов.