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

共1条 1/1 1 跳转至

学习AI8051开发板例程:25AI8051的USB转CDC实现过程

高工
2026-02-05 19:27:52     打赏

   一:CDC协议

     CDC协议是通讯设备类的通用协议。官网上的CDC范例模拟的是CDC协议中的通讯接口类(02)和数据接口类(Oa),在PC上的用户界面就是串口,设备挂载在windows的“usbsersys”通用驱动程序上。使用普通串口助手,选择其中的“COMx”端口即可与CDC设备进行数据传输。

    如果CDC设备当作Bridge(USB转串口桥接器),则上位机驱动传下来的波特率、校验位、停止位等参数均需要进行处理,然后将上位机传下来的数据再通过正确的波特率、校验位、停止位等格式将

    串口数据下传到第三方器件。如果CDC设备只是作为普通的USB设备,直接PC进行数据传输,则可完全不用处理波特率、校验位、停止位等参数,此时CDC设备与PC之间的数据传输完全不会受到串口波特率的影响。实际测试的数据传输平均比特率可达2~4MBPS。

二:AI8051的USB转CDC

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, 0x08);
    usb_write_reg(INTRIN1E, 0x3f);
    usb_write_reg(INTROUT1E, 0x3f);
    usb_write_reg(INTRUSBE, 0x07);
    usb_write_reg(POWER, 0x00);

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

    UsbInBusy = 0;
    UsbOutBusy = 0;
    RxRptr = 0;
    RxWptr = 0;
    TxRptr = 0;
    TxWptr = 0;

    EUSB = 1;
}

三:串口2的初始化,用来转发CDC的数据

void uart_init()
{
    S2_S = 1;
    P4M0 &= ~0x0c;
    P4M1 &= ~0x0c;

    S2CON = 0x50;
    T2L = BR(115200);
    T2H = BR(115200) >> 8;
    T2x12 = 1;
    T2R = 1;
    PS2 = 1;    //提高串口2中断优先级,防止数据丢失
    ES2 = 1;

    LineCoding.dwDTERate = 0x00c20100;  //115200
    LineCoding.bCharFormat = 0;
    LineCoding.bParityType = 0;
    LineCoding.bDataBits = 8;
}

四:USB转CDC 与串口2的数据之间的互传过程:

void uart_polling()
{
    BYTE dat;
    BYTE cnt;

    if (DeviceState != DEVSTATE_CONFIGURED)
        return;

    if (!UsbInBusy && (TxRptr != TxWptr))
    {
        EUSB = 0;
        UsbInBusy = 1;
        usb_write_reg(INDEX, 1);
        cnt = 0;
        while (TxRptr != TxWptr)
        {
            usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
            cnt++;
            if (cnt == EP1IN_SIZE) break;
        }
        usb_write_reg(INCSR1, INIPRDY);
        EUSB = 1;
    }

    if (!UartBusy && (RxRptr != RxWptr))
    {
        dat = RxBuffer[RxRptr++];
        UartBusy = 1;
        switch (LineCoding.bParityType)
        {
        case NONE_PARITY:
        case SPACE_PARITY:
            S2TB8 = 0;
            break;
        case ODD_PARITY:
            ACC = dat;
            S2TB8 = !P;
            break;
        case EVEN_PARITY:
            ACC = dat;
            S2TB8 = P;
            break;
        case MARK_PARITY:
            S2TB8 = 1;
            break;
        }
        S2BUF = dat;

        while (UartBusy);
    }

    if (UsbOutBusy)
    {
        EUSB = 0;
        if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
        {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 1);
            usb_write_reg(OUTCSR1, 0);
        }
        EUSB = 1;
    }
}

五:实物演示如下:

ai25-1.png





关键词: AI8051     USB    

共1条 1/1 1 跳转至

回复

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