[EZ-USB FX3] USB3.0 영상전송 테스트

 

 

 

EZ-USB FX3를 이용하여 USB3.0으로 영상전송 실험을 했다.

 

 

1차 프로토 케이스 

 

 

최종 케이스 및 영상 전송 결과 

 

 

FX3는 USB3.0인터페이스로 5Gbps전송율을 가지고 있다. FX2에서는 24Mhz 8051코어를 사용 했는데 FX3에서는 200Mhz ARM9코어를 사용하고 있다.

 

- ARM926EJ core with 200-MHz operation

- 512-KB or 256-KB embedded SRAM
- USB 3.0 and USB 2.0 peripherals compliant
- 5-Gbps USB 3.0 PHY compliant with PIPE 3.0
- Programmable 100-MHz GPIF II
- 8-, 16-, and 32-bit data bus

 

 

 

 

BULK모드로 전송시 OUTPUT-> 318MB/s,  INPUT -> 350MB/s 의 전송율을 보여주고 있다. 

 

 

 

 

[EZ-USB FX3] CPU점유율

USB3.0을 이용하여 벌크모드로 동영상 전송하는데 CPU점유율이 한자리수로 유지되는것을 확인할 수 있다.

 

 

[EZ-USB FX3] UART 테스트

[INTERFACE]/EZ-USB | 2012.10.19 21:30
Posted by nexp
[EZ-USB FX3] UART 테스트

 

CYUSB3014 에 UART는 아쉽게도 32bit GPIF를 사용할경우 SPI핀과 UART를 동시에 사용할수 없다.

그래서 선택적으로 사용할 수 있도록 점퍼를 설정했다.

 

 

 

 

CYUSB3014 UART초기화 함수

 CyU3PReturnStatus_t CyFxDebugInit (void)
{
    CyU3PUartConfig_t uartConfig;
    CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

    /* Initialize and configure the UART for logging. */
    status = CyU3PUartInit ();
    if (status != CY_U3P_SUCCESS)
    {
        return status;
    }

    CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
    uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;
    uartConfig.stopBit  = CY_U3P_UART_ONE_STOP_BIT;
    uartConfig.parity   = CY_U3P_UART_NO_PARITY;
    uartConfig.txEnable = CyTrue;
    uartConfig.rxEnable = CyFalse;
    uartConfig.flowCtrl = CyFalse;
    uartConfig.isDma    = CyTrue;
    status = CyU3PUartSetConfig (&uartConfig, NULL);
    if (status != CY_U3P_SUCCESS)
    {
        return status;
    }

    /* Set the dma for an inifinity transfer */
    status = CyU3PUartTxSetBlockXfer (0xFFFFFFFF);
    if (status != CY_U3P_SUCCESS)
    {
        return status;
    }

    /* Start the debug module for printing log messages. */
    status = CyU3PDebugInit (CY_U3P_LPP_SOCKET_UART_CONS, 8);

    return status;

 

 

 

 

EZ-USB FX3 Debug메세지 출력 함수

extern CyU3PReturnStatus_t
CyU3PDebugPrint (
        uint8_t priority,       /* Priority level for this message. */
        char   *message,        /* Format specifier string. */
        ...                     /* Variable argument list. */
        );

 

 

 

 

[EZ-USB FX3] GPIO 테스트

[INTERFACE]/EZ-USB | 2012.10.19 21:00
Posted by nexp

[EZ-USB FX3] GPIO 테스트

 

[EX-USB FX3] 의 확장 테스트 보드에는 GPIO 25, 26에 LED가 연결되어 있다.

 

 

 

 

 

GPIO 초기화 함수

void CyFxGpioInit (void)
{
    CyU3PGpioClock_t gpioClock;
    CyU3PGpioSimpleConfig_t gpioConfig;
    CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

    /* Init the GPIO module */
    gpioClock.fastClkDiv = 2;
    gpioClock.slowClkDiv = 0;
    gpioClock.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2;
    gpioClock.clkSrc = CY_U3P_SYS_CLK;
    gpioClock.halfDiv = 0;

    apiRetStatus = CyU3PGpioInit(&gpioClock, CyFxGpioIntrCb);
    if (apiRetStatus != 0)
    {
        /* Error Handling */
        CyU3PDebugPrint (4, "CyU3PGpioInit failed, error code = %d\n", apiRetStatus);
        CyFxAppErrorHandler(apiRetStatus);
    }


    /* Override GPIO 25 as this pin is associated with GPIF Control signal.
     * The IO cannot be selected as GPIO by CyU3PDeviceConfigureIOMatrix call
     * as it is part of the GPIF IOs. Override API call must be made with
     * caution as this will change the functionality of the pin. If the IO
     * line is used as part of GPIF and is connected to some external device,
     * then the line will no longer behave as a GPIF IO.. Here CTL4 line is
     * not used and so it is safe to override.  */
    apiRetStatus = CyU3PDeviceGpioOverride (25, CyTrue);
    if (apiRetStatus != 0)
    {
        /* Error Handling */
        CyU3PDebugPrint (4, "CyU3PDeviceGpioOverride failed, error code = %d\n",
                apiRetStatus);
        CyFxAppErrorHandler(apiRetStatus);
    }

    /* Configure GPIO 25 as output */
    gpioConfig.outValue = CyFalse;
    gpioConfig.driveLowEn = CyTrue;
    gpioConfig.driveHighEn = CyTrue;
    gpioConfig.inputEn = CyFalse;
    gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;
    apiRetStatus = CyU3PGpioSetSimpleConfig(25, &gpioConfig);
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        /* Error handling */
        CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n", apiRetStatus);
        CyFxAppErrorHandler(apiRetStatus);
    }
}

 

 

 

FX3의 펌웨어는 RTOS로 구동이되고 main함수에서 실행될 Thread를 정의해 주고     CyU3PKernelEntry ()함수로 커널 실행하면 설정한 Thread가 구동 되도록 구성되어 있다.

아래 코드는 EZ-USB FX3의 GPIO를 이용하여 LED On/Off 하는 Task의 실행 예제이다.

/* Entry function for the gpioOutputThread */
void GpioOutputThread_Entry (uint32_t input)
{
    CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

    /* Initialize Debug module */
    apiRetStatus = CyFxDebugInit();
    if (apiRetStatus != CY_U3P_SUCCESS)
    {
        /* Error handling */
        CyU3PDebugPrint (4, "Debug module initialization failed, error code = %d\n",    apiRetStatus);
        CyFxAppErrorHandler(apiRetStatus);
    }

    // Initialize GPIO module.
    CyFxGpioInit ();

   

//LED 구동 테스트

for (;;)
    {
        //LED Off
        apiRetStatus = CyU3PGpioSetValue (25, CyTrue);
  Delay(500);

        //LED On
        apiRetStatus = CyU3PGpioSetValue (25, CyFalse);
  Delay(500);
    }
}

 

 

 

 

테스트 보드의 GPIO23, 27에는 스위치가 연결되어 있다. 

 

 [EZ-USB FX3] CYUSB3014 개발환경 설정 - 펌웨어 다운로드

 

 

 

 

 

 

EZ-USB FX3 는 PMODE핀 설정에 의해 USB, I2C, SPI등등 다양한 형태로 부팅 가능하다.

 

 

가장 간단히 USB를 이용하는 방법인데 USB연결하면 기본 부트로더가 실행되고 USB Control Center로 펌웨어를 다운로드 할 수 있다.

 

 

CyUSB3014 RAM다운로드

 

 

 

 

 

[EZ-USB FX3] CYUSB3014 개발환경 설정

FX2는 8051코어이기 때문에 Cypress에서 Keil 컴파일러를 지원했지만 FX3는 ARM9으로 변경되면서 개발환경도 자체 지원하고 있다.

 

FX3를 위한 컴파일러, IDE, API등은  Cypress 홈페이지에서 다운 가능하다.

Cypress EZ-USB FX3 Software Development Kit

 

 

FX3SDKSetup.exe 를 설치하면 한번에 설정 가능하다.

 

 

 

 

 

FX3를 위해 필요한 툴을 선택해서 설정 가능하다. 처음이라면 그냥 전체를 설치 하면 된다.

 

 

 

 

IDE를 실행해 보자.그냥 Eclipse에다 arm gcc를 이용한다.

 

 

 

 

Cypress에서 제공하는 예제를 테스트 해 보기 위해 프로젝트를 Import한다.

 

 

설치된 SDK 폴더를 선택한다. 기본적으로 C:에 설치 되는데 관리를 위해서 D:로 복사했다.

 

 

 

기본 환경 설정이 끝나고 간단히 GPIO예제를 컴파일 해 보자.

컴파일은 잘되는데 중간에 워닝 에러가 발생한다.

컴파일된 이미지를 FX3가 USB로 다운로드할 수 있는 구조로 변경하는 elf2img 파일을 찾을 수 없다고 나온다.

 

옵션을 보면 " "안에 설정되어 있는데 ""를 제거 해 주니 문제없이 동작한다.

"${FX3_INSTALL_PATH}\util\elf2img\elf2img.exe" -i ${ProjName}.elf -o ${ProjName}.img

 

-> ${FX3_INSTALL_PATH}\util\elf2img\elf2img.exe -i ${ProjName}.elf -o ${ProjName}.img

 

 

 

 

 

이제 컴파일 하면 정상적으로 컴파일되는것을 확인할 수 있다.

 

 

 

 

[FX2 EVM] HighSpeed USB Bulk 전송 테스트 - USB를 이용한 이미지 출력

 

FX2는 USB2.0 Hispeed 를 지원하므로 TFT LCD에 이미지 출력하는 예제는 USB전송 속도 테스트 하기에 좋다.
USB Hispeed는 한번에 512Byte를 전송할 수 있으므로 확실히 속도차이를 볼 수 있다.
하지만 8051코어라 이미지 출력을 GPIO로 하다보니 전송속도는 빠르지만 TFT LCD출력이 느리다. 추후 GPIF나 BUS방식으로 LCD를 제어하면 좀더 빠른 속도를 볼수 있을것 같다.

USB로 이미지 전송 테스트 동영상




참고로 STM32를 이용하여 USB로 이미지 전송하는 예제와 비교하면 확실히 전송속도 차이를 확인할 수 있다.



Hispeed USB Bulk 이미지 전송 PC 프로그램

[FX2 EVM] Ez-USB CY7C68013 TFT LCD 테스트



[FX2 EVM] 보드는 M-Type의 핀맵으로 [EXP-LCD]보드에 연결하여 TFT-LCD 를 테스트 할 수 있다.

FX2 EVM 핀맵




EXP-LCD 핀맵



[FX2 EVM] TFT LCD 드라이버 코드
 원래 8051의 페리 속도가 느리고, 특히나 PORTE는 비트제어 명령이 지원되지 않기 때문에 Address로 접근해야 해서 속도가 더 느려지는것 같다.

//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_HD66791     0
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      BIT8
#define LCD_LAT_PORT     

#define LCD_LAT_ON()     
#define LCD_LAT_OFF()     
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT5
#define LCD_EN_PORT      
#define LCD_ENABLE()     Cbi(IOE, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(IOE, LCD_EN_BIT)

#define LCD_RST_BIT      BIT2
#define LCD_RST_PORT     
#define LCD_RST_ON()     PE2 = 1
#define LCD_RST_OFF()     PE2 = 0

#define LCD_RS_BIT      BIT3
#define LCD_RS_PORT      
#define LCD_RS_OFF()     Cbi(IOE, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(IOE, LCD_RS_BIT)

#define LCD_WR_BIT      BIT5
#define LCD_WR_PORT      
#define LCD_WR_OFF()     PA5 = 0
#define LCD_WR_ON()      PA5 = 1

#define LCD_RD_BIT      BIT4
#define LCD_RD_PORT      
#define LCD_RD_OFF()     PA4 = 0
#define LCD_RD_ON()      PA4 = 1

#define LCD_BL_BIT      BIT4
#define LCD_BL_PORT      
#define LCD_BL_OFF()     Cbi(IOE, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(IOE, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data)    IOB=Data&0xFF;IOD=(Data>>8);
          
#define TFTGpioInit()     OEB=0xFF;OED=0xFF;\
          PORTECFG = 0;OEE=0xFF;PORTACFG = 0;OEA=0xFF;
//-----------------------------------------------------------------------------




[FX2 EVM] TFT LCD테스트 동영상
한프레임 출력하는데 220ms정도 걸린다.. 너무 느리다. GPIF모드나 BUS모드로 테스트 해 봐야 할것 같다. FPGA를 이용해 FX2는 USB데이터를 받아서 버퍼에 저장하고 LCD제어는 다른 MCU에서 처리하도록 해야 할것 같다.


[FX2 EVM] 8051에서 unsigned long사용시 주의

테스트 하는중에 코드량이 좀 늘어니 이상한 동작을 하는경우가 발생한다. 코드가 멈추거나 리셋 되는 현상이 있다.
Delay 함수를 쓰고나면 이상한 동작을 한다.

system.c 에 있는 Delay() 함수는 아래와 같고 지금까지 잘 사용 했었는데...
void Delay(unsigned long Time)
{
 volatile unsigned int delay = 0;

 for(; Time != 0; Time--)
 {
  for(delay=0;delay<800;delay++);
 };
}

FX2의 코어는 8비트 8051이므로 혹시나 long 타입이 문제가 아닐까 싶어 unsigned int로 변경해 보았는데.. 잘 동작한다.
옵티마이즈 수정을 좀 하긴했는데.. 컴파일러의 문제 인지..?
 -> 옵티마이즈 문제는 아닌것 같다.

아무튼 long을 사용하지 않고 unsigned int로 하니 잘 동작한다.
[FX2 EVM] CY7C68013 USB 벌크 전송 테스트



FX2 Ez-USB를 이용하여 USB Bulk전송 테스트를 해 보았다.

먼저 CY7C68013쪽 펌웨어 에서 TD_Pool() 함수를 수정하여 USB로 데이터를 수신하거나 전송할 수 있다.
아래 코드는 USB로 PC에서 받은 데이터를 처리하는 부분이다. 주석을 보면 쉽게 이해할 수 있다.
void TD_Poll(void)
{
 WORD i;
 WORD count;

 //EndPoint로 데이터가 들어오면
 if(!(EP2468STAT & bmEP2EMPTY))
 {
  //받은 데이터가 들어 있는 포인터의 주소를 Auto Buffer1로 할당한다.
  APTR1H = MSB( &EP2FIFOBUF );
  APTR1L = LSB( &EP2FIFOBUF );

  //내가 사용할 메모리의 주소를 Auto Buffer2에 할당
  AUTOPTRH2 = MSB( &Receive_Buffer );  
  AUTOPTRL2 = LSB( &Receive_Buffer ); 

  //전송된 데이터 수 저장
  count = (EP2BCH << 8) + EP2BCL;
  DebugPrint("EP2 read: Size=%d.\r\n", count);

  //내가 설정한 메모리로 저장
  for(i=0; i<count; i++)
  {
     EXTAUTODAT2 = EXTAUTODAT1; 
  }

  //데이터 처리
  PorcessUsbEP2(Receive_Buffer, count)

  SYNCDELAY;                   
  EP2BCL = 0x80;          // re(arm) EP2OUT
 }

:

//데이터 전송 처리




FX2 Ez-USB BULK테스트 PC프로그램



Cypress API를 이용하면 쉽게 PC프로그램을 작성할 수 있다.

API를 사용하려면 DDK가 필요하다.




FX2 USB BULK 테스트 프로그램 소스코드
void main(void)
{
 SystemInit();

 Led1Init();
 Led1Off();
 Led2Init();
 Led2Off();
 Led3Init();
 Led3Off();

 DebugInit(BAUD_38400);
 DebugPrint("FX2 EVM CY7C68013 USB BULK Test.\r\n");
 
 // Initialize user device
 TD_Init();

 EZ-USB_Init();

 while(TRUE)
 {
  // Poll User Device
  TD_Poll();
  EZ_USB_CtrlProcess();
 }
}



 

TAG CY7C68013, FX2, USB

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)