Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 21:09

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: PIC18F46K22+ENC28J60
СообщениеДобавлено: 16 май 2020, 22:58 
Заглядывает иногда

Зарегистрирован: 04 май 2011, 11:36
Сообщения: 54
Переделываю прошивку для работы ENC28J60 c AVR-GCC на CCS с этого проекта. В принципе большая часть проекта работает, контроллер пингуется и принимает с компа UDP сообщения, но назад не хоть отправлять хоть ты тресни. Ни с UART, ни как зеркало (отправка назад принятого пакета). Кто может глянуть, в чем проблема? Код отправки и обработки пакетов прилагаю.

Код:
// Ответ на UDP-пакет
void udp_reply(eth_frame_t *frame, unsigned int16 len)
{
   ip_packet_t *ip = (void*)(frame->data);
   udp_packet_t *udp = (void*)(ip->data);
   unsigned int16 temp;

   // Рассчитываем длину всего пакета
   len += sizeof(udp_packet_t);

   // Меняем местами порт отправителя и получателя
   temp = udp->from_port;
   udp->from_port = udp->to_port;
   udp->to_port = temp;
   
   // Длина пакета
   udp->len = htons(len);

   // Рассчитываем контрольную сумму от псевдозаголовка + данных
   // Псевдозаголовок = длина пакета+протокол+IP адреса+нормальный udp-заголовок
   // длину пакета+протокол передаём как начальное значение для
   // расчёта контрольной суммы
   // ip адреса берём из заголовка IP-пакета (udp-пакет - 8)
   udp->cksum = 0;
   udp->cksum = ip_cksum(len + IP_PROTOCOL_UDP,
      (unsigned int8*)udp-8, len+8);
   printf("UDP ->\n\r");
   ip_reply(frame, len);

//При приеме UDP-пакета
void udp_packet(eth_frame_t *frame, unsigned int16 len)
{
    ip_packet_t *ip = (void*)(frame->data);
    udp_packet_t *udp = (void*)(ip->data);
    unsigned int8 *data = udp->data;
    unsigned int8 i, count;

    // Отправляем данные в UART
    for(i = 0; i <= len; ++i)
        uart_write(data[i]);
    delay_ms(10);
    udp_reply(frame, len);   

    // Возвращаем компу, то  что на приходило
    // с момента последнего обмена
    //count = uart_rx_count();
    //if(count)
    //{
        //for(i = 0; i < count; ++i)
            //data[i] = uart_read();
        //udp_reply(frame, count);
    //}
}

void main()
{
   unsigned int16 len;
   eth_frame_t *frame = (void*)net_buf;
   set_tris_a(0b00000000);
   set_tris_b(0b00010001);
   set_tris_c(0b00000000);
   set_tris_d(0b10000000);
   
   port_B_pullups(0xFF);
   port_E_pullups(0xFF);
   
   printf("ENC28J60\n\r");
   // Инициализируем ENC28J60
   enc28j60_init(mac_addr);
   
   //Инициализируем UART
   uart_init();

   enable_interrupts(GLOBAL);
   
   while(TRUE)
   {
      if((len = enc28j60_recv_packet(net_buf, sizeof(net_buf)))) eth_filter(frame, len);
   }
}


Судя по логам в функцию udp_reply ну и дальше, но до кома сообщение не доходит. Остальное все работает. И пинг и принимает UDP пакеты с компа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PIC18F46K22+ENC28J60
СообщениеДобавлено: 16 май 2020, 23:07 
Заглядывает иногда

Зарегистрирован: 14 апр 2020, 08:57
Сообщения: 168
снифер запустите и посмотрите....

len = enc28j60_recv_packet(net_buf, sizeof(net_buf))

sizeof поаккуратнее....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PIC18F46K22+ENC28J60
СообщениеДобавлено: 16 май 2020, 23:24 
Заглядывает иногда

Зарегистрирован: 04 май 2011, 11:36
Сообщения: 54
SergP01 писал(а):
снифер запустите и посмотрите....


Какой только, я с сетью до этого особо как-то не работал, вот решил попробовать. Какой сниффер посоветуете чтобы не шибко замученный чтобы не разбираться еще и с ним долго.

SergP01 писал(а):
len = enc28j60_recv_packet(net_buf, sizeof(net_buf))

sizeof поаккуратнее....


тут вряд ли что-то не так. Сами Ethernet пакеты которые тут ловятся из enc28j60 работает отлично. Говорю девайс и пингуется и принимает сообщения к компа. Проблема точно где-то в функции отправки UDP пакета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PIC18F46K22+ENC28J60
СообщениеДобавлено: 16 май 2020, 23:42 
Заглядывает иногда

Зарегистрирован: 14 апр 2020, 08:57
Сообщения: 168
Buster писал(а):
SergP01 писал(а):
снифер запустите и посмотрите....


Какой только, я с сетью до этого особо как-то не работал, вот решил попробовать. Какой сниффер посоветуете чтобы не шибко замученный чтобы не разбираться еще и с ним долго.

SergP01 писал(а):
len = enc28j60_recv_packet(net_buf, sizeof(net_buf))

sizeof поаккуратнее....


тут вряд ли что-то не так. Сами Ethernet пакеты которые тут ловятся из enc28j60 работает отлично. Говорю девайс и пингуется и принимает сообщения к компа. Проблема точно где-то в функции отправки UDP пакета.


а проц у вас какой.... какая память? ...... sizeof - вам байты отдаёт.... а не количество элементов в массиве...

char a[2];

ежели данные меньше 16 бит хранится не умеют.... получите sizeof(а) =4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: PIC18F46K22+ENC28J60
СообщениеДобавлено: 23 май 2020, 22:26 
Заглядывает иногда

Зарегистрирован: 04 май 2011, 11:36
Сообщения: 54
Все разобрался, в чем было дело. Проблема точно была в функции sizeof, спасибо за подсказку. У автора в AVR GCC она при применении к структуре пакета она возвращала размер заголовка пакета, без размера данных. А у меня в CCS размер заголовка пакета плюс один байт. Выбросил я вообще sizeof, а место этого забил размера заголовков различных пакетов как константы и все сразу заработало. Если кому интересно скидываю рабочий проект.

p.s. Настроил еще фильтр пакетов, а то при работе с сетью на неуправляемом коммутаторе enc28j60 просто захлебывалась пакетами.


Вложения:
PICK ENC.rar [9.69 Кб]
Скачиваний: 68
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB