Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-окт-20 08:14

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




Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 2014-ноя-11 12:13 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 82
Откуда: ЗАО "Московский Прожекторный завод"
Dmit_rzn писал(а):
а есть ли возможность подсоединить микроконтроллер 1986ВЕ1Т к компьютеру по ethernet и производить обмен информации без реализации протокола TCP/IP (на канальном уровне по MAC-адресу)?


Извините, что отвечаю вместо специалистов, но для первого приближения будет полезно :)
Такая возможность есть, но она никому не нужна. Потому что придётся писать низкоуровневый софт для компьютера, который будет работать с драйвером сетевой карты. Нужно ли Вам это? Думаю, для нормального программиста, знакомого с сетевыми протоколами более очевидным является решение на базе этих сетевых протоколов, т.к. операционная система компьютера, для которого тоже придётся писать программу, предоставляет хорошие возможности для работы с ними. Опять же, сетевые протоколы позволяют делать много хороших вещей, таких как контроль доставки, контроль целостности, и всё это уже есть в стеке протоколов, который установлен в ОС компьютера. Зачем заново "пилить" свой низкоуровневый протокол, на базе MAC-адресов? Только ради того, чтобы не разбираться с готовыми стеками протоколов для контроллера? Тогда придётся разбираться с сетевой картой компьютера на низком уровне.
То есть гипотетически это сделать можно. Но нужно ли?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-14 09:09 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 82
Откуда: ЗАО "Московский Прожекторный завод"
Простите за назойливость, но не понятно, как пользоваться telnet- и web-серверами? То, что программа компилируется - это конечно здорово, но хотелось бы посмотреть на его работу.
Если я правильно понял, то для web-сервера необходимо подключить отладочную плату к компьютеру, настроить сетевую плату и протоколы (выбрать скорость и режим передачи, а также IP-адрес и версию протокола IP). На компьютере установить скорость 100 или 10 мбит/с? полу- или полный дуплекс? использовать IPv4 или IPv6? IP-адрес получать автоматически или использовать готовый? После этого нужно запустить браузер, и что-то ввести в адресной строке. Какой адрес (url, IP-адрес?), какой порт?
Аналогично с telnet- - как его использовать? Как вживую посмотреть на его работу?

У меня при подключении платы к компьютеру даже соединение по локальной сети не определяется, т.е., если я правильно понял, обмена по ARP-протоколу между компьютером и платой не произошло...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-14 11:45 
Не в сети

Зарегистрирован: 2014-май-15 11:04
Сообщения: 124
Откуда: Москва
  • Думаю, что в папке с проектом есть Readme файл.
  • ARP тут не причём. Наличие соединения определяется наличием Link-импульсов. ARP-протокол используется для определения MAC-адреса получателя посылки и для проверки сети на занятость конкретного IP-адреса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-14 11:48 
Не в сети

Зарегистрирован: 2011-апр-21 07:31
Сообщения: 31
Откуда: АО "ПКК Миландр"
надо задать IP-адрес сервера и обращаться к нему
в примере он задается в main.c:124 (в ./platform/.. )

...
uip_ipaddr(&ipaddr, 192,168,1,163);
uip_sethostaddr(&ipaddr);

uip_ipaddr(&ipaddr, 192,168,1,1);
uip_setdraddr(&ipaddr);

uip_ipaddr(&ipaddr, 255,255,255,0);
uip_setnetmask(&ipaddr);

...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-17 10:57 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 82
Откуда: ЗАО "Московский Прожекторный завод"
רגוזין רומאן писал(а):
  • Думаю, что в папке с проектом есть Readme файл.
  • ARP тут не причём. Наличие соединения определяется наличием Link-импульсов. ARP-протокол используется для определения MAC-адреса получателя посылки и для проверки сети на занятость конкретного IP-адреса.

К сожалению, судя по всему Readme - файла в папке с проектом нет. А описание проекта, выложенное в этой же теме в виде pdf-файла - не содержит ни одного описания функции и не содержит ни одного действия, которое нужно произвести с программой, чтобы получить какой-то результат.
Спасибо, я в курсе, для чего используется ARP-протокол :) Мне показалось, что мой компьютер определяет подключение по локальной сети при подключении платы в зависимости от настройки IP-адреса компьютера, но я ошибся - только от настроек скорости передачи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-17 11:30 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 82
Откуда: ЗАО "Московский Прожекторный завод"
sva писал(а):
надо задать IP-адрес сервера и обращаться к нему
в примере он задается в main.c:124 (в ./platform/.. )

...
uip_ipaddr(&ipaddr, 192,168,1,163);
uip_sethostaddr(&ipaddr);

uip_ipaddr(&ipaddr, 192,168,1,1);
uip_setdraddr(&ipaddr);

uip_ipaddr(&ipaddr, 255,255,255,0);
uip_setnetmask(&ipaddr);

...


Спасибо, я пробовал использовать эти IP-адреса - не помогает. Думаю, проблема в ревизии платы. У меня третья ревизия, нужно разобраться с настройкой тактирования... К сожалению, фукнция ClkConfig из примера ICMP echo для третьей ревизии платы (с небольшими изменениями) в этом примере к положительному результату не привела.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-18 17:20 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 733
Откуда: АО "ПКК Миландр"
попробуйте собрать этот проект


Вложения:
uIP_for_1986VE1T.rar [1.58 МБ]
Скачиваний: 451
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2014-ноя-20 09:06 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 82
Откуда: ЗАО "Московский Прожекторный завод"
Petr писал(а):
попробуйте собрать этот проект


Собрал, всё работает! Спасибо!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-мар-20 15:05 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 438
В любезно выложенной реализации uIP функция int tapdev_read(void *pPacket) для 1986ВЕ1 реализована через вызов:
Код:
int EMAC_ReadPacket(void *pPacket)
{
   uint16   i;
   uint16   tmp[2];
   uint32   head;
   uint32   tail;
   uint32   *src;
   uint32   *dst;
   uint32   size;
   uint16   space[2];

   if(!eth0_RG->STAT.fld.RCOUNT)
      {return   0;}

   head = (uint32)eth0_BF + (uint32) eth0_RG->R_Head;
   tail = (uint32)eth0_BF + (uint32) eth0_RG->R_Tail;

   if(tail>head)
   {
      space[0] = tail-head;
      space[1] = 0;
   } else
   {
      space[0] = (uint32)RBUFF.end - head;
      space[1] = tail - (uint32)RBUFF.base;
   }
   
   src = RBUFF.ptr;
   dst = pPacket;

   *((uint32*)tmp) = *src++;
   space[0] -=4;
   if(src >= RBUFF.end)
      src = RBUFF.base;
   
   size = (tmp[0]+sizeof(uint32)-1)/sizeof(uint32);

   if(tmp[0] <= space[0])
   {
      for(i=0; i<size; i++)
         *dst++ = *src++;
   } else
   {
      size = size -space[0]/sizeof(uint32);
      for(i=0; i<(space[0]/sizeof(uint32)); i++)
         *dst++ = *src++;
      src = RBUFF.base;
      for(i=0; i<size; i++)
         *dst++ = *src++;
   }
   if(src >= RBUFF.end)
      src = RBUFF.base;

   RBUFF.ptr = src;   
   eth0_RG->R_Head = (uint16) src;
   eth0_RG->STAT.fld.RCOUNT--;

   return   tmp[0];
}

Вопрос, что возвращает функция через tmp[0], если:
1 Массив tmp[2] не инициализирован, по опыту работы с "Кейл" может содержать, что угодно;
2 В tmp[0] ни разу ничего не пишется;
3 Первое упоминание в строке size = (tmp[0]+sizeof(uint32)-1)/sizeof(uint32), т.е. в tmp[0] уже что-то должно быть, что? Если это 0 по умолчанию, то зачем складывать с 0?
4 Второе упоминание tmp[0] в строке if(tmp[0] <= space[0]), опять же для сравнения что-то должно быть?
5 Третье упоминание в return tmp[0]
Понятно, что ф-я должна вернуть кол-во прочитанного. Но как работает, увы :(.
Кстати, в реализации EMAC_ReadPacket для 5600ВГ1 такого шаманизма нет :).

И да, ф-я компилится "Кайлом" с:
src\dev\OPORA\OPORA_emac.c(399): warning: #767-D: conversion from pointer to smaller integer
в строке eth0_RG->R_Head = (uint16) src;

P.S. Особо одарённые могут подумать, что это попытка не явно наложить локальные переменные на pPacket, который по сути uip_buf[].
Для хакеров, конечно красиво, но для пром.автоматики ИМХО лишнее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-мар-23 21:08 
Не в сети

Зарегистрирован: 2014-июл-07 17:48
Сообщения: 17
ЧумА писал(а):
В любезно выложенной реализации uIP функция int tapdev_read(void *pPacket) для 1986ВЕ1 реализована через вызов:
Открыть
Код:

int EMAC_ReadPacket(void *pPacket)
{
   uint16   i;
   uint16   tmp[2];
   uint32   head;
   uint32   tail;
   uint32   *src;
   uint32   *dst;
   uint32   size;
   uint16   space[2];

   if(!eth0_RG->STAT.fld.RCOUNT)
      {return   0;}

   head = (uint32)eth0_BF + (uint32) eth0_RG->R_Head;
   tail = (uint32)eth0_BF + (uint32) eth0_RG->R_Tail;

   if(tail>head)
   {
      space[0] = tail-head;
      space[1] = 0;
   } else
   {
      space[0] = (uint32)RBUFF.end - head;
      space[1] = tail - (uint32)RBUFF.base;
   }
   
   src = RBUFF.ptr;
   dst = pPacket;

   *((uint32*)tmp) = *src++;
   space[0] -=4;
   if(src >= RBUFF.end)
      src = RBUFF.base;
   
   size = (tmp[0]+sizeof(uint32)-1)/sizeof(uint32);

   if(tmp[0] <= space[0])
   {
      for(i=0; i<size; i++)
         *dst++ = *src++;
   } else
   {
      size = size -space[0]/sizeof(uint32);
      for(i=0; i<(space[0]/sizeof(uint32)); i++)
         *dst++ = *src++;
      src = RBUFF.base;
      for(i=0; i<size; i++)
         *dst++ = *src++;
   }
   if(src >= RBUFF.end)
      src = RBUFF.base;

   RBUFF.ptr = src;   
   eth0_RG->R_Head = (uint16) src;
   eth0_RG->STAT.fld.RCOUNT--;

   return   tmp[0];
}
Закрыть

Вопрос, что возвращает функция через tmp[0], если:
1 Массив tmp[2] не инициализирован, по опыту работы с "Кейл" может содержать, что угодно;
2 В tmp[0] ни разу ничего не пишется;
3 Первое упоминание в строке size = (tmp[0]+sizeof(uint32)-1)/sizeof(uint32), т.е. в tmp[0] уже что-то должно быть, что? Если это 0 по умолчанию, то зачем складывать с 0?
4 Второе упоминание tmp[0] в строке if(tmp[0] <= space[0]), опять же для сравнения что-то должно быть?
5 Третье упоминание в return tmp[0]
Понятно, что ф-я должна вернуть кол-во прочитанного. Но как работает, увы :(.
Кстати, в реализации EMAC_ReadPacket для 5600ВГ1 такого шаманизма нет :).

И да, ф-я компилится "Кайлом" с:
src\dev\OPORA\OPORA_emac.c(399): warning: #767-D: conversion from pointer to smaller integer
в строке eth0_RG->R_Head = (uint16) src;

P.S. Особо одарённые могут подумать, что это попытка не явно наложить локальные переменные на pPacket, который по сути uip_buf[].
Для хакеров, конечно красиво, но для пром.автоматики ИМХО лишнее.


Пишется в tmp здесь
Код:
*((uint32*)tmp) = *src++;

по сути читается поле состояния приема пакета, в котором и содержится размер принятого пакета в первых 16 битах. После чего достается сам пакет из линейного буфера.
Сравнение
Код:
tmp[0] <= space[0]

необходимо для того, чтобы понять как принят пакет, т.е. часть пакета может быть в конце буфера, а оставшаяся будет идти с начала буфера. Достаточно понятно свободное место от "головы" и "хвоста" вычисляется тут:
Код:
   
if(tail>head)
   {
      space[0] = tail-head;
      space[1] = 0;
   } else
   {
      space[0] = (uint32)RBUFF.end - head;
      space[1] = tail - (uint32)RBUFF.base;
   }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-мар-24 08:59 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 438
Большое спасибо за разъяснения.
Цитата:
Пишется в tmp здесь

Да, слона-то я и не заметил (с).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-апр-08 16:52 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 438
Здешний порт uIP родился давно и до рождения SPL, пример работы с Ethernet в SPL использует другой стек. Короче, делаем попытку подружить uIP с SPL.
Соответственно на основе SPL и заглядывая в упомянутый пример написана прослойка для uIP - функции tapdev_init(), tapdev_read(), tapdev_send()
Собственно код:
Открыть
Код:
#include "..//MDR_Lib//MDR32F9Qx_rst_clk.h"
#include "..//MDR_Lib//MDR32F9Qx_eth.h"

#include   "tapdev.h"
//#include   "config.h"

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
void tapdev_init(uint8* pMACaddr)
{
   static ETH_InitTypeDef  ETH_InitStruct;

   /* Reset ehernet clock settings */
   ETH_ClockDeInit();

   RST_CLK_PCLKcmd(RST_CLK_PCLK_DMA, ENABLE);

   /* Enable HSE2 oscillator */
   RST_CLK_HSE2config(RST_CLK_HSE2_ON);
   if(RST_CLK_HSE2status() == ERROR)
      while(1); /* Infinite loop */

   /* Config PHY clock */
   ETH_PHY_ClockConfig(ETH_PHY_CLOCK_SOURCE_HSE2, ETH_PHY_HCLKdiv1);

   /* Init the BRG ETHERNET */
   ETH_BRGInit(ETH_HCLKdiv1);

   /* Enable the ETHERNET clock */
   ETH_ClockCMD(ETH_CLK1, ENABLE);

   /* Reset to default ethernet settings */
   ETH_DeInit(MDR_ETHERNET1);

   /* Init ETH_InitStruct members with its default value */
   ETH_StructInit((ETH_InitTypeDef * ) &ETH_InitStruct);
   /* Set the speed of the chennel */
   ETH_InitStruct.ETH_PHY_Mode = ETH_PHY_MODE_AutoNegotiation;
   ETH_InitStruct.ETH_Transmitter_RST = SET;
   ETH_InitStruct.ETH_Receiver_RST = SET;
   /* Set the buffer mode */
   ETH_InitStruct.ETH_Buffer_Mode = ETH_BUFFER_MODE_LINEAR;

   ETH_InitStruct.ETH_Source_Addr_HASH_Filter = DISABLE;

   /* Set the MAC address. */
   ETH_InitStruct.ETH_MAC_Address[2] = (pMACaddr[0] << 8) | pMACaddr[1];
   ETH_InitStruct.ETH_MAC_Address[1] = (pMACaddr[2] << 8) | pMACaddr[3];
   ETH_InitStruct.ETH_MAC_Address[0] = (pMACaddr[4] << 8) | pMACaddr[5];

   /* Set the buffer size of transmitter and receiver */
   ETH_InitStruct.ETH_Dilimiter = 0x1000;
   
   /* Наверное надо добавить по рекомендации Errata 019 R_CFG.CF_EN must be ENABLE, в примере SPL нет*/
   ETH_InitStruct.ETH_Control_Frames_Reception = ENABLE;
   
/* Соответствует настройкам упомянутого порта uIP, с настройками SPL тоже не работает :)*/
   ETH_InitStruct.ETH_Transmitter_Event_Mode = ETH_TRANSMITTER_EVENT_MODE_XFIFO_ALMOST_EMPTY;
   ETH_InitStruct.ETH_Receiver_Event_Mode = ETH_RECEIVER_EVENT_MODE_RFIFO_NOT_EMPTY;

   /* Init the ETHERNET 1 */
   ETH_Init(MDR_ETHERNET1, (ETH_InitTypeDef *) &ETH_InitStruct);

   /* Enable PHY module */
   ETH_PHYCmd(MDR_ETHERNET1, ENABLE);

   MDR_ETHERNET1->ETH_IFR = 0xFFFF; // добавлено от безысходности :)
   MDR_ETHERNET1->ETH_IMR = 0xFFFF;
   
   /* Enable ETHERNET1 RX & TX */
   ETH_Start(MDR_ETHERNET1);
}

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
int   tapdev_read(void *pPacket)
{
ETH_StatusPacketReceptionTypeDef ETH_StatusPacketReceptionStruct;

uint16_t status_reg = ETH_GetMACStatusRegister(MDR_ETHERNET1);


if(status_reg & ETH_STAT_R_COUNT_Msk)
   {
   if(MDR_ETHERNET1->ETH_R_Head != MDR_ETHERNET1->ETH_R_Tail)
      {
      ETH_StatusPacketReceptionStruct.Status = ETH_ReceivedFrame(MDR_ETHERNET1, (uint32_t *)pPacket);
      return(ETH_StatusPacketReceptionStruct.Fields.Length);
      }
   }
/* так тоже не работает :(
if(MDR_ETHERNET1->ETH_R_Head != MDR_ETHERNET1->ETH_R_Tail)
   {
   ETH_StatusPacketReceptionStruct.Status = ETH_ReceivedFrame(MDR_ETHERNET1, (uint32_t *)pPacket);
   return(ETH_StatusPacketReceptionStruct.Fields.Length);
   }
*/
return(0);
}

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
void tapdev_send(void *pPacket, int size)
{
ETH_SendFrame(MDR_ETHERNET1, (uint32_t *) pPacket, (uint32_t) size);
}
Закрыть


Материальная база - отладочный комплект ВЕ1 rev.4, сам ВЕ1 рев.3. ВЕ1 запущен на 128 МГц (HSE*16), Ethernet от наплатного кварца 25 МГц.
Реализован пример из uIP типа example-mainloop-with-arp.c По сути в бесконечном цикле производится вызов tapdev_read().
Теперь вопрос, что не так в настройках Ethernet, если ARP запрос принимается успешно и успешно отправляется ARP ответ, а вот других пакетов, например ICMP не принимается вообще. Причём uIP здесь непричём :), функция ETH_ReceivedFrame не вызывается или упорно возвращает 0 (в исходнике два варианта вызова) при бомбардировке ping-ом, но на ARP запрос имеем ARP ответ.Средство просмотра -Wireshark на машине под Win7, которая и генерит ping. На время pinga установлена BP на вызов ETH_ReceivedFrame().


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-апр-09 16:08 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 438
Продолжаем разговор с интересным собеседником :).
Опытным путём установлено, что в tapdev_init() должно быть ETH_InitStruct.ETH_Receive_All_Packets = ENABLE, чего нет почему-то в "Миландровском" примере идущем с STL :(. Т.е. пример, на первый взгляд, не работоспособен. Или нет?
Теперь снова вопросы:
1 Если задать маску прерываний MDR_ETHERNET1->ETH_IMR = 0xFFFF, написать пустой обработчик прерывания и разрешить таковые NVIC_EnableIRQ (ETHERNET_IRQn) при ping-овании происходит следующее:
- обработчик прерывания срабатывает с завидной регулярностью;
- функция tapdev_read() в виде:
if(MDR_ETHERNET1->ETH_R_Head != MDR_ETHERNET1->ETH_R_Tail)
{
ETH_StatusPacketReceptionStruct.Status = ETH_ReceivedFrame(MDR_ETHERNET1, (uint32_t *)pPacket);
return(ETH_StatusPacketReceptionStruct.Fields.Length);
}
вызываемая в бесконечном цикле постоянно возвращает "0", т.е. нет входящих. Стоит запретить прерывание и входящие вновь заходят...
Что не так?
2 Если на 128 МГц начинать читать входящие не в big-loop, а по прерыванию, что с Errata 0021, будут пропуски пакетов?
3 Где посмотреть рекомендации по настройке регистров JitterWnd, IPG, PSC, BAG.
4 Errata 0019 рекомендует задать CF_EN=1 в регистре R_CFG. В упомянутом выше примере этого не сделано, почему?
Что будет, если задать CF_EN=1 и одновременно прописать злополучный 0х8808 в HASH-таблицу?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-апр-10 09:25 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 438
Ещё засада, если ping-овать с запущеным Wireshark, то ping-уется с вероятностью 98%, если Wireshark закрыть, то вероятность ping-а 0%. ARP работает в любом случае.
Может господа разработчики разъяснят таки по настройкам Ethernet?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-апр-13 14:02 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-июн-26 17:31
Сообщения: 10
sva писал(а):
1. в зависимости от железа - прописываете один из путей в конфиге каталогов поиска для компилятора


Можно подсказку:
- Это где прописывается конкретно в кейле? (С кейлом дело раньше не имел).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3  След.

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 2


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB