APM32E103-KIT #22 - WIZnet W5500 (확장보드)
APM32E103-KIT #22 - WIZnet W5500 (확장보드)
이제 확장보드에서도 마지막인 WIZnet의 W5500 보드 구현을 추가하였습니다. SPI 통신으로 쉽게 이더넷 통신을 가능하게 하는 모듈입니다. 핀연결은 아래와 같이 되어 있습니다.
SPI 제어를 위해서 하드웨어 리스트에 추가했습니다.
WIZnet 라이브러리 코드는 이전에 만들어서 사용했던 것에서 W5500 부분을 추가했습니다.
w5500.c 안에는 일부 포팅해야 하는 함수가 있습니다. SPI 를 통해서 레지스터를 읽고 쓰는 함수를 하드웨어에 맞게 수정합니다.
초기화 함수를 만들어서 WIZnet 보드를 리셋하고 SPI 초기화를 진행합니다.
위즈넷 초기화 함수도 수정을 해야 합니다. w5500Init() 함수를 추가해서 초기화 하고 이후에는 위즈넷 라이브러리 초기화를 합니다.
DHCP와 시간을 얻어오기 위해서 SNTP도 초기화를 진행합니다.
ap.c에서 위즈넷 기능을 확인 수행하는 함수를 호출해야 합니다.
위즈넷 업데이트 함수에서는 필요한 서비스에 대한 처리 함수를 차례대로 실행합니다.
OLED에 네트웍 링크 상태와 연결되었을때 시간을 받아와서 날짜와 시간을 표시하게 됩니다. 그리고 버튼을 누르면 IP 정보를 표시합니다.
void updateLCD(void) { if (lcdDrawAvailable()) { lcdClearBuffer(black); if (wiznetIsLink() == false) { lcdPrintf(0, 8, white, "Not Connected"); } else { if (wiznetIsGetIP() == true) { if (buttonGetPressed(_DEF_BUTTON1)) { wiznet_info_t net_info; wiznetGetInfo(&net_info); lcdPrintf(0, 0, white, "IP %d.%d.%d.%d", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]); lcdPrintf(0, 16, white, "DHCP : %s\n", wiznetIsGetIP() ? "True":"False"); } else { rtc_time_t rtc_time; rtc_date_t rtc_date; const char *week_str[] = {"일", "월", "화", "수", "목", "금", "토"}; rtcGetTime(&rtc_time); rtcGetDate(&rtc_date); lcdPrintf(0, 0, white, "%02d-%02d-%02d (%s)", rtc_date.year, rtc_date.month, rtc_date.day, week_str[rtc_date.week]); lcdPrintf(0, 16, white, "%02d:%02d:%02d", rtc_time.hours, rtc_time.minutes, rtc_time.seconds); } } else { lcdPrintf(0, 8, white, "Getting_IP.."); } } lcdRequestDraw(); } }
네트웍 연결 후 ping으로 일단 확인해 봅니다.
소스코드는 깃허브에 업데이트 하였습니다.
https://github.com/chcbaram/apm32e103-kit/tree/main/firmware/exam/EX-15-WIZnet-W5500
이제 확장보드에 있는 모든 모듈도 기능 확인은 완료 하였습니다.
모든 기능을 활성화 했을때 FLASH는 160KB 정도 사용되었습니다. 그래도 기존 코드들이 있어서 생각보다 빠르게 기능 구현을 진행 할 수 있었습니다.