[FPGA]/Zynq(MPSOC)2018. 4. 24. 04:52

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;

}


Posted by nexp

댓글을 달아 주세요

[DSP]/DSP283352013. 9. 22. 20:38

TMS320F28335 - W5300 MACRAW를 이용한 EtherCat Test

TMS320F28335 - W5300 MACRAW를 이용한 EtherCat Test




W5300은 하드웨어적으로 TCP/IP를 구현한 Ethernet Controller이지만 Ethernet 데이터 부분을 사용자 임의 데이터를 보낼수 있는 MACRAW 모드로 구동할 수 있다. MACRAW 모드를 이용하면 임의이 데이터를 보낼수 있는데.. EtherCat 페킷을 보내면  EhterCat 통신을 할 수 있다. 특히 TMS320F28335와 같이 실시간 처리가 가능한 DSP를 이용하면 EtheCat구현이 쉬어진다. 





아래 표는 EtherCat Frame 데이터 구조이다.

간단히 구조를 살펴 보면 목적지, 출발지 MAC주소와 EtherType에 0x88A4를 사용하고 EtherCat Data를 전송하면 된다.




EhterCat Data 필더에는 2Byte의 총 데이터 길이와 Cmd, Idx, Address... 등등의 Data Headerd와 데이터로 채워진다.

데이터는 2+26 번째 버퍼 부터 시작된다.





W5300 MACRAW 모드 초기화

Sn_MR_MACRAW 모드로 소켓을 생성하면 된다. 여기서 주의 사항은 MACRAW모드는 반드시 소켓 0번만 가능하다.

void Init_EtheCat(void)

{

socket(0, Sn_MR_MACRAW, 3000, Sn_MR_MF);

}




EtherCat 데이터 전송함수

데이터 송신시 첫 2Byte의 EtherHeader 와 마지막 2Byte CRC는 W5300에서 자동 생성된다. 다만 수신은 모든 페킷이 수신되므로 이부분을 적절히 처리해 주어야 한다.

uint32   EtherCatSend(SOCKET s, uint8 * buf, uint32 len)

{

   uint8 status=0;

   uint8 isr=0;

   uint32 ret=0;

   

   // check size not to exceed MAX size.

   if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); 

   else ret = len;

   

   // copy data

   wiz_write_buf(s, buf, ret); 


   // send

   setSn_TX_WRSR(s,ret);

   setSn_CR(s, Sn_CR_SEND);

   

   

   // wait SEND command completion

   while (!((isr = getSn_IR(s)) & Sn_IR_SENDOK)) 

   {

      status = getSn_SSR(s);                               

      if ((status == SOCK_CLOSED) || (isr & Sn_IR_TIMEOUT)) 

      {                                                    

         setSn_IR(s,Sn_IR_TIMEOUT);

         return 0;

      }

   }

   

   // Clear Sn_IR_SENDOK

   setSn_IR(s, Sn_IR_SENDOK); 


   return ret;   

}





TMS320F28335, W5300을 이용한 EtherCat 테스트

테스트는 두세트의 이더넷 모듈을 이용해서 스위치를 누르면 EtherCat 페킷으로 데이터를 전송하고 수신된 데이터를 분석해서 LED를 On/Off 하도록 했다. 


수신된 데이터는 WireShack를 이용하여 패킷을 캡쳐할 수 있고 EtherCat 데이터를 확인할수 있다.

26번 버퍼부터 데이터 필더 이다.  테스트에서는 스위치를 누를때 마다 1씩 증가해서 전송하도록 해서 테스트 했다.



그리고 시리얼포트를 이용하여 수신된 페킷을 확인할 수 있다.




TMS320F28335와 W5300 MACRAW모드를 이용한 EtherCat 테스트 동영상



Posted by nexp

댓글을 달아 주세요

  1. kiisae

    관리자의 승인을 기다리고 있는 댓글입니다

    2016.07.16 21:30 [ ADDR : EDIT/ DEL : REPLY ]