Миландр

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

Часовой пояс: UTC+03:00




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

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


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

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

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


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

Зарегистрирован: 2014-май-15 11:04
Сообщения: 133
Откуда: Москва
  • Думаю, что в папке с проектом есть 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
Сообщения: 93
Откуда: ЗАО "Московский Прожекторный завод"
רגוזין רומאן писал(а):
  • Думаю, что в папке с проектом есть Readme файл.
  • ARP тут не причём. Наличие соединения определяется наличием Link-импульсов. ARP-протокол используется для определения MAC-адреса получателя посылки и для проверки сети на занятость конкретного IP-адреса.
К сожалению, судя по всему Readme - файла в папке с проектом нет. А описание проекта, выложенное в этой же теме в виде pdf-файла - не содержит ни одного описания функции и не содержит ни одного действия, которое нужно произвести с программой, чтобы получить какой-то результат.
Спасибо, я в курсе, для чего используется ARP-протокол :) Мне показалось, что мой компьютер определяет подключение по локальной сети при подключении платы в зависимости от настройки IP-адреса компьютера, но я ошибся - только от настроек скорости передачи.


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

Зарегистрирован: 2014-май-20 09:07
Сообщения: 93
Откуда: ЗАО "Московский Прожекторный завод"
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
Сообщения: 734
Откуда: АО "ПКК Миландр"
попробуйте собрать этот проект


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

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


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

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 548
В любезно выложенной реализации 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
Сообщения: 548
Большое спасибо за разъяснения.
Цитата:
Пишется в tmp здесь
Да, слона-то я и не заметил (с).


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

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 548
Здешний порт 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
Сообщения: 548
Продолжаем разговор с интересным собеседником :).
Опытным путём установлено, что в 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
Сообщения: 548
Ещё засада, если ping-овать с запущеным Wireshark, то ping-уется с вероятностью 98%, если Wireshark закрыть, то вероятность ping-а 0%. ARP работает в любом случае.
Может господа разработчики разъяснят таки по настройкам Ethernet?


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

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 46 сообщений ]  На страницу « 1 2 3 4 »

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB