USB论坛
直播中

李猛

8年用户 1604经验值
私信 关注
[问答]

如何通过上位机控制CYUSB3014的指定管脚实现类似功能?

我们原来使用CY7C68013A实现了上位机与FPGA之间双向通信,通过控制端点可以实现对诸如CY7C68013A上的PA0等管脚进行控制以便FPGA识别接收或发送数据,请问如何通过上位机控制CYUSB3014的指定管脚实现类似功能?谢谢!

回帖(1)

洪茗苞

2025-5-15 17:33:07

要通过上位机控制CYUSB3014(EZ-USB FX3)的指定GPIO管脚,实现类似CY7C68013A的控制功能,可以按照以下步骤进行:




1. 硬件与开发环境准备



  • 硬件连接:确认FX3的GPIO引脚与FPGA的连接关系(如GPIO[25]对应物理引脚XX)。

  • 开发工具:安装FX3 SDK(Cypress Suite USB 3.4.7或更新版本)、EZ-USB Configuration Utility。

  • 上位机库:使用libusb或Cypress提供的CyAPI(C++库)进行通信。




2. GPIO配置与固件开发


(1) 初始化GPIO


在FX3固件(CyFxApplication.c)中配置GPIO为输出模式:


#include "cyu3gpio.h"
CyU3PReturnStatus_t status;
// 初始化GPIO 25为输出
status = CyU3PGpioInit();
status = CyU3PGpioSetSimpleConfig(25, CY_U3P_GPIO_DIR_OUTPUT, CY_U3P_GPIO_INT_NONE, 0);

(2) 注册控制端点回调


FX3默认提供一个控制端点(Endpoint 0),用于处理USB控制请求。在固件中注册回调函数:


void ControlEndpointCallback(uint32_t eventType, uint32_t eventParam, uint8_t *pData, uint16_t dataLen) {
    if (eventType == CY_U3P_USB_EVENT_SETUP) {
        // 解析Setup包
        CyU3PUsbSetup_t *setup = (CyU3PUsbSetup_t *)pData;
        if (setup->bRequest == 0x01) {  // 自定义请求码
            uint8_t pin = setup->wValue & 0xFF;  // 引脚号
            uint8_t val = (setup->wValue >> 8) & 0xFF;  // 电平值
            CyU3PGpioSetValue(pin, val);  // 设置GPIO电平
            CyU3PUsbAckSetup();  // 确认请求
        }
    }
}

// 在main函数中注册回调
CyU3PUsbRegisterSetupCallback(ControlEndpointCallback, CyTrue);



3. 上位机控制实现


(1) 使用CyAPI(C++)发送控制请求


#include "CyAPI.h"
// 初始化设备
CCyUSBDevice usb;
if (usb.DeviceCount() == 0) return;

// 发送控制请求:bmRequestType=0x40(厂商请求), bRequest=0x01, wValue=(pin << 8 | val)
UCHAR pin = 25;  // 控制GPIO25
UCHAR val = 1;  // 高电平
usb.ControlEndpt->Target = TGT_DEVICE;
usb.ControlEndpt->ReqType = REQ_VENDOR;
usb.ControlEndpt->Direction = DIR_TO_DEVICE;
usb.ControlEndpt->ReqCode = 0x01;
usb.ControlEndpt->Value = (val << 8) | pin;
usb.ControlEndpt->Index = 0;
usb.ControlEndpt->Send(nullptr, 0);

(2) 使用Python + libusb


import usb.core

dev = usb.core.find(idVendor=0x04B4, idProduct=0x00F1)
if dev is None: raise ValueError("Device not found")

# 发送控制请求:bmRequestType=0x40, bRequest=0x01, wValue=(val << 8 | pin)
pin = 25
val = 1
dev.ctrl_transfer(0x40, 0x01, (val << 8) | pin, 0, None)



4. FPGA端检测逻辑



  • 将FX3的GPIO(如GPIO25)连接到FPGA的输入引脚。

  • FPGA持续监测该引脚电平变化:
    always @(posedge clk) begin
      if (fx3_gpio == 1'b1) begin
          // 触发数据接收/发送逻辑
      end
    end




关键注意事项



  1. GPIO映射:通过CyU3PGpioComplexConfig函数配置复杂引脚时需参考FX3芯片手册。

  2. 控制请求格式:自定义请求码(bRequest)需避免与标准USB请求冲突。

  3. 同步问题:若需高速控制,建议改用GPIF II接口或UART/I2C桥接。

  4. 驱动兼容性:FX3需加载Cypress提供的USB驱动(CyUSB3.sys)。




通过上述步骤,上位机可通过控制传输直接操作FX3的GPIO,实现与FPGA的握手控制,流程与CY7C68013A类似但需注意FX3的API差异。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分