FX3,CX3(Cyusb3014,cyusb3065等)是Cypress 公司集成了ARM9处理器的USB3.0外设控制器。
FX3 的并行和串行接口提供了与系统中其他设备的高速连接。
FX3设备在系统中的主要功能是在USB主机与外设(如摄像头或扫描仪)之间传输高带宽数据。强大的片上ARM9处理器使FX3能够进行访问数据流,并能高效地处理数据。在不要求FX3执行数据处理的系统中,ARM9固件仅初始化和管理USB和数据消耗/提供设备两个接口间的数据传输。
除了I2C、SPI、UART和I2S串行接口之外,FX3还有一个高度灵活的可编程接口,即第二代通用可编程接口(GPIF II)。通过可编程的GPIF II,FX3可以同各种设备(包括FPGA、图像传感器、ADC以及应用处理器)相连接。因此,在多种高性能USB 3.0应用中,FX3是一个优秀的控制器选择。
DMA
GPIF II是一种可编程的状态机,它所启用的灵活接口使用自己的高速时钟,完全独立于ARM9。
FX3集成了512 KB或256 KB的嵌入式SRAM(取决于所选择的设备型号),并支持四种启动代码的方法(USB、GPIF II、I2C或者SPI)。
CX3 = FX3 + MIPI(摄像头接口)
2. 程序流程:
main函数初始化时钟,IO口,
/* This is a non returnable call for initializing the RTOS kernel */
CyU3PKernelEntry ();
然后加入:
CyFxApplicationDefine()
此中创建IO线程,
–Thread: CyCx3UvcAppThread_Entry – CyCx3UvcApplnInit( usb_init;) CyCx3UvcApplnStart
low performance peripheral (LPP)
3 . GPIO settting
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);}/* Configure GPIO 45 as input with interrupt enabled for both edges */gpioConfig.outValue = CyTrue;gpioConfig.inputEn = CyTrue;gpioConfig.driveLowEn = CyFalse;gpioConfig.driveHighEn = CyFalse;gpioConfig.intrMode = CY_U3P_GPIO_INTR_BOTH_EDGE;apiRetStatus = CyU3PGpioSetSimpleConfig(45, &gpioConfig);if (apiRetStatus != CY_U3P_SUCCESS){/* Error handling */CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n",apiRetStatus);CyFxAppErrorHandler(apiRetStatus);}/* Override GPIO 21 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 (21, CyTrue);if (apiRetStatus != 0){/* Error Handling */CyU3PDebugPrint (4, "CyU3PDeviceGpioOverride failed, error code = %d\n",apiRetStatus);CyFxAppErrorHandler(apiRetStatus);}/* Configure GPIO 21 as output */gpioConfig.outValue = CyFalse;gpioConfig.driveLowEn = CyTrue;gpioConfig.driveHighEn = CyTrue;gpioConfig.inputEn = CyFalse;gpioConfig.intrMode = CY_U3P_GPIO_NO_INTR;apiRetStatus = CyU3PGpioSetSimpleConfig(21, &gpioConfig);if (apiRetStatus != CY_U3P_SUCCESS){/* Error handling */CyU3PDebugPrint (4, "CyU3PGpioSetSimpleConfig failed, error code = %d\n",apiRetStatus);CyFxAppErrorHandler(apiRetStatus);}
}
/* Wait for two seconds */CyU3PThreadSleep(2000);apiRetStatus = CyU3PGpioSetValue (21, CyFalse);
3 . Timer
static CyU3PTimer mpuTimer;
static void mpuAppProgressTimer (uint32_t arg)
{CyU3PDebugPrint (4, "Timer test...\r\n");// CyU3PTimerStart (&mpuTimer);//one shot 1694line
}// CyU3PTimerCreate (&mpuTimer, mpuAppProgressTimer, 0x00, TIMER_PERIOD, 1, CYU3P_AUTO_ACTIVATE);//thread.sleep(1);// CyU3PTimerStart (&mpuTimer);
4 . cyu3error.h 错误返回值宏定义,类似GetLastError 中的返回值。