Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega16a + enc28j60
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Alexsandr000
Добрый день Уважаемые форумчане!

Кто может мне помощь в решении проблемы:
есть макетки ATmega16A и enc28j60
в соответствии с данной темой http://we.easyelectronics.ru/electro-and-p...s-enc28j60.html
написал прошивку, но как всегда ничего не работает crying.gif
Уже весь мозг сломал.

Вроде все сделал как указано на сайте, но что-то не стреляет.

Проект прикладываю. Кто сможет, помогите
AlanDrakes
Сам прилично времени потратил на мучения с этим кристаллом.
Проверьте следующее:
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 пакеты. Очень помогает в отладке забавных казусов.
Alexsandr000
Не поделишься готовым проектом?
AlanDrakes
Библиотеку не менял.
Сейчас попробую вырезать необходимое для работы сети.

Прилагаю файл. Всё должно компилироваться.
Из особенностей работы - контроллер большую часть времени находится в спячке, из которой его пробуждает таймер. Если это не нужно - закомментировать "asm("sleep");" в main():while(1)

Все необходимые файлы вложил, должно работать.
Собиралось под ATMega1284p, потому в какой-то мере код нужно будет править. Порой сильно.
Нажмите для просмотра прикрепленного файла
Забавно. Запрещено загружать .c файл. А .txt - можно.
Alexsandr000
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.