본문 바로가기

[FPGA]/Zynq(MPSOC)

Zynq UltraScale+ MPSoC 보드 테스트 - EtherCAT 테스트


Zynq UltraScale+ MPSoC 보드  EtherCAT 테스트 


Zynq UltraScale+ MPSoC 보드를 이용하여 EtherCAT 통신 테스트를 해보았다.

기존에 제작 하였던 EtherCAT Slave 보드를 이용하여 간단히 데이터 전송하는 예제로 테스트 했고 간단히 확인을 위해 패킷캡쳐 프로그램으로 전송되는 데이터를 확인했다. 


Wireshark 에서 Zynq UltraScale+ MPSoC의 EtherCAT 전송 데이터를 확인 할 수 있다.


Zynq MPSoC 에서 EtherCAT의 사용은 기본적인 테스트 결과 가능해 보인다. 물론 가장 기본 적인 테스트만 검토한 결과라 HOST쪽에서 좀더 많은 테스트가 필요할 것같다. 결론적으로 로봇쪽에서 Zynq MPSoC를 EtherCAT 제어용으로 사용한다면 검토 해볼만 할것 같다.


Zynq UltraScale+ MPSoC EtherCAT 테스트 기본 예제코드

int main(void)

{

struct netif *netif;

unsigned char test_buf[] = {1, 2};

unsigned int cnt = 0;

/* the mac address of the board. this should be unique per board */

unsigned char mac_ethernet_address[] = {

0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };


netif = &server_netif;

#if defined (__arm__) && !defined (ARMR5)

#if XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1 || \

XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1

ProgramSi5324();

ProgramSfpPhy();

#endif

#endif


/* Define this board specific macro in order perform PHY reset

 * on ZCU102

 */

#ifdef XPS_BOARD_ZCU102

IicPhyReset();

#endif


init_platform();


xil_printf("\r\n\r\n");

xil_printf("-----lwIP RAW Mode UDP Server Application-----\r\n");


/* initialize lwIP */

lwip_init();


/* Add network interface to the netif_list, and set it as default */

if (!xemac_add(netif, NULL, NULL, NULL, mac_ethernet_address,

PLATFORM_EMAC_BASEADDR)) {

xil_printf("Error adding N/W interface\r\n");

return -1;

}

netif_set_default(netif);


/* now enable interrupts */

platform_enable_interrupts();


/* specify that the network if is up */

netif_set_up(netif);


#if (LWIP_DHCP==1)

/* Create a new DHCP client for this interface.

 * Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at

 * the predefined regular intervals after starting the client.

 */

dhcp_start(netif);

dhcp_timoutcntr = 24;

while (((netif->ip_addr.addr) == 0) && (dhcp_timoutcntr > 0))

xemacif_input(netif);


if (dhcp_timoutcntr <= 0) {

if ((netif->ip_addr.addr) == 0) {

xil_printf("ERROR: DHCP request timed out\r\n");

assign_default_ip(&(netif->ip_addr),

&(netif->netmask), &(netif->gw));

}

}


/* print IP address, netmask and gateway */

#else

assign_default_ip(&(netif->ip_addr), &(netif->netmask), &(netif->gw));

#endif

print_ip_settings(&(netif->ip_addr), &(netif->netmask), &(netif->gw));


xil_printf("\r\n");


/* print app header */

print_app_header();


/* start the application*/

start_application();

xil_printf("\r\n");


g_netif = netif;


//low_level_input(g_netif);


while (1) {

//xemacif_input(netif);

ether_macraw_input(netif);

}


/* never reached */

cleanup_platform();


return 0;

}


반응형