[W5300] Register Access Problem

그 동안 W3150+를 오랜동안 사용해왔었는데, 보다 빠른 전송속도를 위해 W5300으로 새로이 설계를 해 보았습니다.

Controller는 STM32F429를 사용중입니다.

기본적인 동작모드는 16bit bus의 Indirect 모드로 설계하였습니다.
회로는 다음과 같습니다.
STM32의 bus는 16bit로 설정했기 때문에 0x02 번지이면 (EA1 = ‘0’, EA0 = ‘1’)이 되고
0x04 번지이면 (EA1 = ‘1’, EA0 = ‘0’) 이 됩니다.

  1. 초기화 과정에서 setMR() 및 getMR()을 이용하여 MR register를 write/read는 정상적으로 이루어 집니다.

  2. getIDR()을 통해 DeviceID를 읽어보면 MR register의 값만 읽혀옵니다.
    예를 들어 setMR(0xBC01)을 이후 getMR()의 값은 당연히 0xBC01으로 읽혀집니다.
    그리고 나서 getDR()을 하면 0xBC01로 읽혀집니다.

#define IDM_AR ((WIZCHIP_IO_BASE + 0x0002))
#define IDM_DR ((WIZCHIP_IO_BASE + 0x0004))
#define W5300_IO_BASE 0x0000

#define setIDM_AR(ar) (**((uint16_t )IDM_AR) = (uint16_t)((ar) & 0xFFFF))
#define getIDM_AR() (
((uint16_t **)IDM_AR))

(위에서 **은 더블포인터가 아니고 그냥 포인터 입니다. ‘*’ 표시되지 않아)

위 선언후, 예를 들어
setIDM_AR(0x024A) 이후 getIDM_AR()을 하면 0x004A로 읽혀집니다.

어떤 부분이 잘못되면 이러한 문제가 발생할 수 있는지 도움 요청드립니다.

원인을 알아냈습니다.

Datasheet 상에는 16bit 모드로 사용할 때, W5300은 내부적으로 A0 를 무시하기 때문에 A0 pin을 하드웨어적으로 float 하라고 되어 있습니다.

그런데 A0 pin이 float 상태에서 Direct 모드로 레지터를 access 하면 정상적으로 read/write가 가능했습니다.
그러나 Indirect 모드에서는 정상적으로 read/write 가 되지 않았습니다.

A0 pin을 GND에 연결하고 나면 Direct/Indirect 모두 다 정상적으로 access 가능 합니다.