реклама на сайте
подробности

 
 
> RL-TCPNet не запускается, Нужна помощь по RL-TCPNet
Sergiy26
сообщение Jan 21 2014, 14:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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(&ETH_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(&ETH_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] - для короткого!!!

Прикрепленные файлы
Прикрепленный файл  Ethernet.rar ( 6.89 килобайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Golikov A.
сообщение Jan 21 2014, 15:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Внимание вопрос!
а DHCP сервер то есть? Вышел таймаут ответ от сервера не получен, вот вам и фаил.



Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 21 2014, 16:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 21 2014, 18:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Внимание второй вопрос вы что такое DHCP знаете?

вы куда плату подключили? У вас есть рутер на котором есть DHCP сервер. Вы правильно задали мак адрес платы чтобы DHCP сервер мог выдать вам адрес?


и не надо ничего никуда ставить, стэк наполнен диагностической информацией, для того чтобы ее получить в net_conf.c надо включить уровень диагностики на полную по всем интересующим параметрам, и начнет валить информация по каждому принятому пакету....
Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 22 2014, 11:33
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 22 2014, 11:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



виндус провел все свои опросы, не нашел ничего в сети и перестал слать информацию....

У вас у платы IP адрес 0.0.0.0, с таким адресом никто говорить не будет.

после того как DHCP вернулось с файлом (или сразу отключите DHCP), присвойте плате IP адрес!

192.168.1.2, например...
Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 22 2014, 15:48
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  Debug2.txt ( 2.43 килобайт ) Кол-во скачиваний: 9
Прикрепленный файл  ARP_Debug.txt ( 8.72 килобайт ) Кол-во скачиваний: 8
Прикрепленный файл  Debug_3.txt ( 3.9 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 22 2014, 18:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



надо остановится и начать с другого концаsm.gif.

Вы как езернет устроен представляете? СТР/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.... тоже, вообщем проверьте допустимые значения.

назначьте правильное количество памяти на буферы ТСР, не больше чем есть. И отключайте отладку. Отладка содержимого пакета так тормозит процесс, что выходят таймауты и обмена не получится, если какой-то модуль работает, его отладку на только ошибки! Дальше в таймере крутите стэк, и все получится.


да забыл, если все поднимется, то пинги будут, сокеты и все остальное не нужно. Это базовая начальная фигня. Но нужны правильные адреса, маки, регистрация в сети и прочее... я вот только не помню в стэке кейла можно отключать этот модуль или нет, вроде бы нельзя, и пинги есть всегда, но проверьте
Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 23 2014, 14:38
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 23 2014, 17:41
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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, я так понимаю там все в словах....
Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 28 2014, 14:53
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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 - так же работает.

Проблема решена.



Прикрепленные файлы
Прикрепленный файл  Ethernet_Test.rar ( 654.03 килобайт ) Кол-во скачиваний: 160
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 29 2014, 05:57
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



позволю несколько уточнений

запустив таймер на 50 мСек, а в нет конфиг указать 100 мСек, приведет к неправильным расчетам пауз в протоколе, времени жизни, таймаутов и прочего. В штатном режиме вы этого естественно не заметите, а при нештатных ситуациях даст о себе знать.


адрес IP == 0.0.0.0 - специальный адрес, плата на UDP отвечать будет, а вот когда она начнет свои пакеты от этого имени слать по TCP/IP будут косячки, вроде бы даже соединение установить по TCP не выйдет. Но тут могу реально ошибаться, я с этим в начале работы бился, помню что так не хорошо, а точно ли я помню почему - не уверенsm.gif

та же история с МАК адресом, есть класс специальных мак адресов, на это указывают первые 2 бита адреса. Если задать их не верно, будут косяки и странности в сети. Точное значение и расположение их я на момент ответа не помнилsm.gif потому чтоб наверняка предложил скопировать и изменить адрес с компа. И это так же гарантирует отсутствие случайного повтора с компом, вероятность мала, но есть же.


Ну и рад что все заработалоsm.gif удачи!
Go to the top of the page
 
+Quote Post
Sergiy26
сообщение Jan 29 2014, 22:41
Сообщение #13


Участник
*

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



Все уточнения полностью верны!
Я указал свои заметки для запуска и тестирования стека RL-TCPNet.
Если мы говорим про серьезный проект, то конечно все должно строго выдерживаться.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016