---
title: "[W5300] Register Access Problem"
url: "https://maker.wiznet.io/forum/13998"
markdown_url: "https://maker.wiznet.io/forum/13998/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "Ladyhawk"
created: "2020-09-07T09:13:45+09:00"
last_activity: "2020-09-08T03:51:39+09:00"
language: "ko"
views: 908
replies: 1
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# [W5300] Register Access Problem

## Question

Asked by Ladyhawk on 2020-09-07 in Ethernet Chips.

그 동안 W3150+를 오랜동안 사용해왔었는데, 보다 빠른 전송속도를 위해 W5300으로 새로이 설계를 해 보았습니다. Controller는 STM32F429를 사용중입니다. 기본적인 동작모드는 16bit bus의 Indirect 모드로 설계하였습니다. 회로는 다음과 같습니다. STM32의 bus는 16bit로 설정했기 때문에 0x02 번지이면 (EA1 = ‘0’, EA0 = ‘1’)이 되고 0x04 번지이면 (EA1 = ‘1’, EA0 = ‘0’) 이 됩니다. w5300_inter474×746 97.6 KB 초기화 과정에서 setMR() 및 getMR()을 이용하여 MR register를 write/read는 정상적으로 이루어 집니다. 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로 읽혀집니다. 어떤 부분이 잘못되면 이러한 문제가 발생할 수 있는지 도움 요청드립니다.

## Replies

### Reply 1 by Ladyhawk, 2020-09-08

원인을 알아냈습니다.

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

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

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

---

Source: https://maker.wiznet.io/forum/13998
