포팅중에 w5100s의 레지스터를 엑세스하는 코드에서 의문이 있어서 문의드립니다.
저는 indirect 모드를 사용하려는데,
코드를 보니 아래처럼 정의되어 있는데, #if (WIZCHIP_IO_MODE & WIZCHIP_IO_MODE_SPI) #define getMR() WIZCHIP_READ(MR) #else #define getMR() ((uint8_t)MR) #endif
그렇다면 indirect 모드에서는 #define getMR() ((uint8_t)MR)
인데, 제가 보기에는 이코드는 direct모드의 코드로 보이는데 ??
주소에서 바로 값을 읽어오는 위의 코드는 direct모드가 아닌가요?
indirect 모드에서는 주소를 보내고 MR값을 읽어와야 하는게 아닌가요?
여기에서 아셔야 할점은, W5100와 W5100S에서의 IDM_OR은 실제 MR 을 나타내는 주소입니다.
이전에도 말씀드렸듯이 W5100에서 W5100S을 변경하고자하는 고객을 위해 설계된부분이고,
W5100에서는 Direct mode에서 indirect mode로 변경시 IDM_OR의 한 bit를 세팅해주면 변경이 되었습니다.
이 부분에 관해서는 W5100S에서 해당 비트는 사용하지 않지만, W5100사용자들을 위해 0x6000_0000에 값을 쓰거나 읽게 되면, MR register에 접근을 하게 됩니다.
이부분은 테스트 완료 된 부분이기때문에, 익센셥이 발생하지 않습니다.
기술되지 않은 부분이란 어떤걸 얘기하시는건지…
Indirect mode 일때,WIZCHIP_IO_BASE 의 값은 MCU 마다 다른 부분입니다.
Wiznet에서 제공하는 예제의 MCU에서 는 해당 address를 사용하기 때문에, 0x6000_0000에 Base address로 세팅되어있는 것입니다.
즉, W5100s에서 AD0,1은 (외부메모리 인터페이스에 사용되는) 어드레스 버스신호선(보통 AD[31:0])의 최하위 2비트를 W5100s에 연결하는 경우를 말씀하시는 거군요.
예, 맞습니다.
이 경우에는 정성동작하겠네요.
(그런데, 이렇게 사용하는 유저는 별로 없을 듯…)
저도 CORTEX-M0의 GPIO를 AD0,1에 연결해서 사용합니다.
이경우에는 0x6000_0000은 사용되지 않는 영역이므로 메모리 익셉션이 발생하게 됩니다.(확인했습니다)
저와 같은 경우에는 ioLibrary의 함수를 그대로 사용하면 않되겠네요.
수정이 필요하겠네요.
// MAC ADDRESS
for (i = 0 ; i < 6; i++) {
info.mac[5-i] = (param.mac >> (i * 8)) & 0xFF;
}
// Local IP ADDRESS
for (i = 0 ; i < 4; i++) {
info.ip[3-i] = (param.ip >> (i * 8)) & 0xFF;
}
// Subnet Mask ADDRESS
for (i = 0 ; i < 4; i++) {
info.sn[3-i] = (param.subnet >> (i * 8)) & 0xFF;
}
// GateWay ADDRESS
for (i = 0 ; i < 4; i++) {
info.gw[3-i] = (param.gateway >> (i * 8)) & 0xFF;
}