W5300 또는 W5100을 이용한 Dual Ethernet 사용관련 문의 드립니다.

안녕하세요.

현재 W5300과 W5100모델을 사용하고 있습니다.
STM32F2 Series를 이용하여 두개의 Ethernet 포트를 구성하고자 합니다.
사용 방법은 W5300 또는 W5100을 이용하여 한쪽 이더넷에서 데이타를 받으면
STM32F2 Series에서 데이타를 처리하여 나머지 이더넷 포트로 전송하고자 합니다.
보통은 사양이 높은 Arm-A8이나 A9정도의 CPU를 사용하여 OS(보통 리눅스)를 올린 후
Dual Ethernet 포트를 컨트롤 하는 것으로 알고 있습니다.
저희가 전송할 데이타 양은 많지 않으나 이렇게 사용해본 적이 없어서
Dual Ethernet로 구성하는 방법에 대한 조언을 구하고자 합니다.
혹시 Wiznet에서 Dual로 구성하는 방법에 대한 자료나
추천해주실 수 있는 방법이 있는지 확인 부탁드립니다.

W5300이나 W5100은 별도의 MAC address와 IP address를 할당해주셔야합니다.
이렇게 별도 주소를 할당하면 두개의 W5300 또는 W5100은 서로 독립적인 장치입니다.
하나를 디자인 할 때와 동일하게 설계하시면 되고 Chip Select 를 위한 decoder에서 다른 address map을 이용하시면 됩니다.

회신 감사합니다.
한가지 더 문의 드립니다.
W5300이 속도가 더 높아서 이모델을 사용하고자 합니다.
회로 설계시 데이터 버스와 어드레스 버스라인은 같게 설계하고
나머지 핀들은 다른 포트들로 사용해야 되는지요?
(/WR, /RD, /CS, /INT, BRDY1J~BRDY4J)
다르게 구성해야되는 핀이 있으면 조언 부탁드립니다.

/WR, /RD 는 같이 핀을 공유해도 될 것 같습니다.
/CS, /INT는 다른 핀을 할당해야합니다.

다만 BRDY1J ~ BRDY4J는 어떤 핀 인지 모르겠습니다.

안녕하세요.

현재 STM32F207을 사용해서 FMSC 방식으로 데이타를 읽고 쓰기를 하고 있습니다.
Dual 로 w5300을 사용하고 있습니다.
IP셋팅 후 다시 읽어보면 0번 비트값이 항상 1로 읽힘니다.
예를들어 192.168.1.0으로 세팅하면 읽히는 값은 192.168.1.1로 읽힘니다.
두 IC 모두 그렇습니다. 1개 회로만 설계해서 테스트 할 때는 이런 문제가 없었는데
두개가 장착된 회로를 설계해서 사용하니 이런문제가 생겼습니다.
혹시 제가 검토해 볼만한 부분이 있을까요?
한비트가 계속 틀어져서 제대로 송수신을 할 수가 없습니다.
조언 부탁드립니다.

안녕하세요.
모든 주소에서 나타나는 현상인지 아니면 특정 현상에서 나타나는 현상인지 알려주세요.
그리고, FSMC 8bit 인지 16bit 인지?

가능하면 /CS control을 어떻게 처리하고 있는지, W5300 Driver code 공유부탁드립니다.

안녕하세요.

FSMC 16bit로 사용하고 있고 설정은 아래와 같습니다.

void Fsmc_Bank1_Sram_Ne3_Ne4_Iint(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAM_NE3_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAM_NE4_InitStructure;

FSMC_NORSRAMTimingInitTypeDef  p3;
FSMC_NORSRAMTimingInitTypeDef  p4;

GPIO_InitTypeDef GPIO_InitStructure; 

/* Enable GPIOs clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | 
                     RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);

// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Enable FSMC clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); 

FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM3);
FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM4);


/*-- GPIOs Configuration ------------------------------------------------------*/
/*
+-------------------+--------------------+------------------+------------------+
+                       SRAM pins assignment                                  +
+-------------------+--------------------+------------------+------------------+
| PD0  <-> FSMC_D2  | PE0  <-> FSMC_NBL0 | PF0  <-> FSMC_A0 | PG0 <-> FSMC_A10 |
| PD1  <-> FSMC_D3  | PE1  <-> FSMC_NBL1 | PF1  <-> FSMC_A1 | PG1 <-> FSMC_A11 |
| PD4  <-> FSMC_NOE | PE7  <-> FSMC_D4   | PF2  <-> FSMC_A2 | PG2 <-> FSMC_A12 |
| PD5  <-> FSMC_NWE | PE8  <-> FSMC_D5   | PF3  <-> FSMC_A3 | PG3 <-> FSMC_A13 |
| PD8  <-> FSMC_D13 | PE9  <-> FSMC_D6   | PF4  <-> FSMC_A4 | PG4 <-> FSMC_A14 |
| PD9  <-> FSMC_D14 | PE10 <-> FSMC_D7   | PF5  <-> FSMC_A5 | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8   | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 |
| PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9   | PF13 <-> FSMC_A7 |------------------+
| PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10  | PF14 <-> FSMC_A8 | 
| PD14 <-> FSMC_D0  | PE14 <-> FSMC_D11  | PF15 <-> FSMC_A9 | 
| PD15 <-> FSMC_D1  | PE15 <-> FSMC_D12  |------------------+
+-------------------+--------------------+
*/
/* GPIOD configuration */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
                            GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &GPIO_InitStructure);


/* GPIOE configuration */
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 |
                            GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | 
                            GPIO_Pin_15;
                            
GPIO_Init(GPIOE, &GPIO_InitStructure);


/* GPIOF configuration */
GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource2, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource3, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource13, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource15, GPIO_AF_FSMC);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3 |
                            GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_12 | GPIO_Pin_13 | 
                            GPIO_Pin_14 | GPIO_Pin_15;      
GPIO_Init(GPIOF, &GPIO_InitStructure);


/* NOE, NWE and CLK configuration */  

GPIO_PinAFConfig(GPIOD,GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);

//Ethernet Channel #1_NE3
GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
GPIO_Init(GPIOG, &GPIO_InitStructure);

//Ethernet Channel #2_NE4
GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
GPIO_Init(GPIOG, &GPIO_InitStructure);
/*-- FSMC Configuration ------------------------------------------------------*/

// < Enable FSMC Bank1_SRAM3 Bank >
/*
p3.FSMC_AddressSetupTime = 3;
p3.FSMC_AddressHoldTime = 0;
p3.FSMC_DataSetupTime = 20;
p3.FSMC_BusTurnAroundDuration = 0;
p3.FSMC_CLKDivision = 0;
p3.FSMC_DataLatency = 0;
p3.FSMC_AccessMode = FSMC_AccessMode_A;
*/
p3.FSMC_AddressSetupTime = 15;
p3.FSMC_AddressHoldTime = 15;
p3.FSMC_DataSetupTime = 255;
p3.FSMC_BusTurnAroundDuration = 15;
p3.FSMC_CLKDivision = 16;
p3.FSMC_DataLatency = 17;
p3.FSMC_AccessMode = FSMC_AccessMode_A;

FSMC_NORSRAM_NE3_InitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
FSMC_NORSRAM_NE3_InitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAM_NE3_InitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAM_NE3_InitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAM_NE3_InitStructure.FSMC_ReadWriteTimingStruct = &p3;
FSMC_NORSRAM_NE3_InitStructure.FSMC_WriteTimingStruct = &p3;

FSMC_NORSRAMInit(&FSMC_NORSRAM_NE3_InitStructure); 
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); 
 
// < Enable FSMC Bank1_SRAM4 Bank > 
/*
p4.FSMC_AddressSetupTime = 3;
p4.FSMC_AddressHoldTime = 0;
p4.FSMC_DataSetupTime = 20;
p4.FSMC_BusTurnAroundDuration = 0;
p4.FSMC_CLKDivision = 0;
p4.FSMC_DataLatency = 0;
p4.FSMC_AccessMode = FSMC_AccessMode_A;
*/
p4.FSMC_AddressSetupTime = 15;
p4.FSMC_AddressHoldTime = 15;
p4.FSMC_DataSetupTime = 255;
p4.FSMC_BusTurnAroundDuration = 15;
p4.FSMC_CLKDivision = 16;
p4.FSMC_DataLatency = 17;
p4.FSMC_AccessMode = FSMC_AccessMode_A;

FSMC_NORSRAM_NE4_InitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
FSMC_NORSRAM_NE4_InitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAM_NE4_InitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAM_NE4_InitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAM_NE4_InitStructure.FSMC_ReadWriteTimingStruct = &p4;
FSMC_NORSRAM_NE4_InitStructure.FSMC_WriteTimingStruct = &p4;

FSMC_NORSRAMInit(&FSMC_NORSRAM_NE4_InitStructure); 
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); 

}

FSMC 설정에는 크게 문제가 없어 보입니다.
System Clock 이 120MHz로 간주한다면 클럭당 약 8.3ns

p4.FSMC_DataSetupTime = 20; 를 10으로 좀 더 줄일 수 있을거 판단됩니다. (문제가 해결되면 적용해보세요.)

그리고,
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 를 Pull-Up( GPIO_PuPd_UP)으로 수정해주세요.

아 그리고, 크게 상관없어 보이기는 하지만 동작하는 저희 코드는
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
입니다.

해당 문제가 특정 주소에만 나타나는지도 확인 부탁드립니다.

회신 감사합니다.

일단은 알려주신데로 설정하였으나, 증상이 사라지지 않아
더 찾던 중에 STM32 포트 설정 FSMC와 관련된 모든 포트를
아래와 같이 출력 타입을 Push Pull로 설정 후 개선이 되었습니다.
3주동안 고민한거에 비하면 너무 간단한 문제였습니다.
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
Dual로 사용하다 보니 포트의 간섭(Fanout)이 있었던 것으로 판단됩니다.
더 테스트는 진행해 봐야 알겠나 분명히 결과가 개선 된 점은 보였습니다.
지원에 감사드립니다.

해결 되었다니 다행입니다.