×

Внимание

Форум находится в режиме только для чтения.

Осваиваем Ethernet в STM32

9 года 11 мес. назад #5795 от
ответил в теме Re: Осваиваем Ethernet в STM32

Евгений_М пишет: Доброго времени суток ! Долго мучился, набегами правда, но удалось прикрутить демку Webserver_Demo_uIP к плате SK-MSTM32F107 купленой в промэлектронике.
Светодиодами мигаю, потенцер кручу, доволен несказанно. Выкладываю если кому поможет.
А вопрос следующий... Необходимо будущим устройством на этой основе не через Web интерфейс работать а через сокеты. Так понимаю нужно открутить надстройку HTTP/
Измучал я уже этот фаил в проекте (httpd.c). Две демки, написеные на Билдере на разных
компах работают, а с платой работают но криво. Сам коннект TCP стабильный. Шлёшь GET_
конект рвётся. И ещё, а где стринговый дескриптор у TCP ?

Вложения:
9 года 11 мес. назад #5796 от
ответил в теме Осваиваем Ethernet в STM32

minikh пишет:

Alena пишет: PDF во вложении

Вот бы еще рабочий пример для stm32f107 посмотреть, то я был бы счастлив )))

Выложила все файлы, которые были. Удачных разработок :)
9 года 11 мес. назад - 9 года 11 мес. назад #5798 от Alex888
Alex888 ответил в теме Осваиваем Ethernet в STM32
Здравствуйте. Помогите пожалуйста. Пользуюсь вашими мануалами по Ethernet в STM32 (Спасибо за них), все пошло хорошо, но потом появилась проблема, которую не могу решить. Передача сообщения работает хорошо, а вот прием - только один раз. Принимает один раз и больше не хочет. Хочу сделать самый простой пример, просто принимаю пакет с компа (ping) и записываю его в свой массив.
Работаю на железе STM32F107 + RTL8201 в Keil, отладка с помощью JLink.

Инициализация стандартная. Не думаю что проблема в ней, но все таки приведу в сокращении)
ETH_InitTypeDef ETH_InitStructure;
ETH_DMADESCTypeDef  DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];
u8 Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE]; 

int main(void)
{
SysTick_Config(SystemCoreClock/1000);
RCC_Configuration();
NVIC_Configuration();
GPIO_PinRemapConfig(GPIO_Remap_ETH, DISABLE); 
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_MII);
RCC->CFGR |= RCC_CFGR_MCO_HSE;
GPIO_Configuration();
  
 ETH_DeInit();
 ETH_SoftwareReset();
 while(ETH_GetSoftwareResetStatus()==SET);

 ETH_StructInit(&ETH_InitStructure);
 /*------------------------   MAC   -----------------------------------*/
 ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable ;  
 ETH_InitStructure.ETH_Speed = ETH_Speed_100M;                                      
 ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
 ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
 ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
 ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;  
 ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;
 ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable;      
 ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
 ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; 
 ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; 
 /* Configure ETHERNET */
 Value = ETH_Init(&ETH_InitStructure, PHY_ADDRESS);
 
 /* Initialize Tx Descriptors list: Chain Mode */
 ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
 /* Initialize Rx Descriptors list: Chain Mode  */
 ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);

 //Разрешаем прием
 DMARxDscrTab -> Status = ETH_DMARxDesc_OWN;
 
 /* Enable MAC and DMA transmission and reception */
 ETH_Start();  

while(1)
{
	RecievePacket();
}

}

А вот функция RecievePacket(), в которую постоянно заходим. Чтобы узнать есть посылка или нет, проверяем условие. При первом приеме все хорошо и заходим в if, в последующих - не заходим. Я думаю что тут какая-то проблема с дескрипторами или типа того. Хотя массив Rx_Buff заполняется каждый раз при приеме. При первом приеме Rx_Buff [0], при втором приеме Rx_Buff [1] и т.д. Подскажите пожалуйста.
void RecievePacket(void)
{
if ((DMARxDscrTab->Status & ETH_DMARxDesc_OWN)==0)
{	
			//Сначала отключаем прием
			ETH_DMAReceptionCmd(DISABLE);
		
			for (i=0; i<43; i++)
			{		
				data[i]=Rx_Buff[0][i];
			}
			//отдаем дескриптор в руки DMA Ethernet
			DMARxDscrTab -> Status = ETH_DMARxDesc_OWN;
			ETH_DMAReceptionCmd(ENABLE);

}
9 года 11 мес. назад - 9 года 11 мес. назад #5800 от Vlad_123
Vlad_123 ответил в теме Осваиваем Ethernet в STM32
Вы можете посмотреть примеры к плате STM32F4DIS-EXT на базе STM32F4, возможно это позволит как то найти решение..., поскольку плата SK-MSTM32F107 поставляется как бюджетное решение, выполненное отечественной фирмой-производителем Starterkit, насколько известно, без каких-либо примеров. Подробнее можно узнать на сайте www.starterkit.ru/html/index.php?name=shop&op=view&id=34. Ссылка на примеры платы STM32F4DIS-EXT, представляемой STMicroelectronics выложена в теме www.ic-contract.ru/forum/8-obsuzhdenie-m...m32f4-discovery.html
9 года 11 мес. назад #5801 от Alex888
Alex888 ответил в теме Осваиваем Ethernet в STM32
Мне не нужны библиотеки uIP и LwIP. В них много лишнего, мне в итоге надо просто посылать сообщения по UDP-протоколу, которые без труда можно написать самому и не забивать память. Мне бы простые примеры, касающиеся только Ethernet самого STM32. А то в этих библиотеках пока поймешь что происходит...
9 года 11 мес. назад #5802 от Vlad_123
Vlad_123 ответил в теме Осваиваем Ethernet в STM32
Посмотрите описание здесь
www.st.com/st-web-ui/static/active/en/re...s_searchtype=keyword
Время создания страницы: 0.045 секунд
Работает на Kunena форум