w5300과DSP간 연결문제


#1

w5300을 DSP의 외부메모리 인터페이스와 연결하여 사용하고 있습니다.

DSP와 PC와 1:1통신을 하는 용도로 사용하기 때문에 /CS는 필요하지 않을것 같은데

  1. /CS 항상 LOW상태를 유지하도록 설정해도 되나요?

DSP의 어드레스핀 0~9 번을 w5300의 어드레스핀 0~9번과 연결하였습니다.

그런데 Direct모드 16bit 데이터 사용시 0번이 무시된다고 되어있는데

  1. 그렇다면 DSP의 어드레스핀 0~8을 w5300의 어드레스핀 1~9번과 연결해야 하나요?

w5300을 zone6에 맵핑하고 데이터를 입력하였습니다. (#define DEF_IINCHIP_MAP_BASE 0x00100000)

그런데 제가 설정한 주소가 아닌 다음 주소와 그다음 주소에 데이터가 저장되었습니다.

0x100008 주소에 25를 저장하도록 하면 0x100009과 0x10000A에 25가 저장됩니다.

  1. w5300의 메모리 문제인가요? 아니면 단순 DSP설정문제일까요?

#2

W5300 이외 다른 Device가 Bus를 공유하지 않는다면 /CS를 Low로 묶어 사용하셔도 무방합니다.

TMS320C286 Datasheet를 살펴본 결과 DSP는 바이트 어드레싱을 지원하지 않는것 같습니다. 16bit (Half word) addressing을 지원하는 것으며, 또한 Byte access를 지원하지 않는것으로 파악하였습니다.
TMS320C286과 W5300과의 Interface를 위해서는
DSP…W5300
A[8:0]---------->A[8:0]
D[15:0]<------->D[15:0]
와 같이 연결하시고,

iinchip_conf.h 에서

w5300.c에서

#define MR              (__DEF_IINCHIP_MAP_BASE__)

#define MR0             MR
#define MR1             (MR + 1)

#define IDM_AR          (__DEF_IINCHIP_MAP_BASE__ + 0x02)
#define IDM_AR0         IDM_AR
#define IDM_AR1         (IDM_AR + 1)

#define IDM_DR          (__DEF_IINCHIP_MAP_BASE__ + 0x04)
#define IDM_DR0         (__DEF_IINCHIP_MAP_BASE__ + 0x04)
#define IDM_DR1         (IDM_DR + 1)
//
// omitted.
//

위와 같이 정의된 모든 Register Map을
1bit right shift 시킨 맵으로 다음과 같이 수정하셔야 합니다.

#define MR              (__DEF_IINCHIP_MAP_BASE__)

#define MR0             (MR >> 1)
#define MR1             MR

#define IDM_AR          ((__DEF_IINCHIP_MAP_BASE__ + 0x02) >> 1)
#define IDM_AR0         IDM_AR
#define IDM_AR1         IDM_AR

#define IDM_DR          ((__DEF_IINCHIP_MAP_BASE__ + 0x04) >> 1)
#define IDM_DR0         IDM_DR
#define IDM_DR1         IDM_DR
//
// omitted.
//

와 같이 수정하셔야 합니다.
즉 XXX0 XXX1 register 를 모두 Right shift된 같은 주소를 사용하셔야 합니다.
XXX0 XXX1 register들의 값들은 D[15:0]에 Endian에 따라서 설정됩니다.

2번 문제의 원인으로 인한 것으로 보입니다.


#3

이부분 잘못 설명이 되어있어 정정합니다.
W5300은 16bit mode를 사용할 경우 A0를 사용하지 않습니다.
따라서
DSP…W5300
A[7:0]---------->A[8:1] <==== 여기 DSP A[0] 가 W5300 A[1]으로 연결되어야 합니다.
D[15:0]<------->D[15:0]
착오 없으시기 바랍니다.


#4

친절한답변 정말 감사드립니다.

말씀하신대로 진행하니 문자전송까지 잘 되었습니다.

그런데 궁금한게 몇가지 생겨서 질문드립니다.

getSn_SSR()함수의 출력값을 살펴본바 8bit가 넘는숫자가 출력되었습니다. (EX> 255, 275…)

그래서 함수 끝단에 리턴값을 다음과 같이 수정하여 사용하고 있습니다.

return (ssr & 0xff);

  1. getSn_SSR()함수의 출력값이 8bit가 왜 넘나요? 제가 수정한 방법으로해도 문제가 없나요?

IP, Gateway, MAC등을 설정후 메모리 상태를 살펴 보았습니다.

  1. 지정한 주소보다 한칸씩 뒤로밀려서 저장이 되어있는데 왜그런건가요?
    (ping테스트 및 문자전송은 됩니다.)
    [0x100005] 0x0008 0xDC11 ==> (mac - 00.08.DC.11.22.86)
    [0x100007] 0x2286 0x0000
    [0x100009] 0xC0A8 0x0001 ==> (Gateway - 192.168.0.1)

uint32 wiz_write_buf(SOCKET s,uint8* buf,uint32 len)
{
(생략)
for (idx = 0 idx < len; idx+=2) // => for (idx = 0 idx < len; idx++)
(생략)

PC에서 문자를 확인하는데 홀수번지의 데이터만 출력되어서

위 구문처럼 인덱스를 1씩 증가하도록 수정하였더니 잘 나왔습니다.

  1. 제가 수정한 방법에 문제는 없나요?

#5

기본기능이 완료되었다니 다행입니다.

  1. Sn_SSR은 1byte register 입니다. 따라서 상위바이트는 Reserved 영역으로 0xFF 정상출력되었습니다.
    return (ssr & 0xff); 로 마스크하여 사용하시면 됩니다.

[quote]지정한 주소보다 한칸씩 뒤로밀려서 저장이 되어있는데 왜그런건가요?
(ping테스트 및 문자전송은 됩니다.)
[0x100005] 0x0008 0xDC11 ==> (mac - 00.08.DC.11.22.86)
[0x100007] 0x2286 0x0000
[0x100009] 0xC0A8 0x0001 ==> (Gateway - 192.168.0.1)
[/quote]
혹시 [0x100005][0x100007][0x100009] ==> [0x100004][0x100006][0x100008]
로 되어야 된다는 말씀인가요? 그렇다면 맞습니다. Display시 출력시 잘못된 주소를 표시하는지 확인 하여 주세요.
Ping이 된다고 하셨기에 W5300 Register에 정확히 뒤의 주소로 정확히 Write되었다고 보시는게 맞습니다.

16bit 주소를 사용하므로, 1씩 증가시켜주는 것이 맞습니다.

  1. 우선 제가 판단하기에 Ping과 Data 송수신 테스트를 성공하셨기때문에 크게 문제 될 것은 없습니다.
    혹 문제 있다 하더라도, 주소변환문제가 완전히 포팅이 안된 것으로 보시고 그부분을 찾아서 수정하시면 될 것 같습니다.

W5300과 dsp(28346) 연결문제