这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:27AI8051的WINUSB实现过程;

共1条 1/1 1 跳转至

学习AI8051开发板例程:27AI8051的WINUSB实现过程;

高工
2026-02-06 20:13:00     打赏

一:WIN USB 的基本概念

    WinUSB 是 Windows 附带的通用驱动程序。 它允许你与 USB 设备通信,而无需编写自定义驱动程序。 使用此驱动程序可以节省时间、降低复杂性并确保不同 Windows 版本的兼容性。 

    易于使用:WinUSB 抽象化了 USB 通信中涉及的大部分复杂性,这使你能够更轻松地与 USB 设备交互。 无需自定义驱动程序:对于许多 USB 设备,可以直接使用 WinUSB,无需编写和维护自定义驱动程序。

二:使用WIN  USB的用途

    设备通信

    数据传输:使用批量、控制、中断或异时序传输向/从 USB 设备发送和接收数据。

    控制请求:发送控制请求以配置设备或检索信息。

    设备配置

    设置配置:选择配置、接口和备用设置以配置 USB 设备。

    终结点管理:管理数据传输的终结点。

    设备枚举

    设备标识:枚举和识别连接到系统的 USB 设备。

    描述符检索:检索设备描述符、配置描述符、接口描述符和终结点描述符。

    自定义应用程序

    用户模式应用程序:开发使用 WinUSB API 与 USB 设备通信的用户模式应用程序。

    固件更新:为 USB 设备实现固件更新机制。

    测试和调试

    原型制作:快速制作 USB 设备通信的原型,以测试硬件功能。

    调试:使用 WinUSB 调试主机和 USB 设备之间的通信问题。

三:代码如下所示:

3.1 usb 初始化 代码如下:

void usb_init()
{
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
    
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
    
    USBCLK = 0x00;
    USBCON = 0x90;

    usb_write_reg(FADDR, 0x00);
    usb_write_reg(POWER, 0x81);
    usb_write_reg(INTRIN1E, 0x3f);
    usb_write_reg(INTROUT1E, 0x3f);
    usb_write_reg(INTRUSBE, 0x07);
    usb_write_reg(POWER, 0x01);

    DeviceState = DEVSTATE_DEFAULT;
    Ep0State.bState = EPSTATE_IDLE;
    InEpState = 0x00;
    OutEpState = 0x00;

    UsbInBusy = 0;
    UsbOutBusy = 0;
    Rptr = 0;
    Wptr = 0;

    EUSB = 1;
}

3.2  USB的数据交互处理代码

void usb_vendor_polling()
{
    BYTE cnt;
    
    if (DeviceState != DEVSTATE_CONFIGURED)
        return;

    if (!UsbInBusy && (Rptr != Wptr))
    {
        EUSB = 0;
        UsbInBusy = 1;
        usb_write_reg(INDEX, 1);
        cnt = 0;
        while (Rptr != Wptr)
        {
            usb_write_reg(FIFO1, UsbBuffer[Rptr++]);
            cnt++;
            if (cnt == EP1IN_SIZE) break;
        }
        usb_write_reg(INCSR1, INIPRDY);
        EUSB = 1;
    }
    
    if (UsbOutBusy)
    {
        EUSB = 0;
        if (Wptr - Rptr < 256 - EP1OUT_SIZE)
        {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 1);
            usb_write_reg(OUTCSR1, 0);
        }
        EUSB = 1;
    }
}

四:实测代码如下所示:





关键词: AI8051     WINUSB    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]