WIZnet Developer Forum

어드레스 접근 문제

하드웨어 작업을 하기전에 WIZ140SR 에 프로그램을 라이팅 해서 테스트를 하고 있습니다.
관련 글 중에 getIDR() 을 했을 경우 5300 으로 읽혀야 하는데 0100 이나 B800 등으로 읽혔었습니다.

STM32 의 FSMC bank 설정을 FSMC_Bank1_NORSRAM2 (64000000) 으로 했던게 원인이었습니다.

이부분은 #define DEF_IINCHIP_MAP_BASE ((uint32_t)0x68000000)
이렇게 고치고 해당 레지스터들을 미리 쉬프트 했습니다.

#define IDR (COMMON_REG_BASE + 0xFE*2)
#define IDR1 (IDR + 1)

위처럼 고치니까 getIDR() 을 했을 경우 5300 으로 정상 출력이 되었습니다.

그러나 IP 라든지, MAC 이라든지 이런 부분을 아래와 같이
uint8 ip[4] = {192,168,0,100}; // for setting SIP register
uint8 gw[4] = {192,168,0,1}; // for setting GAR register
uint8 sn[4] = {255,255,255,0}; // for setting SUBR register
uint8 mac[6] = {0x00,0x08,0xDC,0x11,0x22,0x86}; // for setting SHAR register

GPIO_ResetBits(GPIOF, GPIO_Pin_6);
Delay(10);
GPIO_SetBits(GPIOF, GPIO_Pin_6);

// initiate W5300
iinchip_init();

setMR(getMR()|MR_FS);            
setSHAR(mac);                                      // set source hardware address

// configure network information
setGAR(gw);                                     // set gateway IP address
setSUBR(sn);                                    // set subnet mask address
setSIPR(ip);                                    // set source IP address

라이팅 하고 읽어보면
W5300 ver : 5300
W5300 MR : B900
Network Setting Information
Physical Address : dc:11:dc:11:22:86
Gateway Address : 0.1.0.1
Subnet Mask : 255.0.255.0
Ip Address : 0.100.0.100

이렇게 출력이 됩니다. 첨부된 파일처럼 레지스터들을 모두 2배수 했는데 안되는 이유는 무었인가요?
w5300.h (26.7 KB)

W5300 ver : 5300
W5300 MR : B900
Network Setting Information
Physical Address : dc:11:dc:11:22:86
Gateway Address : 0.1.0.1
Subnet Mask : 255.0.255.0
Ip Address : 0.100.0.100

Physical address를 제외하고 모두 0x00이 확장되어 Access되어지는 것 같습니다.
Ver과 MR 값이 0x00으로 제대로 읽힌 듯 보이나 Subnet mask값을 보면 0xFF00과 같은 것을 볼 수 있습니다.

사용하시는 Data bit는 그리고 하드웨어 연결도를 알려주세요.
그리고 FSMC가 Address 출력시 byte address를 보내는지 16bit address를 보내는지 확인 부탁드립니다.

스코프로 확인시 어드레스 및 데이터는 16비트로 동작하는게 확인 되었습니다.

uint8 mac[6] = {0x01,0x02,0xDC,0x1E,0x5E,0x0E}; // for setting SHAR register
uint8 addr[6]= {0,0,0,0,0,0};
vPrintf(UART1_SERIAL, “Write : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
setSHAR(mac);

getSHAR(addr); // get source hardware address
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);

이렇게 사용하면
Read : dc:1e:dc:1e:5e:0e
이렇게 읽힙니다.

IINCHIP_WRITE(SHAR2,((uint16)mac[2]<<8)+mac[3]);
addr[0] = (uint8)(IINCHIP_READ(SHAR)>>8);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
addr[1] = (uint8)IINCHIP_READ(SHAR);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);

addr[2] = (uint8)(IINCHIP_READ(SHAR2)>>8);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);

addr[3] = (uint8)IINCHIP_READ(SHAR2);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);

IINCHIP_WRITE(SHAR4,((uint16)mac[4]<<8)+mac[5])
addr[4] = (uint8)(IINCHIP_READ(SHAR4)>>8);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
addr[5] = (uint8)IINCHIP_READ(SHAR4);
vPrintf(UART1_SERIAL, “Read : %02x:%02x:%02x:%02x:%02x:%02x\r\n”, addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);

Write : 01:02:dc:1e:5e:0e
Read : 01:00:00:00:00:00
Read : 01:02:00:00:00:00
Read : 01:02:dc:00:00:00
Read : 01:02:dc:1e:00:00
Read : 01:02:dc:1e:5e:00
Read : 01:02:dc:1e:5e:0e

이렇게 정상적으로 읽힙니다.
레지스터에 1번 접근하고 다음 레지스터에 접근할 때의 문제 일까요?

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.