|
RL-TCPNet не запускается, Нужна помощь по RL-TCPNet |
|
|
|
Jan 21 2014, 14:49
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Добрый день Скопировал схему STM32F4DIS-BB Discove ( Ethernet, LAN8720 ) в свой проект. Мой проект работает с RTX ( uVision), STM32F407VGT6. Hardware часть в полном порядке. Я загрузил пример с STM32F4DIS-BB в свою плату и плата отвечаут на ping и получает IP по DHCP. Я так понимаю, что в своем проекте лучше использовать стек от Keil ( RL-TCPNet). Когда я запускаю свое проект ( см. код ниже ), плата отвечат "DHCP Fail". Проблем с компиляцией нет. Читаются все регистры LAN8720. Driver LAN8720 взят из стандартной библиотеки ( кроме инициализации ethernet ). Сам код продолжает работать без проблем. Как проверить работоспособность RL-TCPnet? Что в настройках упущенно или сделано неправильно? Две строки ниже добавил сам. Стандартная функция неправильно считает делитель частоты ETH->MACMIIAR &= MACMIIAR_CR_MASK; ETH->MACMIIAR |= 0x00000004 ; файл Ethernet_V1.c: CODE #include <RTL.h> #include "STM32F4xx.h" #include "Ethernet_V1.h" #include "stm32f4xx_rtc.h" #include "stm32f4x7_eth.h" #include "ETH_STM32F4xx.h" #include <Net_Config.h> #include "..\Project_Setup.h" #include "..\Project_Definitions.h"
//========================================================== // Task to init Ethernet //========================================================== __task void EthernetInit (void) { init_TcpNet (); os_tsk_create ( tcp_tick, 20 ); t_ETH_Task = os_tsk_create_user ( Tcp_Task, 0, &tcp_stack, sizeof(tcp_stack));
// PutDec_Bash (sizeof(OS_FRAME)); while ( TCP_23_State != 3 ) { os_dly_wait ( 2000 ); Send_String_Bash ("L"); }
/* #define TCP_TYPE_SERVER 0x01 // Socket Type Server (open for listening) #define TCP_TYPE_CLIENT 0x02 // Socket Type Client (initiate connect) #define TCP_TYPE_DELAY_ACK 0x04 // Socket Type Delayed Acknowledge #define TCP_TYPE_FLOW_CTRL 0x08 // Socket Type Flow Control #define TCP_TYPE_KEEP_ALIVE 0x10 // Socket Type Keep Alive #define TCP_TYPE_CLIENT_SERVER (TCP_TYPE_SERVER | TCP_TYPE_CLIENT) */
socket_tcp = tcp_get_socket(TCP_TYPE_SERVER, 0, 20, tcp_callback); // Send_String_Bash ("S:"); // PutDec_Bash ( socket_tcp );
if (socket_tcp!= 0) { if(tcp_listen(socket_tcp, 23 )==__TRUE) Send_String_Bash ("\nListen Ready"); else Send_String_Bash ("\nListen Fail"); }
os_tsk_delete_self ();
} //__task void EthernetInit (void)
U16 tcp_callback (U8 soc, U8 event, U8 *ptr, U16 par) { if (soc != socket_tcp) { // Error return(0); }
Send_String_Bash ("\nOpen:"); PutDec_Bash ( event ); switch(event) { case TCP_EVT_DATA: break;
case TCP_EVT_CONREQ: return (1);
case TCP_EVT_CONNECT: Send_String_Bash ("\nConnected"); break;
case TCP_EVT_CLOSE: Send_String_Bash ("\nDisconnected"); // tcp_close (soc); // return (1); break; case TCP_EVT_ABORT: break;
case TCP_EVT_ACK: break; default: break; }
return(0); }
//============================================================= // ETH routing Task //============================================================= __task void Tcp_Task (void) { dhcp_tout = DHCP_TOUT; for (;;) { os_evt_wait_or ( 0x0001 | 0x0002 , 0xFFFF ); while ( main_TcpNet() == __TRUE ) continue;// dhcp_check (); } }
//============================================================= // Ethernet Tick routine //============================================================= /* System tick timer task */ os_itv_set (100);
for (;;) { os_itv_wait(); timer_tick (); tick = __TRUE; os_evt_set ( 0x0001, t_ETH_Task ); }
//============================================================ // //============================================================ static void dhcp_check ( void ) { /* Monitor DHCP IP address assignment. */ if (tick == __FALSE || dhcp_tout == 0) { return; } tick = __FALSE; if (mem_test (&MY_IP, 0, IP_ADRLEN) == __FALSE && !(dhcp_tout & 0x80000000)) { // Success, DHCP has already got the IP address. dhcp_tout = 0; Send_String_Bash ("\nIP Received"); PutDec_Bash ( MY_IP[0] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[1] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[2] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[3] ); Send_String_Bash (" "); TCP_23_State |= 2; // PutDec_Bash ( TCP_23_State ); return; } if (--dhcp_tout == 0) { // A timeout, disable DHCP and use static IP address. // dhcp_disable (); // if ( ErrorShowEnabled == 1 ) { Send_String_Bash ("\nTCP>DHCP Fail"); } dhcp_tout = 30 | 0x80000000; return; } if (dhcp_tout == 0x80000000) { dhcp_tout = 0; Send_String_Bash ("\nIP Address"); PutDec_Bash ( MY_IP[0] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[1] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[2] ); Send_String_Bash ("."); PutDec_Bash ( MY_IP[3] ); Send_String_Bash (" "); // TCP_23_State |= 2; // PutDec_Bash ( TCP_23_State ); }
}
/*----------------------------------------------------------------------------- * ENET Ethernet Driver Functions *----------------------------------------------------------------------------- * Required functions for Ethernet driver module: * a. Polling mode: - void init_ethernet () * - void send_frame (OS_FRAME *frame) * - void poll_ethernet (void) * b. Interrupt mode: - void init_ethernet () * - void send_frame (OS_FRAME *frame) * - void int_enable_eth () * - void int_disable_eth () * - interrupt function *----------------------------------------------------------------------------*/
/*--------------------------- init_ethernet ----------------------------------*/ void init_ethernet (void) {
GPIO_InitTypeDef GPIO_InitStructure; //Configure the GPIO for ethernet controller ====================================================== /* Enable GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE, ENABLE);
/* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* MII/RMII Media interface selection --------------------------------------*/ SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
/* Ethernet pins configuration ************************************************/ /* ETH_MDIO --------------> PA2 ETH_MDC ---------------> PC1 ETH_RMII_REF_CLK-------> PA1
ETH_RMII_CRS_DV -------> PA7 // ETH_MII_RX_ER -------> PB10 - not using ETH_RMII_RXD0 -------> PC4 ETH_RMII_RXD1 -------> PC5 ETH_RMII_TX_EN -------> PB11 ETH_RMII_TXD0 -------> PB12 ETH_RMII_TXD1 -------> PB13
ETH_RST_PIN -------> PE2 */
/* Configure PA1,PA2 and PA7 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
/* Configure PB10,PB11,PB12 and PB13 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; GPIO_Init(GPIOB, &GPIO_InitStructure); // GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
/* Configure PC1, PC4 and PC5 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
/* Configure the PHY RST pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_2); os_dly_wait ( 10 ); GPIO_SetBits(GPIOE, GPIO_Pin_2); os_dly_wait ( 1 );
// Enable ETHERNET clock RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx, ENABLE); // Reset ETHERNET on AHB Bus ETH_DeInit();
// Software reset ETH_SoftwareReset(); os_dly_wait ( 1 ); ETH_Error = 0; // Wait for software reset while (ETH_GetSoftwareResetStatus() == SET) { if ( ETH_Error++ == 20 ) break; os_dly_wait ( 1 ); }
//Check is Link UP while ( ( ETH_ReadPHYRegister( LAN8720_PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status ) == 0 ) { // Send_String_Bash ("Hello"); // PutDec_Bash ( ETH_ReadPHYRegister(LAN8720_PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status ); os_dly_wait ( 50 ); } if ( ETH_Error == 0 ) { // Initialize the ETH ethernet controller.
// ETHERNET Configuration --------------------------------------------------// // Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter // ETH_StructInit(Ð_InitStructure);
// Fill ETH_InitStructure parametrs // //------------------------ MAC -----------------------------------// ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
// ETH_InitStructure.ETH_Speed = ETH_Speed_100M; // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable; ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable; ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; //#ifdef CHECKSUM_BY_HARDWARE ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable; //#endif
//------------------------ DMA -----------------------------------// // When we use the Checksum offload feature, we need to enable the Store and Forward mode: //the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, //if the checksum is OK the DMA can handle the frame otherwise the frame is dropped ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable; ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable; ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable; ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat; ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat; ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
/* Configure Ethernet */ EthInitStatus = ETH_Init(Ð_InitStructure, LAN8720_PHY_ADDRESS );
/* HCLK Clock range 120-168MHz. */ ETH->MACMIIAR &= MACMIIAR_CR_MASK; ETH->MACMIIAR |= 0x00000004 ;
// MAC address filtering, accept multicast packets. ETH->MACFFR = MFFR_HPF | MFFR_PAM; ETH->MACFCR = MFCR_ZQPD;
// Initialize Tx and Rx DMA Descriptors rx_descr_init (); tx_descr_init ();
// Flush FIFO, start DMA Tx and Rx ETH->DMAOMR = DOMR_FTF | DOMR_ST | DOMR_SR;
// Enable receiver and transmiter ETH->MACCR |= MCR_TE | MCR_RE;
// Reset all interrupts ETH->DMASR = 0xFFFFFFFF;
// Enable Rx and Tx interrupts. ETH->DMAIER = INT_NISE | INT_AISE | INT_RBUIE | INT_RIE; //
TCP_23_State |= 1;
} // end of if ( ETH_Error == 0 ) else { EthInitStatus = 2; if ( ErrorShowEnabled == 1 ) { // Send_String_Bash ("\nETH>Init Error "); } } //end of else
} //end of void init_ethernet (void)
//============================================================== // //============================================================== void ETH_IRQHandler (void) {
fetch_packet (); isr_evt_set ( 0x0002, t_ETH_Task );//Tcp_Task); // Clear the interrupt flags. // Clear the Eth DMA Rx IT pending bits
}
/*--------------------------- int_enable_eth ---------------------------------*/
void int_enable_eth (void) { /* Ethernet Interrupt Enable function. */ // NVIC->ISER[1] = 1 << 29; }
/*--------------------------- int_disable_eth --------------------------------*/
void int_disable_eth (void) { /* Ethernet Interrupt Disable function. */ // NVIC->ICER[1] = 1 << 29; }
//-------------------------- send_frame -------------------------------------
void send_frame (OS_FRAME *frame) { // Send frame to ETH ethernet controller U32 *sp,*dp; U32 i,j;
j = TxBufIndex; // Wait until previous packet transmitted. while (Tx_Desc[j].CtrlStat & DMA_TX_OWN);
sp = (U32 *)&frame->data[0]; dp = (U32 *)(Tx_Desc[j].Addr & ~3);
// Copy frame data to ETH IO buffer. for (i = (frame->length + 3) >> 2; i; i--) { *dp++ = *sp++; } Tx_Desc[j].Size = frame->length; Tx_Desc[j].CtrlStat |= DMA_TX_OWN; if (++j == NUM_TX_BUF) j = 0; TxBufIndex = j; // Start frame transmission. ETH->DMASR = DSR_TPSS; ETH->DMATPDR = 0;
}
//======================================================= // //======================================================= static void fetch_packet ( void ) { OS_FRAME *frame; U32 i, RxLen; U32 *sp,*dp;
i = RxBufIndex; do { if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) { ETH_Err = 1; goto rel; } /* if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK) { ETH_Err = 2; goto rel; } */ RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4; if (RxLen > ETH_MTU) { ETH_Err = 3; /* Packet too big, ignore it and free buffer. */ goto rel; } /* Flag 0x80000000 to skip sys_error() call when out of memory. */ frame = alloc_mem (RxLen | 0x80000000); /* if 'alloc_mem()' has failed, ignore this packet. */ if (frame != NULL) { sp = (U32 *)(Rx_Desc[i].Addr & ~3); dp = (U32 *)&frame->data[0]; for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--) { *dp++ = *sp++; }
put_in_queue (frame); } else ETH_Err = 4; /* Release this frame from ETH IO buffer. */ rel:Rx_Desc[i].Stat = DMA_RX_OWN;
if (++i == NUM_RX_BUF) i = 0; RxBufIndex = i; } while (!(Rx_Desc[i].Stat & DMA_RX_OWN)); RxBufIndex = i;
if (ETH->DMASR & INT_RBUIE) { /* Receive buffer unavailable, resume DMA */ ETH->DMASR = INT_RBUIE; ETH->DMARPDR = 0; } /* Clear pending interrupt bits */ ETH->DMASR = INT_NISE | INT_RIE;
}
/*--------------------------- rx_descr_init ----------------------------------*/
static void rx_descr_init (void) { /* Initialize Receive DMA Descriptor array. */ U32 i,next;
RxBufIndex = 0; for (i = 0, next = 0; i < NUM_RX_BUF; i++) { if (++next == NUM_RX_BUF) next = 0; Rx_Desc[i].Stat = DMA_RX_OWN; Rx_Desc[i].Ctrl = DMA_RX_RCH | ETH_BUF_SIZE; Rx_Desc[i].Addr = (U32)&rx_buf[i]; Rx_Desc[i].Next = (U32)&Rx_Desc[next]; } ETH->DMARDLAR = (U32)&Rx_Desc[0]; }
/*--------------------------- tx_descr_init ----------------------------------*/
static void tx_descr_init (void) { /* Initialize Transmit DMA Descriptor array. */ U32 i,next;
TxBufIndex = 0; for (i = 0, next = 0; i < NUM_TX_BUF; i++) { if (++next == NUM_TX_BUF) next = 0; Tx_Desc[i].CtrlStat = DMA_TX_TCH | DMA_TX_LS | DMA_TX_FS; Tx_Desc[i].Addr = (U32)&tx_buf[i]; Tx_Desc[i].Next = (U32)&Tx_Desc[next]; } ETH->DMATDLAR = (U32)&Tx_Desc[0]; }
Сообщение отредактировал IgorKossak - Jan 22 2014, 10:27
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Jan 21 2014, 16:34
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Цитата(Golikov A. @ Jan 21 2014, 19:53)  Внимание вопрос! а DHCP сервер то есть? Вышел таймаут ответ от сервера не получен, вот вам и фаил. Понятно, что DHCP функция ждет пока таймер не равен нулю а потом говорит, что нет DHCP Другими словами TCP стек не работает. Как его правильно запустить? Даже если поставить переменную в функцию обработки прерывания, то видно, что функция запускается пару раз в секунду. Но иногда возвращает ошибку стека. Например здесь: if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) { ETH_Err = 1; goto rel;
|
|
|
|
|
Jan 22 2014, 11:33
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Цитата(Golikov A. @ Jan 21 2014, 22:15)  Внимание второй вопрос вы что такое DHCP знаете?
вы куда плату подключили? У вас есть рутер на котором есть DHCP сервер. Вы правильно задали мак адрес платы чтобы DHCP сервер мог выдать вам адрес?
и не надо ничего никуда ставить, стэк наполнен диагностической информацией, для того чтобы ее получить в net_conf.c надо включить уровень диагностики на полную по всем интересующим параметрам, и начнет валить информация по каждому принятому пакету.... Вот dedug информация: CODE 1000.0 MEM:Init MemPool 8192 bytes 000.0 ETH:Init interface 000.0 IP :Init localhost 000.1 MEM:Alloc 356 bytes 000.1 MEM: Used 356 bytes (1 blocks) 000.1 IP :Sending frame 000.1 IP : Src. IP : 0.0.0.0 000.1 IP : Dest.IP : 255.255.255.255 000.1 IP : Protocol: UDP 000.1 IP : Identif.: 0x0000 000.1 IP : Length : 328 bytes 000.1 ETH:Sending frame 000.1 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 000.1 ETH: Src. MAC: 00:30:6C:A2:47:00 000.1 ETH: Protocol: IP 000.1 ETH: Length : 342 bytes 000.1 MEM:Free 356 bytes 000.1 MEM: IRQ_Alloc 1 blocks 000.1 MEM: Used 348 bytes (1 blocks) 000.2 ETH:*** Processing frame *** 000.2 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 000.2 ETH: Src. MAC: 00:1D:AA:B6:D5:70 000.2 ETH: Protocol: IP 000.2 ETH: Length : 335 bytes 000.2 IP :*** Processing frame *** 000.2 IP : Src. IP : 192.168.1.1 000.2 IP : Dest.IP : 255.255.255.255 000.2 IP : Protocol: UDP 000.2 IP : Identif.: 0x55B0 000.2 IP : Length : 321 bytes 000.2 MEM:Alloc 356 bytes 000.2 MEM: Used 704 bytes (2 blocks) 000.2 IP :Sending frame 000.2 IP : Src. IP : 0.0.0.0 000.2 IP : Dest.IP : 255.255.255.255 000.2 IP : Protocol: UDP 000.2 IP : Identif.: 0x0001 000.2 IP : Length : 328 bytes 000.2 ETH:Sending frame 000.2 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 000.2 ETH: Src. MAC: 00:30:6C:A2:47:00 000.2 ETH: Protocol: IP 000.2 ETH: Length : 342 bytes 000.2 MEM:Free 356 bytes 000.2 MEM: Used 348 bytes (1 blocks) 000.2 MEM:Free 348 bytes 000.2 MEM: Used 0 bytes (0 blocks) 001.3 MEM:Alloc 356 bytes 001.3 MEM: Used 356 bytes (1 blocks) 001.3 IP :Sending frame 001.3 IP : Src. IP : 0.0.0.0 001.3 IP : Dest.IP : 255.255.255.255 001.3 IP : Protocol: UDP 001.3 IP : Identif.: 0x0002 001.3 IP : Length : 328 bytes 001.3 ETH:Sending frame 001.3 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 001.3 ETH: Src. MAC: 00:30:6C:A2:47:00 001.3 ETH: Protocol: IP 001.3 ETH: Length : 342 bytes 001.3 MEM:Free 356 bytes 001.3 MEM: Used 0 bytes (0 blocks) 002.1 MEM:Alloc 356 bytes 002.1 MEM: Used 356 bytes (1 blocks) 002.1 IP :Sending frame 002.1 IP : Src. IP : 0.0.0.0 002.1 IP : Dest.IP : 255.255.255.255 002.1 IP : Protocol: UDP 002.1 IP : Identif.: 0x0003 002.1 IP : Length : 328 bytes 002.1 ETH:Sending frame 002.1 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 002.1 ETH: Src. MAC: 00:30:6C:A2:47:00 002.1 ETH: Protocol: IP 002.1 ETH: Length : 342 bytes 002.1 MEM:Free 356 bytes 002.1 MEM: IRQ_Alloc 3 blocks 002.1 MEM: Used 1044 bytes (3 blocks) 002.2 ETH:*** Processing frame *** 002.2 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 002.2 ETH: Src. MAC: 00:1D:AA:B6:D5:70 002.2 ETH: Protocol: IP 002.2 ETH: Length : 335 bytes 002.2 IP :*** Processing frame *** 002.2 IP : Src. IP : 192.168.1.1 002.2 IP : Dest.IP : 255.255.255.255 002.2 IP : Protocol: UDP 002.2 IP : Identif.: 0x55F6 002.2 IP : Length : 321 bytes 002.2 MEM:Free 348 bytes 002.2 MEM: Used 696 bytes (2 blocks) 002.3 ETH:*** Processing frame *** 002.3 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 002.3 ETH: Src. MAC: 00:1D:AA:B6:D5:70 002.3 ETH: Protocol: IP 002.3 ETH: Length : 335 bytes 002.3 IP :*** Processing frame *** 002.3 IP : Src. IP : 192.168.1.1 002.3 IP : Dest.IP : 255.255.255.255 002.3 IP : Protocol: UDP 002.3 IP : Identif.: 0x5628 002.3 IP : Length : 321 bytes 002.3 MEM:Free 348 bytes 002.3 MEM: Used 348 bytes (1 blocks) 002.4 ETH:*** Processing frame *** 002.4 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 002.4 ETH: Src. MAC: 00:1D:AA:B6:D5:70 002.4 ETH: Protocol: IP 002.4 ETH: Length : 335 bytes 002.4 IP :*** Processing frame *** 002.4 IP : Src. IP : 192.168.1.1 002.4 IP : Dest.IP : 255.255.255.255 002.4 IP : Protocol: UDP 002.4 IP : Identif.: 0x5650 002.4 IP : Length : 321 bytes 002.4 MEM:Free 348 bytes 002.4 MEM: Used 0 bytes (0 blocks) 017.4 MEM:Alloc 56 bytes 017.4 MEM: Used 56 bytes (1 blocks) 017.4 MEM:Free 56 bytes 017.4 MEM: Used 0 bytes (0 blocks) 017.7 MEM:Alloc 56 bytes 017.7 MEM: Used 56 bytes (1 blocks) 017.7 MEM:Free 56 bytes 017.7 MEM: Used 0 bytes (0 blocks) 018.0 MEM:Alloc 56 bytes 018.0 MEM: Used 56 bytes (1 blocks) 018.0 MEM:Free 56 bytes 018.0 MEM: Used 0 bytes (0 blocks) 018.3 MEM:Alloc 56 bytes 018.3 MEM: Used 56 bytes (1 blocks)
В какой-то момент стек зависает. "018.3 MEM: Used 56 bytes (1 blocks)" последнее сообщение Какие есть идеи?
Сообщение отредактировал Sergiy26 - Jan 22 2014, 11:36
|
|
|
|
|
Jan 22 2014, 15:48
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Цитата(Golikov A. @ Jan 22 2014, 15:40)  виндус провел все свои опросы, не нашел ничего в сети и перестал слать информацию....
У вас у платы IP адрес 0.0.0.0, с таким адресом никто говорить не будет.
после того как DHCP вернулось с файлом (или сразу отключите DHCP), присвойте плате IP адрес!
192.168.1.2, например... Вот это уже другой разговор. Это стоящая подсказка. Когда я задал IP используя: "mem_copy ((U8 *)&localm[NETIF_ETH], (U8 *)&ip_config, sizeof(ip_config));". Почему не используються данные из файла "Net_Config.c"? Если вывести на экран DHCP_ENABLE, то компилятор ругается, что такой параметр не определен. Когда я определил адрес, то получил следующие данные: CODE 000.0 ETH:Init interface 000.0 IP :Init localhost 000.1 IP :Sending frame 000.1 IP : Src. IP : 192.168.0.150 000.1 IP : Dest.IP : 255.255.255.255 000.1 IP : Protocol: UDP 000.1 IP : Identif.: 0x0000 000.1 IP : Length : 328 bytes 000.1 ETH:Sending frame 000.1 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 000.1 ETH: Src. MAC: 00:30:6C:A2:39:00 000.1 ETH: Protocol: IP 000.1 ETH: Length : 342 bytes 49150004.0 IP :Sending frame 004.0 IP : Src. IP : 192.168.0.150 004.0 IP : Dest.IP : 255.255.255.255 004.0 IP : Protocol: UDP 004.0 IP : Identif.: 0x0001 004.0 IP : Length : 328 bytes 004.0 ETH:Sending frame 004.0 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 004.0 ETH: Src. MAC: 00:30:6C:A2:39:00 004.0 ETH: Protocol: IP 004.0 ETH: Length : 342 bytes 011.0 IP :Sending frame 011.0 IP : Src. IP : 192.168.0.150 011.0 IP : Dest.IP : 255.255.255.255 011.0 IP : Protocol: UDP 011.0 IP : Identif.: 0x0002 011.0 IP : Length : 328 bytes 011.0 ETH:Sending frame 011.0 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 011.0 ETH: Src. MAC: 00:30:6C:A2:39:00 011.0 ETH: Protocol: IP 011.0 ETH: Length : 342 bytes 026.0 IP :Sending frame 026.0 IP : Src. IP : 192.168.0.150 026.0 IP : Dest.IP : 255.255.255.255 026.0 IP : Protocol: UDP 026.0 IP : Identif.: 0x0003 026.0 IP : Length : 328 bytes 026.0 ETH:Sending frame 026.0 ETH: Dest.MAC: FF:FF:FF:FF:FF:FF 026.0 ETH: Src. MAC: 00:30:6C:A2:39:00 026.0 ETH: Protocol: IP 026.0 ETH: Length : 342 bytes 145.0 IP :Sending frame 145.0 IP : Src. IP : 169.254.160.118 145.0 IP : Dest.IP : 255.255.255.255 145.0 IP : Protocol: UDP 145.0 IP : Identif.: 0x0004 145.0 IP : Length : 328 bytes
192.168.0.150 - адрес которые я указал. Откуда такой адрресс 169.254.160.118 - строка 145.0? Вывод Debug информации опять останавливается. За все время тестирования IP адрес получен только раз ( 192.168.1.15). Постоянно получает адрес указанный по умолчанию (192.168.0.150) Ping вообще не отвечает. Что опять не так? Я использую TCP_CM3.lib, может требуется TCP_CM3_B.lib? ARP Full Debug CODE 000.0 ARP:Init Cache, 10 entries 000.2 ARP:Cache_Add 000.2 ARP: IP : 192.168.1.1 000.2 ARP: MAC : 00:1D:AA:B6:D5:70 000.2 ARP: Entry 1 added 004.1 ARP:Cache, Entry 1 refreshed 004.1 ARP: IP : 192.168.1.1 004.1 DHCP-ERR:Receive, Wrong XID 004.2 ARP:Cache, Entry 1 refreshed 004.2 ARP: IP : 192.168.1.1 004.2 DHCP-ERR:Receive, Wrong XID 004.3 ARP:Cache, Entry 1 refreshed 004.3 ARP: IP : 192.168.1.1 004.3 DHCP-ERR:Receive, Wrong XID 004.4 ARP:Cache, Entry 1 refreshed 004.4 ARP: IP : 192.168.1.1 007.3 ARP:Cache, Entry 1 refreshed 007.3 ARP: IP : 192.168.1.1 007.3 DHCP-ERR:Receive, Wrong XID 007.4 ARP:Cache, Entry 1 refreshed 007.4 ARP: IP : 192.168.1.1 007.4 DHCP-ERR:Receive, Wrong XID 007.5 ARP:Cache, Entry 1 refreshed 007.5 ARP: IP : 192.168.1.1 007.5 DHCP-ERR:Receive, Wrong XID 007.6 ARP:Cache, Entry 1 refreshed 007.6 ARP: IP : 192.168.1.1 007.6 DHCP-ERR:Receive, Wrong XID 013.3 ARP:Send_Request 013.3 ARP: Op_Code: Arp_Rq 013.3 ARP: Src. IP: 0.0.0.0 013.3 ARP: Dest.IP: 169.254.11.21 013.3 ARP: Src.MAC: 00:30:6C:A2:39:00 013.3 ARP: Dst.MAC: 00:00:00:00:00:00
В чем проблема в данном случае? Вариант, когда IP получен ( 192.168.1.16) Код 010.5 DHCP:*** Processing frame *** 010.5 DHCP: Initial check OK, proceeding 010.5 DHCP: Client state REQUESTING 010.5 DHCP: Received DHCP_ACK message 010.5 DHCP: IP Address: 192.168.1.16 010.5 DHCP: T1 timeout: 43200 sec 010.5 DHCP: T2 timeout: 75600 sec 010.5 DHCP: Lease time: 86400 sec 010.5 DHCP: Net mask : 255.255.255.0 010.5 DHCP: Gateway : 192.168.1.1 010.5 DHCP: Prim. DNS : 192.168.1.1 010.5 DHCP: Sec. DNS : 8.8.4.4 010.5 DHCP: Next state BOUND Попытка ping этого адреса и нет ответа. Будет ли RL-TCPNet отвечать на ping, если нет никаких операций с сокетами?
Сообщение отредактировал Sergiy26 - Jan 22 2014, 15:50
|
|
|
|
|
Jan 22 2014, 18:58
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
надо остановится и начать с другого конца  . Вы как езернет устроен представляете? СТР/IP модели ОСИ и прочая байда? Просто представляете или прям представляете? Если у вас вообще стэк хоть как-то шевелится и данные ходят, то значит все должно работать. 1. надо поискать по всем файлам "while (1)". Именно так, ваил пробел в скобках один. Я все время забываю где оно описано, и всегда сам так ищу. Вы найдете функцию аварийных ситуаций, которая после вывода на порт что что-то сломалось упирается в этот цикл. Это не есть правильно, там надо как-то подработать диагностику. Это фактически единственное место из-за которого может зависать стэк. А в эту функцию можно попасть из многих внутренних функций стэка. Функция вроде в Net_config.c 2. надо правильно построить сеть. DHCP сервер - это внешнее устройство которое раздает IP адреса, если у вас нет его, то смысл его мучить. Самая простая сеть это компьютер - плата напрямую. Но чтобы она работала надо выдать статически IP адреса обоим. И плате и компьютеру. Через настройки сети убрать все получения автоматически и выдать конкретные. Следите за масками подсети они должны совпадать. для определенности лучше компьютеру 192.168.0.1, а плате 192.168.0.2, с масками 255.255.255.0. Никаких хабов, и прочего в сети не должно быть, вторую сетевую карту если есть заглушите, и так далее... Шлюзом назначьте компьютер. Без такой локализации к вам много чего может приходить левого, и из других сетей, много кто временами будет интерсоваться а чей это айпи адрес и так далее... 3. Отключайте DHCP сразу, и прочитайте в хелпе как это правильно делается, dhcp_disable (); После этого загрузятся те настройки что вы задали в Net_config.c 4. Проверьте мак адрес, на его создание есть правила, можно сделать мак адрес который не будут принимать в сетях, с подгруппами. возьмите как у сетевой карты, изменив последние байты. Адрес не может быть 0xFF.FF.FF.FF.FF... и 0х00.00.00.00.... тоже, вообщем проверьте допустимые значения. назначьте правильное количество памяти на буферы ТСР, не больше чем есть. И отключайте отладку. Отладка содержимого пакета так тормозит процесс, что выходят таймауты и обмена не получится, если какой-то модуль работает, его отладку на только ошибки! Дальше в таймере крутите стэк, и все получится. да забыл, если все поднимется, то пинги будут, сокеты и все остальное не нужно. Это базовая начальная фигня. Но нужны правильные адреса, маки, регистрация в сети и прочее... я вот только не помню в стэке кейла можно отключать этот модуль или нет, вроде бы нельзя, и пинги есть всегда, но проверьте
|
|
|
|
|
Jan 23 2014, 14:38
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Уже давно изменил подход. Открыл новый проект и начал все с начала. Работаю под стандартным циклом без RTOS. Самои интересное, что если залить на плату пример из STM32F4DIS-BB на lwip, то все работает. (ping and TCP connection) - плата в порядке У меня не получается прикрутить lwip под RTX, т.к. lwip расчитана под freeRTOS. Очень много кропотливой работы. Время деньги. Я решил использовать RL-TCPNet, все-таки они расчитаны работать совместно RTX and RL-TCPNet (проект написан под RTX). Как устроен стек представляю. До уровня передачи побитово никогда не спускался. Даже не разбирался как работают протоколы: DHCP,ICMP,TCP,ARP и др. Вот здесь есть ссылка для тех кто плохо "жует" основы, все разжевали быстро и понятно.1. CODE int main ( void ) { SysTick_Config(SystemCoreClock / 1000 );
/* Change the MAC address */ mem_copy (own_hw_adr, (U8 *)mac_adr, 6); init_TcpNet (); dhcp_disable (); mem_copy ((U8 *)&localm[NETIF_ETH], (U8 *)&ip_config, sizeof(ip_config)); dhcp_tout = DHCP_TOUT;
while ( 1 ) { main_TcpNet(); dhcp_check (); } }
void TimerTickQ ( void ) { if ( ++TickCount == 100 ) { timer_tick (); tick = __TRUE; TickCount = 0; } } 2. Вчера работал по схеме: Device и компьютер подключены через рутер. Сегодня подключил device напрямую к компьютеру. Устройство 192.168.0.2 и шлюз 192.168.0.1 Компьютер 192.168.0.1 и шлюз 192.168.0.1 Когда включен debug, то видно: Код 000.0 ICMP:Init Engine 000.0 TNET:Init 2 Sessions, Port 23 000.0 TNET: Idle timeout 120 secs 000.0 DHCP:Init Client 000.0 DHCP:Disabled by user 3. DHCP отключен сразу как показано в примере и как видно из кода в п.2 4. МАС адрес 00:21:5A:72:FF:18 - копия мас компьютера на единицу уменьшеного Буфер для Ethernet Код #define NUM_RX_BUF 4 /* 0x1800 for Rx (4*1536=6K) */ #define NUM_TX_BUF 2 /* 0x0600 for Tx (2*1536=3K) */ #define ETH_BUF_SIZE 1536 /* ETH Receive/Transmit buffer size */ Я отключил Debug ( удалив библиотеки из проекта ). Это видно, нет информации на экране. Все запустил. Компьютер видит, что кабель подключен. На ping с компьютера не откликается. Открыть соединение по порту 23 не получается. На экране каждую секунду появлюется символ - проверка , что не завис стек. Что теперь имзенить. Может есть у кого пример STM32F4xx и LN8720 под TCPNet? Даже не знаю, что делать дальше.
Сообщение отредактировал Sergiy26 - Jan 23 2014, 14:41
|
|
|
|
|
Jan 23 2014, 17:41
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
попробуйте так: Код init_TcpNet (); dhcp_disable (); dhcp_tout = 0;
while ( 1 ) {
main_TcpNet(); dhcp_check (); tick = __FALSE; } TimerTickQ -эта функция у вас в прерывании вызывается? с интервалом 1 мс? if ( ++TickCount == 100 ) имеет смысл заменить на if ( ++TickCount >= 100 ) на всякий случай... и проверьте в настройках net_config, вы интервал таймера выставили на 100 мСек. ну еще надо не забыть включить tcp и udp. выделить общей памяти килобайт 8. к net_config выдается визард, действовать надо через него, потому что 8 кбайт памяти в константах выглядит как 2048, я так понимаю там все в словах....
|
|
|
|
|
Jan 28 2014, 14:53
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Добрый день Долгая пауза перед ответом. Пока я ожидал заказаный ULINK2 ( имею MCBSTR9 для тестирования ), дальше по проекту был iButton(теперь и здесь порядок). Сейчас вернулся к Ethernet. Ethernet заработал. Это главное сообщение на сегодня. Я заново перепроверил блок инициализации GPIO and Ethernet. Скопировал пример с ETH_STM32F4xx.c и фортуна опять со мной. Теперь по делу: 1. DHCP and Ping работают, даже если нет работы с портами\сокетами. 2. TICK_INTERVAL не имеет жосткой привязки. Если таймер запускяется 50 mS а указано в Net_Config.c 100mS, то стек все равно будет работать. 3. Debug работает и показывает получение IP даже если ping не хочет. 4. Для Golikov A. в вопросе "У вас у платы IP адрес 0.0.0.0, с таким адресом никто говорить не будет." Ниже приведен нормальный старт работы Код 000.1 IP :Sending frame 000.1 IP : Src. IP : 0.0.0.0 000.1 IP : Dest.IP : 255.255.255.255 000.1 IP : Protocol: UDP 000.1 IP : Identif.: 0x0000 000.1 IP : Length : 328 bytes - так стартуют две платы с TCPNet стеком и работают нормально 5. Для Golikov A. плата работает даже при MAC 0:0:0:0:0:0 Спасибо Golikov A. за подсказку и предоставленное для меня время. Прикрепил проект с драйвером для STM32F407VGT6 and LAN8720. Проект простой без RTX - стандртный while(1) Использовал настройки ETH модуля в своем проекте под RTX - так же работает. Проблема решена.
|
|
|
|
|
Jan 29 2014, 05:57
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
позволю несколько уточнений запустив таймер на 50 мСек, а в нет конфиг указать 100 мСек, приведет к неправильным расчетам пауз в протоколе, времени жизни, таймаутов и прочего. В штатном режиме вы этого естественно не заметите, а при нештатных ситуациях даст о себе знать. адрес IP == 0.0.0.0 - специальный адрес, плата на UDP отвечать будет, а вот когда она начнет свои пакеты от этого имени слать по TCP/IP будут косячки, вроде бы даже соединение установить по TCP не выйдет. Но тут могу реально ошибаться, я с этим в начале работы бился, помню что так не хорошо, а точно ли я помню почему - не уверен  та же история с МАК адресом, есть класс специальных мак адресов, на это указывают первые 2 бита адреса. Если задать их не верно, будут косяки и странности в сети. Точное значение и расположение их я на момент ответа не помнил  потому чтоб наверняка предложил скопировать и изменить адрес с компа. И это так же гарантирует отсутствие случайного повтора с компом, вероятность мала, но есть же. Ну и рад что все заработало  удачи!
|
|
|
|
|
Jan 29 2014, 22:41
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 1-01-09
Пользователь №: 42 874

|
Все уточнения полностью верны! Я указал свои заметки для запуска и тестирования стека RL-TCPNet. Если мы говорим про серьезный проект, то конечно все должно строго выдерживаться.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|