W5300 사용중 질문입니다.


#1

안녕하십니까?
W5300에 ARM9 계열의 CPU를 연결해서 과제 진행중에 있습니다.
driver 파일과 데이터 북을 참고하여 loopback test부터 시작해서 다양한 실험을 하고 있는데,
아직 Link를 못붙이고 있습니다.
일단 TCP 서버인 경우에는 Listen 상태에서 계속 대기 상태에 있고,
TCP 크라이언트의 경우에는 Connect 상태에서 ARP 상태로 된후에 다음 동작이 안되고 있습니다.

Internal Phy를 사용하여 동작중입니다.
Loopback0 - 5 : 서버
Loopback6 : 크라이언트 까지 초기 설정한 후의 register를 dump 한 결과는 다음과 같습니다.
(Base address는 0x8000_0000 입니다.)

80000000 | 9800 0000 0000 0000 0008 dc00 52b9 0000
80000010 | 7988 5281 ffff ff00 7988 52bb 000a 000f
80000020 | 0808 0808 0808 0808 0808 0808 0808 0808
80000030 | 00ff 0000 0000 0028 0000 0000 0000 0000
80000040 | 0000 0000 0000 0000 0000 0000 0000 0000
80000050 | 0000 0000 0000 0000 0000 0000 0000 0000
80000060 | 0020 d55e 0020 e40b 0020 ec25 0020 e2a4
80000070 | 0000 0000 0000 0000 0000 0000 0000 0000
80000080 | 0000 0000 0000 0000 0000 0000 0000 0000
80000090 | 0000 0000 0000 0000 0000 0000 0000 0000
800000a0 | 0000 0000 0000 0000 0000 0000 0000 0000
800000b0 | 0000 0000 0000 0000 0000 0000 0000 0000
800000c0 | 0000 0000 0000 0000 0000 0000 0000 0000
800000d0 | 0000 0000 0000 0000 0000 0000 0000 0000
800000e0 | 0000 0000 0000 0000 0000 0000 0000 0000
800000f0 | 0000 0000 0000 0000 0000 0000 0000 5300

80000200 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
80000210 | ffff 0000 0000 0000 05b4 0000 0000 0080
80000220 | 0000 0000 0000 2000 0000 0000 0040 4c7d
80000230 | fa3b 0000 8000 0000 0002 0000 0002 0000
80000240 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
80000250 | ffff 0000 0000 0000 05b4 0000 0000 0080
80000260 | 0000 0000 0000 2000 0000 0000 0040 1cc8
80000270 | 3c0e 1000 9000 0000 0002 0000 0002 0000
80000280 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
80000290 | ffff 0000 0000 0000 05b4 0000 0000 0080
800002a0 | 0000 0000 0000 2000 0000 0000 0040 fd5a
800002b0 | 2072 2000 a000 0000 0002 0000 0002 0000
800002c0 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
800002d0 | ffff 0000 0000 0000 05b4 0000 0000 0080
800002e0 | 0000 0000 0000 2000 0000 0000 0040 2a13
800002f0 | 4b4e 3000 b000 0000 0002 0000 0002 0000
80000300 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
80000310 | ffff 0000 0000 0000 05b4 0000 0000 0080
80000320 | 0000 0000 0000 2000 0000 0000 0040 981c
80000330 | 44a6 4000 c000 0000 0002 0000 0002 0000
80000340 | 0001 0000 00ff 0000 0113 1f40 ffff ffff
80000350 | ffff 0000 0000 0000 05b4 0000 0000 0080
80000360 | 0000 0000 0000 2000 0000 0000 0040 26a9
80000370 | 54aa 5000 d000 0000 0002 0000 0002 0000
80000380 | 0001 0000 00ff 0000 0113 03e8 ffff ffff
80000390 | ffff 0000 0000 0000 05b4 0000 0000 0080
800003a0 | 0000 0000 0000 2000 0000 0000 0040 5f09
800003b0 | 936c 6000 e000 0000 0002 0000 0002 0000
800003c0 | 0000 0000 00ff 0000 0100 0000 ffff ffff
800003d0 | ffff 0000 0000 0000 0000 0000 0000 0080
800003e0 | 0000 0000 0000 2000 0000 0000 0040 4c7d
800003f0 | 4c7d 7000 f000 2000 2002 2000 2002 2000

계속 Loopback을 동작시키면 (while 사용하여) TX_LED는 주기적으로 깜빡거립니다.
이 LED 동작은 크라이언트로 설정된 socket6번에 의해 동작함을 확인했습니다.
그리고 연결된 Transformer의 TXP, TXN과 RXP, RXN 의 신호가 주기적으로 발생하는 것도 확인했습니다.
다만 허브와 연결된 RJ45 port를 제거하면 TX LED 는 계속 깜빡거리는데,
Transformer의 TX / RX 모든 신호의 움직임이 정지됩니다.

혹시 설정이 잘못되어 TX 신호 자체가 나가지 않고 있는것 아닌가 하는 의심을 하게 되네요.
위의 내용으로 제가 잘못설정한 부분을 알려주실수 있을까요?
혹시 더 필요하신 정보가 있으시면 말씀해 주시면 바로 대응하겠습니다.

감사합니다.


#2

아… 레지스터 설정이 잘못되었을 수도 있어…
사용하고자 하는 값을 추가로 드립니다.

Mac Address -> 00:08:dc:00:52:b9
G/W IP Addr.-> 121.136.82.129
SubNet Mask -> 255.255.255.0
IP Address -> 121.136.82.187

이렇게 사용하여 진행하려 했습니다.

감사합니다.


#3

Reference 회로도에 보면 외부 Trasformer의 TCT, RCT port에 3.3VA 가 연결되는것 같은데, 이것을 연결 안해서 그런것일까요? 저희가 사용하는 Transformer는 H1102NL 입니다. 이 port의 2번, 7번에 3.3VA를 연결해야 할까요?
참고로 사용하는 databook의 link는 다음과 같습니다.
datasheet.octopart.com/H1102NL-P … 371638.pdf

조언 부탁드립니다.


#4

IP 설정을 보아하니 Static Real IP를 사용하시는 것 같습니다.
우선 MAC addess는 유니크한 것을 사용하여합니다(WAN과 연결을 위해서)

우선 정확한 원인을 파악하기 위해
Network 정보를 가상 아이피(192.168.x.x)와 같이 설정하여서 LAN 망에서 아니면 Test PC와 Direct로 연결하여 테스트해세요.

감사합니다.


#5

안녕하세요, yenaru 님

MAGJACK의 경우 reference schematic을 따라 주셔야 정상적인 동작을 보장 드립니다.

질문하신 TCT와 RCT에 전원을 연결해 보시고 테스트 부탁드립니다.

또한 이것 말고도 저희 회로와 다른점이 있으시다면 이 또한 바꿔주시길 바랍니다.

감사합니다.


#6

앞선 문제는 해결되었습니다.
3.3V를 연결하지 않아서 발생한 문제네요.
현재 개발용 세트는 TCP 서버로 동작시키고, PC의 테라텀을 TCP 크라이언트로 붙여서 동작 테스트 중에 있습니다.
일단 TX, RX 모두 잘 동작하고 있습니다.
다만 두가지 질문이 추가로 생겼습니다.
일단 저희는 1:1로 붙여서 사용할 계획이라 현재 Socket0만을 사용하려 하고 있고,
Socket buffer를 TX / RX 각 64KB로 할당하고 나머지 socket은 모두 0으로 할당하고 close 상태로 두었습니다.

질문 1. RX Buffer 동작
PC에서 테라텀을 이용하여 300 Byte의 데이터를 송신하였더니, 수신측에서는 100 Byte, 200 Byte 이렇게 나누어서 수신이 됩니다. (데이터는 연결해서 보면 정상입니다.) 이것은 송신측의 문제인가요? 아니면 수신측에서 나누어 받도록 설정하는 것이 있나요?

질문 2. TX Buffer 동작
Send 동작시 64K Byte까지는 모두 정상적으로 동작하는 것 같습니다.
64K를 초과하는 것에 대해 시험중에 이상한 현상이 있습니다.
예를 들어 64K + 24 data를 보내려고 할때,

  1. TXFIFOR에 64K Write
  2. BRDY1 port 설정
    -> P1_BRDYR(0x64) = 0x80 (Enable / RX / Active Low / Socket0)
    -> P1_BDPTH(0x66) = 0x2000
    -> 해당 port를 Interrupt에 연결
  3. TX_WSR에 128K의 값설정 (0x20000)
  4. CR <- SEND Command assign
  5. BRDY1에 연결된 Interrupt 발생
    -> 24Byte Data 저장 (TXFIFOR)
  6. Socket0의 SendOK 필드에 의한 Interrupt 발생
    이렇게 정상적으로 동작합니다.
    그런데 SendOK 동작후에 TX_FSR을 확인해 보면 “0x18” 이라는 값이 나옵니다.
    이값은 10진수로 24에 해당하죠.
    이 값이 바뀌질 않습니다. (장시간 대기해도…)
    이후에 40Byte의 data를 추가로 보내면 해당 data는 잘 나가는 것 같은데 (FSR을 체크하지 않고 그냥 보냈습니다.)
    SendOK 후에도 FSR값은 여전히 0x18로 나옵니다.
    이렇게 0x10000 (64KB)를 넘지 않는 data는 계속 보내도 잘 나가는것 같고, 이후에 FSR은 계속 0x18로 남습니다.
    그러다가 0x10000을 넘는 data를 보내려 하면, BRDY에 의한 interrupt 가 발생하지 않거나, 발생한 경우에 동작후에는 FSR값이 다른 값으로 변하여 그 상태로 남습니다.
    이 FSR이 변경되지 않는 이유는 무엇일까요?
    제가 알고 싶은 내용은 Socket buffer보다 큰 data를 보내려 할때 어떻게 처리하면 좋을지에 대한 내용입니다.
    위의 사항이 번거로우시면 큰 data를 보낼때의 처리 방법을 알려주시면 감사하겠습니다.

감사합니다.
일단 64K를


#7

안녕하세요.

질문하신 내용에 대해 답변드리도록 하겠습니다.

  1. 송신측에서 fragmentation 해서 보내는 겁니다. 송신측 어플리케이션에서 MTU(Maximum Transmission Unit)설정이 200byte로 되어있을 겁니다. 이 부분을 설정해 주시면 됩니다.

  2. socket buffer보다 큰 데이터는 전송할 수 없습니다. 그러므로 필히 펌웨어에서 FSR을 확인한 후에 이보다 작은 크기의 데이터를 전송해 주시길 바랍니다.

감사합니다.


#8

1번 답변에 대해서는 이해 되었습니다.
2번 답변에 대해 추가 질문이 있습니다.
소켓 버퍼보다 큰 데이터를 보낼수 없다고 하셨는데…
만일 소켓0의 buffer를 8KB로 잡고, 보낼 데이터가 16KB 일때,
1. buffer에 8KB 저장
2. TX_WSR 설정 (16KB로…)
3. CR에 SEND 명령
4. TX_FSR check하여 FSR이 4KB 이상일때까지 대기
5. buffer에 4KB 추가 저장
6. 4번과 동일하게 대기
7. buffer에 남은 4KB 추가 저장
8. SendOK 수신
이런 식으로 처리할 수 없다는 말씀이신가요?

그리고 추가 질문이 생겼습니다. (처음이다 보니 할수록 질문이 생기네요…)
제가 4개의 socket을 열어 사용하려 하고, TX 데이터가 양이 많아서 아래와 같이 설정하려 합니다.
TX SK0 Buffer : 24
TX SK1 Buffer : 24
TX SK2 Buffer : 24
TX SK3 Buffer : 24
TX SK4 Buffer : 0
TX SK5 Buffer : 0
TX SK6 Buffer : 0
TX SK7 Buffer : 0
RX SK0 Buffer : 8
RX SK1 Buffer : 8
RX SK2 Buffer : 8
RX SK3 Buffer : 8
RX SK4 Buffer : 0
RX SK5 Buffer : 0
RX SK6 Buffer : 0
RX SK7 Buffer : 0
MTYPE : 0x0FFF
이렇게 설정하면 되는 것인가요?

마지막으로 TX 진행시, FIFO Write, WSR 설정, Send 명령 설정후
SendOK를 받았는데, FSR을 읽어보니 남은 FIFO양이 초기 상태와 다른 경우가 있습니다.
이런 case는 어떻게 발생하고, 이때는 어떻게 FSR을 clear 해야 하나요?

감사합니다.


#9

안녕하세요.

  1. 2번과 관련된 추가 질문에 대한 답을 해드리도록 하겠습니다.
    데이터시트에도 명시되어 있듯이 Sn_TX_WRSR은 TMSRn에 의해 설정된 메모리 크기보다 크게 설정할 수 없습니다.

  2. 버퍼설정은 맞게 하셨습니다. 8의 배수로 설정하는 것과 총 합이 128K를 넘지 않도록 하는 것만 유의 하시면 됩니다.

  3. SENDOK 인터럽트는 칩 내부에서 SEND 명령어를 올바르게 인식하였다는 의미 입니다. 즉 SEND를 완료하였다는 의미가 아닙니다.

예를 들어 설명 드리면, 2개의 패킷을 보낸다고 가정해보면,

  1. 1번 패킷을 TX 버퍼에 입력후 SEND 명령을 내림
  2. SENDOK 이후 2번 패킷을 TX버퍼에 입력후 SEND 명령을 내림
  3. 1번 패킷에 대한 ACK신호를 받음
  4. FSR이 1번 패킷의 크기 만큼 증가
  5. 2번 패킷에 대한 ACK신호를 받음
  6. FSR이 2번 패킷의 크기 만큼 증가

이런 과정을 거치게 됩니다. TCP에서는 ACK를 정상적으로 받지 못할 경우 재전송을 해야 하기 때문에 패킷을 버퍼에 저장시켜놓기 때문에 FSR이 SEND명령을 내렸다고 해서 증가하지는 않습니다.

감사합니다.


#10

감사합니다.